From bce4d8ad5901e1cb8743bc2ae74c5e2c3e00109a Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 4 Dec 2018 18:32:17 +0100 Subject: [PATCH 0001/1043] improved flow typing, improved tslint --- CHANGELOG.md | 1241 ++++++++++++++++++++++++----------------------- package.json | 3 +- src/api/flow.ts | 69 +-- src/mobx.ts | 5 +- tslint.json | 56 +-- yarn.lock | 5 + 6 files changed, 683 insertions(+), 696 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 120ab0c33..aa9631203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,77 +1,78 @@ -# 5.7.0 / 4.7.0 +* Improved flow support in typescript. It will now infer arguments and return values correctly. The only exception is that when the `flow` wrapped function returns a `Promise` then it should `return castFlowReturn(somePromise)` to keep the type inference happy. -* Upgraded typings to TypeScript 3 -* Fixed [#1742](https://github.com/mobxjs/mobx/issues/1742), change detection fails when multiple mobx instances were active. -* Fixed [#1624](https://github.com/mobxjs/mobx/issues/1624), use built-in flow types for iterators -* Fixed [#1777](https://github.com/mobxjs/mobx/issues/1777) through [#1826](https://github.com/mobxjs/mobx/pull/1826), stack overflow exception, in development mode, when using `@computed` on a React component. The MobX 5 behavior here has been reverted to the MobX 4 behavior. +# 5.7.0 / 4.7.0 +* Upgraded typings to TypeScript 3 +* Fixed [#1742](https://github.com/mobxjs/mobx/issues/1742), change detection fails when multiple mobx instances were active. +* Fixed [#1624](https://github.com/mobxjs/mobx/issues/1624), use built-in flow types for iterators +* Fixed [#1777](https://github.com/mobxjs/mobx/issues/1777) through [#1826](https://github.com/mobxjs/mobx/pull/1826), stack overflow exception, in development mode, when using `@computed` on a React component. The MobX 5 behavior here has been reverted to the MobX 4 behavior. # 5.6.0 / 4.6.0 -* `keepAlive` has become smarter and won't recomputed computed values that are kept alive, as long as they aren't read. Implements [#1534](https://github.com/mobxjs/mobx/issues/1534) -* Fixed [#1796](https://github.com/mobxjs/mobx/issues/1796), undeleting a property that had an initial value of `undefined` was undetected -* Improved Flow typings, see [#1794](https://github.com/mobxjs/mobx/pull/1794) and [#1786](https://github.com/mobxjs/mobx/pull/1786) +* `keepAlive` has become smarter and won't recomputed computed values that are kept alive, as long as they aren't read. Implements [#1534](https://github.com/mobxjs/mobx/issues/1534) +* Fixed [#1796](https://github.com/mobxjs/mobx/issues/1796), undeleting a property that had an initial value of `undefined` was undetected +* Improved Flow typings, see [#1794](https://github.com/mobxjs/mobx/pull/1794) and [#1786](https://github.com/mobxjs/mobx/pull/1786) # 5.5.2 / 4.5.2 -* Fixed bug in `toJS` not handling `null` values correctly. Fixes [#1557](https://github.com/mobxjs/mobx/issues/1557) through [#1783](https://github.com/mobxjs/mobx/pull/1783) by [@wangyiz4262](https://github.com/wangyiz4262) +* Fixed bug in `toJS` not handling `null` values correctly. Fixes [#1557](https://github.com/mobxjs/mobx/issues/1557) through [#1783](https://github.com/mobxjs/mobx/pull/1783) by [@wangyiz4262](https://github.com/wangyiz4262) # 5.5.1 / 4.5.1 -* `toJS` now has a `recurseEverything` everything option, that even detects and converts observable objects that are "behind" non-observable objects. See [#1699](https://github.com/mobxjs/mobx/pull/1699) by [wangyiz4262](https://github.com/wangyiz4262) -* Added flow typings form `comparer`, see [#1751](https://github.com/mobxjs/mobx/pull/1752) by [pdong](https://github.com/pdong) -* Update flow typings for configuration options, [#1772](https://github.com/mobxjs/mobx/pull/1772) by [alexandersorokin](https://github.com/alexandersorokin) +* `toJS` now has a `recurseEverything` everything option, that even detects and converts observable objects that are "behind" non-observable objects. See [#1699](https://github.com/mobxjs/mobx/pull/1699) by [wangyiz4262](https://github.com/wangyiz4262) +* Added flow typings form `comparer`, see [#1751](https://github.com/mobxjs/mobx/pull/1752) by [pdong](https://github.com/pdong) +* Update flow typings for configuration options, [#1772](https://github.com/mobxjs/mobx/pull/1772) by [alexandersorokin](https://github.com/alexandersorokin) # 5.5.0 / 4.5.0 (Minor version of `5` was bumped significantly to make the number better correlate together :-)) -* Fixed [#1740](https://github.com/mobxjs/mobx/issues/1740): combining decorators and `extendObservable` in a class constructor caused errors to be thrown -* Fixed [#1739](https://github.com/mobxjs/mobx/issues/1740): - * Proxies: `delete`-ing a property was not always picked up by the reactivity system - * Non-proxies: `remove()`-ing a property was not always picked up by the `has()` and `get()` utilities - * `has` now returns `true` for computed fields - * `get` now returns a value for computed fields -* Introduced `_allowStateChangeInsideComputed`. Don't use it :-). -* MobX is now transpiled using babel 7 +* Fixed [#1740](https://github.com/mobxjs/mobx/issues/1740): combining decorators and `extendObservable` in a class constructor caused errors to be thrown +* Fixed [#1739](https://github.com/mobxjs/mobx/issues/1740): + * Proxies: `delete`-ing a property was not always picked up by the reactivity system + * Non-proxies: `remove()`-ing a property was not always picked up by the `has()` and `get()` utilities + * `has` now returns `true` for computed fields + * `get` now returns a value for computed fields +* Introduced `_allowStateChangeInsideComputed`. Don't use it :-). +* MobX is now transpiled using babel 7 # 5.1.2 / 4.4.2 -* Fixed [#1650](https://github.com/mobxjs/mobx/issues/1650), decorating fields with the name `toString` does not behave correctly. +* Fixed [#1650](https://github.com/mobxjs/mobx/issues/1650), decorating fields with the name `toString` does not behave correctly. # 5.1.1 / 4.4.1 -* Improved typings of `decorate`, see [#1711](https://github.com/mobxjs/mobx/pull/1711) by [makepost](https://github.com/makepost) +* Improved typings of `decorate`, see [#1711](https://github.com/mobxjs/mobx/pull/1711) by [makepost](https://github.com/makepost) # 5.1.0 / 4.4.0 -* Improved handling of multiple MobX instances. MobX will no longer complain about being loaded multiple times (one should still prevent it though, to prevent blowing up bundle size!), but merge internal state by default. If multiple MobX versions need to be loaded, call `configure({ isolateGlobalState: true })`. Note that this means that observables from the different MobX instances won't cooperate. Fixes [#1681](https://github.com/mobxjs/mobx/issues/1681), [#1082](https://github.com/mobxjs/mobx/issues/1082) -* `enforceActions` options now supports the values: `"never"`, `"observed"` and `"always"` to make the behavior more clear. Fixes [#1680](https://github.com/mobxjs/mobx/issues/1680), [#1473](https://github.com/mobxjs/mobx/issues/1473) +* Improved handling of multiple MobX instances. MobX will no longer complain about being loaded multiple times (one should still prevent it though, to prevent blowing up bundle size!), but merge internal state by default. If multiple MobX versions need to be loaded, call `configure({ isolateGlobalState: true })`. Note that this means that observables from the different MobX instances won't cooperate. Fixes [#1681](https://github.com/mobxjs/mobx/issues/1681), [#1082](https://github.com/mobxjs/mobx/issues/1082) +* `enforceActions` options now supports the values: `"never"`, `"observed"` and `"always"` to make the behavior more clear. Fixes [#1680](https://github.com/mobxjs/mobx/issues/1680), [#1473](https://github.com/mobxjs/mobx/issues/1473) # 5.0.5 -* Fixed [#1667](https://github.com/mobxjs/mobx/issues/1667): creating a large array could result in undefined items (MobX 4.* was not affected) +* Fixed [#1667](https://github.com/mobxjs/mobx/issues/1667): creating a large array could result in undefined items (MobX 4.\* was not affected) # 4.3.2 / 5.0.4 -* Fixed [#1685](https://github.com/mobxjs/mobx/issues/1685): expose `IAutorunOptions` -* `decorate` now can apply multiple decorators, by accepting an array and applying them right to left: `decorate(Todo, { title: [serializable(primitive), persist('object'), observable] })`. By [@ramybenaroya](https://github.com/ramybenaroya) through [#1691](https://github.com/mobxjs/mobx/pull/1691) and [#1686](https://github.com/mobxjs/mobx/pull/1686) -* Improved typings of `flow` so that it accepts async generators. By [@dannsam](https://github.com/dannsam) through [#1656](https://github.com/mobxjs/mobx/pull/1656) and [#1655](https://github.com/mobxjs/mobx/pull/1655) -* `keys()` now also supports arrays. Fixes [#1600](https://github.com/mobxjs/mobx/pull/1600) through [#1601](https://github.com/mobxjs/mobx/pull/1601) by [@nunocastromartins](https://github.com/nunocastromartins) +* Fixed [#1685](https://github.com/mobxjs/mobx/issues/1685): expose `IAutorunOptions` +* `decorate` now can apply multiple decorators, by accepting an array and applying them right to left: `decorate(Todo, { title: [serializable(primitive), persist('object'), observable] })`. By [@ramybenaroya](https://github.com/ramybenaroya) through [#1691](https://github.com/mobxjs/mobx/pull/1691) and [#1686](https://github.com/mobxjs/mobx/pull/1686) +* Improved typings of `flow` so that it accepts async generators. By [@dannsam](https://github.com/dannsam) through [#1656](https://github.com/mobxjs/mobx/pull/1656) and [#1655](https://github.com/mobxjs/mobx/pull/1655) +* `keys()` now also supports arrays. Fixes [#1600](https://github.com/mobxjs/mobx/pull/1600) through [#1601](https://github.com/mobxjs/mobx/pull/1601) by [@nunocastromartins](https://github.com/nunocastromartins) # 5.0.3 -* Fixed issue where it was no longer possible to define custom properties on observable arrays +* Fixed issue where it was no longer possible to define custom properties on observable arrays # 5.0.2 -* Fixed issue where iterators where not compiled to ES5, breaking the ES5 based builds. +* Fixed issue where iterators where not compiled to ES5, breaking the ES5 based builds. # 5.0.1 (Unpublished) -* Fixed regression bug: `ObservableMap.size` was no longer observable. Fixes [#1583](https://github.com/mobxjs/mobx/issues/1583) -* Downgraded lib export from ES6 to ES5. To many build tools still trip over ES6. Fixes [#1584](https://github.com/mobxjs/mobx/issues/1584). A modern build is available through `import ... from "mobx/lib/mobx.es6"` (or setup an alias in your build system) -* Added support for mobx-react-devtools +* Fixed regression bug: `ObservableMap.size` was no longer observable. Fixes [#1583](https://github.com/mobxjs/mobx/issues/1583) +* Downgraded lib export from ES6 to ES5. To many build tools still trip over ES6. Fixes [#1584](https://github.com/mobxjs/mobx/issues/1584). A modern build is available through `import ... from "mobx/lib/mobx.es6"` (or setup an alias in your build system) +* Added support for mobx-react-devtools # 5.0.0 @@ -81,119 +82,118 @@ MobX 5 is the first MobX version fully leveraging Proxies. This has two big advantages -1. MobX can now detect the addition of properties on plain observable objects, so it is now possible to use plain observable objects as dynamic collections. -2. Observable arrays are now recognized as arrays by all third party libraries, which will avoid the need to slice them. +1. MobX can now detect the addition of properties on plain observable objects, so it is now possible to use plain observable objects as dynamic collections. +2. Observable arrays are now recognized as arrays by all third party libraries, which will avoid the need to slice them. ### The system requirements to run MobX has been upped -* MobX 5 can only be used on environments that support `Proxies`. In practice this means, no Internet Explorer (Edge is fine). No nodejs < 6. React Native on Android only when JavaScript core is [upgraded](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). All modern browsers are supported. -* Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. -* If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. -* The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. +* MobX 5 can only be used on environments that support `Proxies`. In practice this means, no Internet Explorer (Edge is fine). No nodejs < 6. React Native on Android only when JavaScript core is [upgraded](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). All modern browsers are supported. +* Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. +* If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. +* The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. ### Breaking changes -* The required runtime needs to support the non-polyfillable `Proxy` API. -* The minimum runtime target is now ES2015, not ES5 -* `spy` has become a no-op in production builds -* All earlier deprecated APIs are dropped. Make sure to not have any deprecation warnings before upgrading. -* `array.move` and `array.peek` are removed from the API -* Dropped the third argument to `array.find` and `array.findIndex` since they were not standardized in ES. -* `.$mobx` property has been dropped from all observables and replaced by a Symbol. Instead of using `x.$mobx.name`, use `import { $mobx } from "mobx"; x[$mobx].name` etc. -* In some cases, the order in which autoruns are fired could have changed due to some internal optimizations (note that MobX never had a guarantee about the order in which autoruns fired!) +* The required runtime needs to support the non-polyfillable `Proxy` API. +* The minimum runtime target is now ES2015, not ES5 +* `spy` has become a no-op in production builds +* All earlier deprecated APIs are dropped. Make sure to not have any deprecation warnings before upgrading. +* `array.move` and `array.peek` are removed from the API +* Dropped the third argument to `array.find` and `array.findIndex` since they were not standardized in ES. +* `.$mobx` property has been dropped from all observables and replaced by a Symbol. Instead of using `x.$mobx.name`, use `import { $mobx } from "mobx"; x[$mobx].name` etc. +* In some cases, the order in which autoruns are fired could have changed due to some internal optimizations (note that MobX never had a guarantee about the order in which autoruns fired!) ### New features -* It is possible to pass the `proxy: false` argument to `observable.object` to disable proxying (theoretically slightly faster, but removes no dynamic key addition) +* It is possible to pass the `proxy: false` argument to `observable.object` to disable proxying (theoretically slightly faster, but removes no dynamic key addition) ### Known Issues -* Observable objects can no longer be frozen (otherwise they would become un-observable😎). If you are actually trying to do so MobX will now throw an exception like: `[mobx] Dynamic observable objects cannot be frozen]`. A place where that might happen unexpectedly is when passing an observable object as `style` property to a React component. Like ``, since React will freeze all style objects. The work-around is to simply pass a fresh, non-observable object for styling like: ``. -* ~~If you are using `mobx` with `mobx-react`, and you are upgrading `mobx-react` to the MobX 5 compatible version (`mobx-react@5.2.0`) you will notice that `this.props` or `this.state` are not yet observable in the `constructor` or `componentWillMount`. This is for forward compatibility with React 16.3 where `componentWillMount` has been deprecated. In most cases using `componentDidMount` instead will suffice, especially when the goal is to setup reactions. For more info see [#478](https://github.com/mobxjs/mobx-react/issues/478).~~ Fixed in mobx-react 5.2.1. But note that you should still migrate away from `componentWillMount`😎. -* Jest `toEqual` might throw an error `allKeys[x].match is not a function` when trying to equal observable arrays. This is a bug in Jest [report](https://github.com/facebook/jest/issues/6398). The simple work around for now is to slice (or `toJS` if the problem is recursive) the array first. -* Jest `toEqual` matcher might no longer correctly equal your class instances, complaining about differences in the MobX adminstration. This is due to a bug with the processing of symbols: [report](https://github.com/facebook/jest/issues/6392). For now you might want to use a custom matcher if you are directly equalling observable objects. As a work around `toJS(object)` could be used before diffing. +* Observable objects can no longer be frozen (otherwise they would become un-observable😎). If you are actually trying to do so MobX will now throw an exception like: `[mobx] Dynamic observable objects cannot be frozen]`. A place where that might happen unexpectedly is when passing an observable object as `style` property to a React component. Like ``, since React will freeze all style objects. The work-around is to simply pass a fresh, non-observable object for styling like: ``. +* ~~If you are using `mobx` with `mobx-react`, and you are upgrading `mobx-react` to the MobX 5 compatible version (`mobx-react@5.2.0`) you will notice that `this.props` or `this.state` are not yet observable in the `constructor` or `componentWillMount`. This is for forward compatibility with React 16.3 where `componentWillMount` has been deprecated. In most cases using `componentDidMount` instead will suffice, especially when the goal is to setup reactions. For more info see [#478](https://github.com/mobxjs/mobx-react/issues/478).~~ Fixed in mobx-react 5.2.1. But note that you should still migrate away from `componentWillMount`😎. +* Jest `toEqual` might throw an error `allKeys[x].match is not a function` when trying to equal observable arrays. This is a bug in Jest [report](https://github.com/facebook/jest/issues/6398). The simple work around for now is to slice (or `toJS` if the problem is recursive) the array first. +* Jest `toEqual` matcher might no longer correctly equal your class instances, complaining about differences in the MobX adminstration. This is due to a bug with the processing of symbols: [report](https://github.com/facebook/jest/issues/6392). For now you might want to use a custom matcher if you are directly equalling observable objects. As a work around `toJS(object)` could be used before diffing. _Note June 7th, 2018:_ Both issues are already in Jest master and should be released soon. ### Migration guide -* Make sure to not use any API that produces deprecation warnings in MobX 4. Beyond that MobX 5 should pretty well as drop-in replacement of MobX 4. -* You _could_ perform the following clean ups: - * Don't `slice()` arrays when passing them to external libraries. (Note you still shouldn't pass observable data structures to non-`observer` React components, which is an orthogonal concept) - * You could replace observable maps with observable objects if you are only using string-based keys. -* Don't call the `reverse` or `sort` operations directly on observableArray's anymore, as it's behavior slightly differed from the built-in implementations of those methods. Instead use `observableArray.slice().sort()` to perform the sort on a copy. This gives no additional performance overhead compared to MobX 4. (The reason behind this is that built-in `sort` updates the array in place, but the observable array implementation always performed the sort on a defensive copy, and this change makes that explicit). - +* Make sure to not use any API that produces deprecation warnings in MobX 4. Beyond that MobX 5 should pretty well as drop-in replacement of MobX 4. +* You _could_ perform the following clean ups: + * Don't `slice()` arrays when passing them to external libraries. (Note you still shouldn't pass observable data structures to non-`observer` React components, which is an orthogonal concept) + * You could replace observable maps with observable objects if you are only using string-based keys. +* Don't call the `reverse` or `sort` operations directly on observableArray's anymore, as it's behavior slightly differed from the built-in implementations of those methods. Instead use `observableArray.slice().sort()` to perform the sort on a copy. This gives no additional performance overhead compared to MobX 4. (The reason behind this is that built-in `sort` updates the array in place, but the observable array implementation always performed the sort on a defensive copy, and this change makes that explicit). ### API's that have been dropped -* The `arrayBuffer` setting is no longer supported by `configure` (it has become irrelevant) -* `observable.shallowBox`, `observable.shallowArray`, `observable.shallowMap`, `observable.shallowObject`, `extendShallowObservable` api's have been removed. Instead, pass `{ deep: false }` to their non-shallow counter parts. -* `observableArray.peek`, `observableArray.move` +* The `arrayBuffer` setting is no longer supported by `configure` (it has become irrelevant) +* `observable.shallowBox`, `observable.shallowArray`, `observable.shallowMap`, `observable.shallowObject`, `extendShallowObservable` api's have been removed. Instead, pass `{ deep: false }` to their non-shallow counter parts. +* `observableArray.peek`, `observableArray.move` # 4.3.1 -* Fixed [#1534](Fixes https://github.com/mobxjs/mobx/issues/1534): @computed({keepAlive: true}) no long calculates before being accessed. -* Added the `$mobx` export symbol for MobX 5 forward compatibity +* Fixed [#1534](Fixes https://github.com/mobxjs/mobx/issues/1534): @computed({keepAlive: true}) no long calculates before being accessed. +* Added the `$mobx` export symbol for MobX 5 forward compatibity # 4.3.0 -* Introduced the `entries(observable)` API, by @samjacobclift through [#1536](https://github.com/mobxjs/mobx/pull/1536) -* Fixed [#1535](https://github.com/mobxjs/mobx/issues/1535): Change in nested computed value was not propagated if read outside action context when there is a pending reaction. For more details see the exact test case. -* Illegal property access through prototypes is now a warning instead of an error. Fixes [#1506](https://github.com/mobxjs/mobx/issues/1506). By @AmazingTurtle through [#1529](https://github.com/mobxjs/mobx/pull/1529) -* Fixed issue where providing a custom setter to `@computed({ set: ... })` wasn't picked up -* Fixed #1545: Actions properties where not re-assignable when using TypeScript -* Illegal Access checks are now a warning instead of an error. Fix +* Introduced the `entries(observable)` API, by @samjacobclift through [#1536](https://github.com/mobxjs/mobx/pull/1536) +* Fixed [#1535](https://github.com/mobxjs/mobx/issues/1535): Change in nested computed value was not propagated if read outside action context when there is a pending reaction. For more details see the exact test case. +* Illegal property access through prototypes is now a warning instead of an error. Fixes [#1506](https://github.com/mobxjs/mobx/issues/1506). By @AmazingTurtle through [#1529](https://github.com/mobxjs/mobx/pull/1529) +* Fixed issue where providing a custom setter to `@computed({ set: ... })` wasn't picked up +* Fixed #1545: Actions properties where not re-assignable when using TypeScript +* Illegal Access checks are now a warning instead of an error. Fix # 4.2.1 -* Fixed flow typings for `mobx.configure` [#1521](https://github.com/mobxjs/mobx/pull/1521) by @andrew--r -* Improved typings for `mobx.flow`, fixes [#1527](https://github.com/mobxjs/mobx/issues/1527) -* Throw error when using `@observable` in combination with a getter. [#1511](https://github.com/mobxjs/mobx/pull/1511) by @quanganhtran -* `toJS` now uses Map internally, for faster detection of cycles. [#1517](https://github.com/mobxjs/mobx/pull/1517) by @loatheb -* Fixed [#1512](https://github.com/mobxjs/mobx/issues/1512): `observe` hooks not being triggered when using `mobx.set`, Fixed in [#1514](https://github.com/mobxjs/mobx/pull/1514) by @quanganhtran -* Several minor improvements, additional tests and doc improvements. +* Fixed flow typings for `mobx.configure` [#1521](https://github.com/mobxjs/mobx/pull/1521) by @andrew--r +* Improved typings for `mobx.flow`, fixes [#1527](https://github.com/mobxjs/mobx/issues/1527) +* Throw error when using `@observable` in combination with a getter. [#1511](https://github.com/mobxjs/mobx/pull/1511) by @quanganhtran +* `toJS` now uses Map internally, for faster detection of cycles. [#1517](https://github.com/mobxjs/mobx/pull/1517) by @loatheb +* Fixed [#1512](https://github.com/mobxjs/mobx/issues/1512): `observe` hooks not being triggered when using `mobx.set`, Fixed in [#1514](https://github.com/mobxjs/mobx/pull/1514) by @quanganhtran +* Several minor improvements, additional tests and doc improvements. # 4.2.0 -* Introduced `configure({ enforceActions: "strict" })`, which is more strict then `enforceActions: true`, as it will also throw on non-observed changes to observables. See also [#1473](https://github.com/mobxjs/mobx/issues/1473) -* Fixed [#1480](https://github.com/mobxjs/mobx/issues/1480): Exceptions in the effect handler of `reaction` where not properly picked up by the global reaction system -* Fixed a bug where computed values updated their cached value, even when the comparer considered the new value equal to the previous one. Thanks @kuitos for finding this and fixing it! [#1499](https://github.com/mobxjs/mobx/pull/1499) -* Undeprecated `ObservableMap`, fixes [#1496](https://github.com/mobxjs/mobx/issues/1496) -* Observable arrays now support `Symbol.toStringTag` (if available / polyfilled). This allows libraries like Ramda to detect automatically that observable arrays are arrays. Fixes [#1490](https://github.com/mobxjs/mobx/issues/1490). Note that `Array.isArray` will keep returning false for the entire MobX 4 range. -* Actions are now always `configurable` and `writable`, like in MobX 3. Fixes [#1477](https://github.com/mobxjs/mobx/issues/1477) -* Merged several improvements to the flow typings. [#1501](https://github.com/mobxjs/mobx/pull/1501) by @quanganhtran -* Fixed several accidental usages of the global `fail`, by @mtaran-google through [#1483](https://github.com/mobxjs/mobx/pull/1483) and [#1482](https://github.com/mobxjs/mobx/pull/1482) +* Introduced `configure({ enforceActions: "strict" })`, which is more strict then `enforceActions: true`, as it will also throw on non-observed changes to observables. See also [#1473](https://github.com/mobxjs/mobx/issues/1473) +* Fixed [#1480](https://github.com/mobxjs/mobx/issues/1480): Exceptions in the effect handler of `reaction` where not properly picked up by the global reaction system +* Fixed a bug where computed values updated their cached value, even when the comparer considered the new value equal to the previous one. Thanks @kuitos for finding this and fixing it! [#1499](https://github.com/mobxjs/mobx/pull/1499) +* Undeprecated `ObservableMap`, fixes [#1496](https://github.com/mobxjs/mobx/issues/1496) +* Observable arrays now support `Symbol.toStringTag` (if available / polyfilled). This allows libraries like Ramda to detect automatically that observable arrays are arrays. Fixes [#1490](https://github.com/mobxjs/mobx/issues/1490). Note that `Array.isArray` will keep returning false for the entire MobX 4 range. +* Actions are now always `configurable` and `writable`, like in MobX 3. Fixes [#1477](https://github.com/mobxjs/mobx/issues/1477) +* Merged several improvements to the flow typings. [#1501](https://github.com/mobxjs/mobx/pull/1501) by @quanganhtran +* Fixed several accidental usages of the global `fail`, by @mtaran-google through [#1483](https://github.com/mobxjs/mobx/pull/1483) and [#1482](https://github.com/mobxjs/mobx/pull/1482) # 4.1.1 -* Import `default` from MobX will no longer throw, but only warn instead. This fixes some issues with tools that reflect on the `default` export of a module -* Disposing a spy listener inside a spy handler no longer causes an exception. Fixes [#1459](https://github.com/mobxjs/mobx/issues/1459) through [#1460](https://github.com/mobxjs/mobx/pull/1460) by [farwayer](https://github.com/farwayer) -* Added a missing `runInAction` overload in the flow typings. [#1451](https://github.com/mobxjs/mobx/pull/1451) by [AMilassin](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3AAMilassin) -* Improved the typings of `decorate`. See [#1450](https://github.com/mobxjs/mobx/pull/1450) by [makepost](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3Amakepost) +* Import `default` from MobX will no longer throw, but only warn instead. This fixes some issues with tools that reflect on the `default` export of a module +* Disposing a spy listener inside a spy handler no longer causes an exception. Fixes [#1459](https://github.com/mobxjs/mobx/issues/1459) through [#1460](https://github.com/mobxjs/mobx/pull/1460) by [farwayer](https://github.com/farwayer) +* Added a missing `runInAction` overload in the flow typings. [#1451](https://github.com/mobxjs/mobx/pull/1451) by [AMilassin](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3AAMilassin) +* Improved the typings of `decorate`. See [#1450](https://github.com/mobxjs/mobx/pull/1450) by [makepost](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3Amakepost) # 4.1.0 -* Introduced `keepAlive` as option to `computed` -* All observable api's now default to `any` for their generic arguments -* Improved `flow` cancellation -* The effect of `when` is now automatically an action. -* `@computed` properties are now declared on their owner rather then the protoptype. Fixes an issue where `@computed` fields didn't work in React Native on proxied objects. See [#1396](https://github.com/mobxjs/mobx/issues/1396) -* `action` and `action.bound` decorated fields are now reassignable, so that they can be stubbed +* Introduced `keepAlive` as option to `computed` +* All observable api's now default to `any` for their generic arguments +* Improved `flow` cancellation +* The effect of `when` is now automatically an action. +* `@computed` properties are now declared on their owner rather then the protoptype. Fixes an issue where `@computed` fields didn't work in React Native on proxied objects. See [#1396](https://github.com/mobxjs/mobx/issues/1396) +* `action` and `action.bound` decorated fields are now reassignable, so that they can be stubbed # 4.0.2 -* Fixed issue where exceptions like `TypeError: Cannot define property:__mobxDidRunLazyInitializers, object is not extensible.` were thrown. Fixes [#1404](https://github.com/mobxjs/mobx/issues/1404) -* Improved flow typings for `flow`, [#1399](https://github.com/mobxjs/mobx/pull/1399) by @ismailhabib +* Fixed issue where exceptions like `TypeError: Cannot define property:__mobxDidRunLazyInitializers, object is not extensible.` were thrown. Fixes [#1404](https://github.com/mobxjs/mobx/issues/1404) +* Improved flow typings for `flow`, [#1399](https://github.com/mobxjs/mobx/pull/1399) by @ismailhabib # 4.0.1 -* Updated flow typings, see [#1393](https://github.com/mobxjs/mobx/pull/1393) by [andrew--r](https://github.com/andrew--r) +* Updated flow typings, see [#1393](https://github.com/mobxjs/mobx/pull/1393) by [andrew--r](https://github.com/andrew--r) # 4.0.0 -* For the highlights of this release, read the [blog](https://medium.com/p/c1fbc08008da/): -* For migration notes: see the [wiki page](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) -* Note; many things that were removed to make the api surface smaller. If you think some feature shouldn't have been removed, feel free to open an issue! +* For the highlights of this release, read the [blog](https://medium.com/p/c1fbc08008da/): +* For migration notes: see the [wiki page](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) +* Note; many things that were removed to make the api surface smaller. If you think some feature shouldn't have been removed, feel free to open an issue! This is the extensive list of all changes. @@ -201,277 +201,280 @@ This is the extensive list of all changes. The changes mentioned here are discussed in detail in the [release highlights](https://medium.com/p/c1fbc08008da/), or were simply updated in the docs. -* MobX 4 introduces separation between the production and non production build. The production build strips most typechecks, resulting in a faster and smaller build. Make sure to substitute process.env.NODE_ENV = "production" in your build process! If you are using MobX in a react project, you most probably already have set this up. Otherwise, the idea is explained [here](https://reactjs.org/docs/add-react-to-an-existing-app.html). -* Introduced `flow` to create a chain of async actions. This is the same function as [`asyncActions`](https://github.com/mobxjs/mobx-utils#asyncaction) of the mobx-utils package -* These `flow`'s are now cancellable, by calling `.cancel()` on the returned promise, which will throw a cancellation exception into the generator function. -* `flow` also has experimental support for async iterators (`async * function`) -* Introduced `decorate(thing, decorators)` to decorate classes or object without needing decorator syntax. -* Introduced `onBecomeObserved` and `onBecomeUnobserved`. These API's enable hooking into the observability system and get notified about when an observable starts / stops becoming used. This is great to automaticaly fetch data from external resources, or stop doing so. -* `computed` / `@computed` now accepts a `requiresReaction` option. If it set, the computed value will throw an exception if it is being read while not being tracked by some reaction. -* To make `requiresReaction` the default, use `mobx.configure({ computedRequiresReaction: true })` -* Introduced `mobx.configure({ disableErrorBoundaries })`, for easier debugging of exceptoins. By [NaridaL](https://github.com/NaridaL) through [#1262](https://github.com/mobxjs/mobx/pull/1262) -* `toJS` now accepts the options: `{ detectCycles?: boolean, exportMapsAsObjects?: boolean }`, both `true` by default -* Observable maps are now backed by real ES6 Maps. This means that any value can be used as key now, not just strings and numbers. -* The flow typings have been updated. Since this is a manual effort, there can be mistakes, so feel free to PR! - -* `computed(fn, options?)` / `@computed(options) get fn()` now accept the following options: - * `set: (value) => void` to set a custom setter on the computed property - * `name: "debug name"` - * `equals: fn` the equality value to use for the computed to determine whether its output has changed. The default is `comparer.default`. Alternatives are `comparer.structural`, `comparer.identity` or just your own comparison function. - * `requiresReaction: boolean` see above. - -* `autorun(fn, options?)` now accepts the following options: - * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` - * `name: "debug name"` - * `scheduler: function` a custom scheduler to run the autorun. For example to connect running the autorun to `requestAnimationFrame`. See the docs for more details - * `onError`. A custom error handler to be notified when an autorun throws an exception. - -* `reaction(expr, effect, options?)` now accepts the following options: - * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` - * `fireImmediately`. Immediately fire the effect function after the first evaluation of `expr` - * `equals`. Custom equality function to determine whether the `expr` function differed from its previous result, and hence should fire `effect`. Accepts the same options as the `equals` option of computed. - * All the options `autorun` accepts - -* `when(predicate, effect?, options?)` now accepts the following options: - * `name: "debug name"` - * `onError`. A custom error handler to be notified when an autorun throws an exception. - * `timeout: number` a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time -* The `effect` parameter of `when` has become optional. If it is omitted, `when` will return a promise. This makes it easy to `await` a condition, for example: `await when(() => user.profile.loaded)`. The returned promise can be cancelled using `promise.cancel()` - -* There is now an utility API that enables manipulating observable maps, objects and arrays with the same api. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. - * `values(thing)` returns all values in the collection as array - * `keys(thing)` returns all keys in the collection as array - * `set(thing, key, value)` or `set(thing, { key: value })` Updates the given collection with the provided key / value pair(s). - * `remove(thing, key)` removes the specified child from the collection. For arrays splicing is used. - * `has(thing, key)` returns true if the collection has the specified _observable_ property. - * `get(thing, key)` returns the chlid under the specified key. - -* `observable`, `observable.array`, `observable.object`, `observable.map` and `extendObservable` now accept an additional options object, which can specify the following attributes: - * `name: "debug name"` - * `deep: boolean`. `true` by default, indicates whether the children of this collection are automatically converted into observables as well. - * `defaultDecorator: ` specifies the default decorator used for new children / properties, by default: `observable.deep`, but could be changed to `observable.ref`, `observable.struct` etc. (The `deep` property is just a short-hand for switching between `observable.deep` or `observable.ref` as default decorator for new properties) - +* MobX 4 introduces separation between the production and non production build. The production build strips most typechecks, resulting in a faster and smaller build. Make sure to substitute process.env.NODE_ENV = "production" in your build process! If you are using MobX in a react project, you most probably already have set this up. Otherwise, the idea is explained [here](https://reactjs.org/docs/add-react-to-an-existing-app.html). +* Introduced `flow` to create a chain of async actions. This is the same function as [`asyncActions`](https://github.com/mobxjs/mobx-utils#asyncaction) of the mobx-utils package +* These `flow`'s are now cancellable, by calling `.cancel()` on the returned promise, which will throw a cancellation exception into the generator function. +* `flow` also has experimental support for async iterators (`async * function`) +* Introduced `decorate(thing, decorators)` to decorate classes or object without needing decorator syntax. +* Introduced `onBecomeObserved` and `onBecomeUnobserved`. These API's enable hooking into the observability system and get notified about when an observable starts / stops becoming used. This is great to automaticaly fetch data from external resources, or stop doing so. +* `computed` / `@computed` now accepts a `requiresReaction` option. If it set, the computed value will throw an exception if it is being read while not being tracked by some reaction. +* To make `requiresReaction` the default, use `mobx.configure({ computedRequiresReaction: true })` +* Introduced `mobx.configure({ disableErrorBoundaries })`, for easier debugging of exceptoins. By [NaridaL](https://github.com/NaridaL) through [#1262](https://github.com/mobxjs/mobx/pull/1262) +* `toJS` now accepts the options: `{ detectCycles?: boolean, exportMapsAsObjects?: boolean }`, both `true` by default +* Observable maps are now backed by real ES6 Maps. This means that any value can be used as key now, not just strings and numbers. +* The flow typings have been updated. Since this is a manual effort, there can be mistakes, so feel free to PR! + +* `computed(fn, options?)` / `@computed(options) get fn()` now accept the following options: + + * `set: (value) => void` to set a custom setter on the computed property + * `name: "debug name"` + * `equals: fn` the equality value to use for the computed to determine whether its output has changed. The default is `comparer.default`. Alternatives are `comparer.structural`, `comparer.identity` or just your own comparison function. + * `requiresReaction: boolean` see above. + +* `autorun(fn, options?)` now accepts the following options: + + * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` + * `name: "debug name"` + * `scheduler: function` a custom scheduler to run the autorun. For example to connect running the autorun to `requestAnimationFrame`. See the docs for more details + * `onError`. A custom error handler to be notified when an autorun throws an exception. + +* `reaction(expr, effect, options?)` now accepts the following options: + + * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` + * `fireImmediately`. Immediately fire the effect function after the first evaluation of `expr` + * `equals`. Custom equality function to determine whether the `expr` function differed from its previous result, and hence should fire `effect`. Accepts the same options as the `equals` option of computed. + * All the options `autorun` accepts + +* `when(predicate, effect?, options?)` now accepts the following options: + * `name: "debug name"` + * `onError`. A custom error handler to be notified when an autorun throws an exception. + * `timeout: number` a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time +* The `effect` parameter of `when` has become optional. If it is omitted, `when` will return a promise. This makes it easy to `await` a condition, for example: `await when(() => user.profile.loaded)`. The returned promise can be cancelled using `promise.cancel()` + +* There is now an utility API that enables manipulating observable maps, objects and arrays with the same api. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. + + * `values(thing)` returns all values in the collection as array + * `keys(thing)` returns all keys in the collection as array + * `set(thing, key, value)` or `set(thing, { key: value })` Updates the given collection with the provided key / value pair(s). + * `remove(thing, key)` removes the specified child from the collection. For arrays splicing is used. + * `has(thing, key)` returns true if the collection has the specified _observable_ property. + * `get(thing, key)` returns the chlid under the specified key. + +* `observable`, `observable.array`, `observable.object`, `observable.map` and `extendObservable` now accept an additional options object, which can specify the following attributes: + * `name: "debug name"` + * `deep: boolean`. `true` by default, indicates whether the children of this collection are automatically converted into observables as well. + * `defaultDecorator: ` specifies the default decorator used for new children / properties, by default: `observable.deep`, but could be changed to `observable.ref`, `observable.struct` etc. (The `deep` property is just a short-hand for switching between `observable.deep` or `observable.ref` as default decorator for new properties) ### Breaking changes The changes mentioned here are discussed in detail in the [migration notes](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) -* MobX 4 requires `Map` to be globally available. Polyfill it if targeting IE < 11 or other older browsers. -* For typescript users, MobX now requires `Map` and several `Symbol`s to exist for its typings. So make sure that the `lib` configuration of your project is set to `"es6"`. (The compilation target can still be `"es5"`) -* `observable.shallowArray(values)` has been removed, instead use `observable.array(values, { deep: false })` -* `observable.shallowMap(values)` has been removed, instead use `observable.map(values, { deep: false })` -* `observable.shallowObject(values)` has been removed, instead use `observable.object(values, {}, { deep: false })` -* `extendShallowObservable(target, props)`, instead use `extendObservable(target, props, {}, { deep: false })` -* The decorators `observable.ref`, `observable.shallow`, `observable.deep`, `observable.struct` can no longer be used as functions. Instead, they should be passed as part of the `decorators` param to resp. `observable.object` and `extendObservable` -* The new signature of `extendObservable` is `extendObservable(target, props, decorators?, options?)`. This also means it is no longer possible to pass multiple bags of properties to `extendObservable`. `extendObservable` can no longer be used to re-declare properties. Use `set` instead to update existing properties (or introduce new ones). -* Iterating maps now follows the spec, that is, `map.values()`, `map.entries()`, `map.keys()`, `map[@@iterator]()` and `array[@@iterator]()` no longer return an array, but an iterator. Use `mobx.values(map)` or `Array.from(map)` to convert the iterators to arrays. -* dropped `@computed.equals`, instead, you can now use `@computed({ equals: ... })` -* `useStrict(boolean)` was dropped, use `configure({ enforceActions: boolean })` instead -* `isolateGlobalState` was dropped, use `configure({ isolateGlobalState: true})` instead -* If there are multiple mobx instances active in a single project, an exception will be thrown. Previously only a warning was printed. Fixes #1098. For details, see [#1082](https://github.com/mobxjs/mobx/issues/1082). -* Dropped the `shareGlobalState` feature. Instead, projects should be setup properly and it is up to the hosting package to make sure that there is only one MobX instance -* `expr` has been moved to mobx-utils. Remember, `expr(fn)` is just `computed(fn).get()` -* `createTransformer` has been moved to mobx-utils -* Passing `context` explicitly to `autorun`, `reaction` etc is no longer supported. Use arrow functions or function.bind instead. -* Removed `autorunAsync`. Use the `delay` option of `autorun` instead. -* `autorun`, `when`, `reaction` don't support name as first argument anymore, instead pass the `name` option. -* The `extras.` namespace has been dropped to enable tree-shaking non-used MobX features. All methods that where there originally are now exported at top level. If they are part of the official public API (you are encouraged to use them) they are exported as is. If they are experimental or somehow internal (you are discouraged to use them), they are prefixed with `_`. -* Dropped bower support. Fixes #1263 -* The `spyReportStart`, `spyReportEnd`, `spyReport` and `isSpyEnabled` are no longer public. It is no longer possible to emit custom spy events as to avoid confusing in listeners what the possible set of events is. -* Dropped `isStrictModeEnabled` -* `observable(value)` will only succeed if it can turn the value into an observable data structure (a Map, Array or observable object). But it will no longer create an observable box for other values to avoid confusion. Call `observable.box(value)` explictly in such cases. -* `isComputed` and `isObservable` no longer accept a property as second argument. Instead use `isComputedProp` and `isObservableProp`. -* Removed `whyRun`, use `trace` instead -* The spy event signature has slightly changed -* The `Atom` class is no longer exposed. Use `createAtom` instead (same signature). -* Calling reportObserved() on a self made atom will no longer trigger the hooks if reportObserved is triggered outside a reactive context. -* The options `struct` and `compareStructural` for computed values are deprecated, use `@computed.struct` or `computed({ equals: comparer.structural})` instead. -* `isModifierDescriptor` is no longer exposed. -* `deepEqual` is no longer exposed, use `comparer.structural` instead. -* `setReactionScheduler` -> `configure({ reactionScheduler: fn })` -* `reserveArrayBuffer` -> `configure({ reactionErrorHandler: fn })` -* `ObservableMap` is no longer exposed as constructor, use `observable.map` or `isObservableMap` instead -* `map` -> `observable.map` -* `runInAction` no longer accepts a custom scope -* Dropped the already deprecated and broken `default` export that made it harder to tree-shake mobx. Make sure to always use `import { x } from "mobx"` and not `import mobx from "mobx"`. -* Killed the already deprecated modifiers `asFlat` etc. If you war still using this, see the MobX 2 -> 3 migration notes. -* Observable maps now fully implement the map interface. See [#1361](https://github.com/mobxjs/mobx/pull/1361) by [Marc Fallows](https://github.com/marcfallows) -* Observable arrays will no longer expose the `.move` method -* Dropped the `observable.deep.struct` modifier -* Dropped the `observable.ref.struct` modifier -* `observable.struct` now behaves like `observable.ref.struct` (this used to be `observable.deep.struct`). That is; values in an `observable.struct` field will be stored as is, but structural comparison will be used when assigning a new value -* IReactionDisposer.onError has been removed, use the `onError` option of reactions instead +* MobX 4 requires `Map` to be globally available. Polyfill it if targeting IE < 11 or other older browsers. +* For typescript users, MobX now requires `Map` and several `Symbol`s to exist for its typings. So make sure that the `lib` configuration of your project is set to `"es6"`. (The compilation target can still be `"es5"`) +* `observable.shallowArray(values)` has been removed, instead use `observable.array(values, { deep: false })` +* `observable.shallowMap(values)` has been removed, instead use `observable.map(values, { deep: false })` +* `observable.shallowObject(values)` has been removed, instead use `observable.object(values, {}, { deep: false })` +* `extendShallowObservable(target, props)`, instead use `extendObservable(target, props, {}, { deep: false })` +* The decorators `observable.ref`, `observable.shallow`, `observable.deep`, `observable.struct` can no longer be used as functions. Instead, they should be passed as part of the `decorators` param to resp. `observable.object` and `extendObservable` +* The new signature of `extendObservable` is `extendObservable(target, props, decorators?, options?)`. This also means it is no longer possible to pass multiple bags of properties to `extendObservable`. `extendObservable` can no longer be used to re-declare properties. Use `set` instead to update existing properties (or introduce new ones). +* Iterating maps now follows the spec, that is, `map.values()`, `map.entries()`, `map.keys()`, `map[@@iterator]()` and `array[@@iterator]()` no longer return an array, but an iterator. Use `mobx.values(map)` or `Array.from(map)` to convert the iterators to arrays. +* dropped `@computed.equals`, instead, you can now use `@computed({ equals: ... })` +* `useStrict(boolean)` was dropped, use `configure({ enforceActions: boolean })` instead +* `isolateGlobalState` was dropped, use `configure({ isolateGlobalState: true})` instead +* If there are multiple mobx instances active in a single project, an exception will be thrown. Previously only a warning was printed. Fixes #1098. For details, see [#1082](https://github.com/mobxjs/mobx/issues/1082). +* Dropped the `shareGlobalState` feature. Instead, projects should be setup properly and it is up to the hosting package to make sure that there is only one MobX instance +* `expr` has been moved to mobx-utils. Remember, `expr(fn)` is just `computed(fn).get()` +* `createTransformer` has been moved to mobx-utils +* Passing `context` explicitly to `autorun`, `reaction` etc is no longer supported. Use arrow functions or function.bind instead. +* Removed `autorunAsync`. Use the `delay` option of `autorun` instead. +* `autorun`, `when`, `reaction` don't support name as first argument anymore, instead pass the `name` option. +* The `extras.` namespace has been dropped to enable tree-shaking non-used MobX features. All methods that where there originally are now exported at top level. If they are part of the official public API (you are encouraged to use them) they are exported as is. If they are experimental or somehow internal (you are discouraged to use them), they are prefixed with `_`. +* Dropped bower support. Fixes #1263 +* The `spyReportStart`, `spyReportEnd`, `spyReport` and `isSpyEnabled` are no longer public. It is no longer possible to emit custom spy events as to avoid confusing in listeners what the possible set of events is. +* Dropped `isStrictModeEnabled` +* `observable(value)` will only succeed if it can turn the value into an observable data structure (a Map, Array or observable object). But it will no longer create an observable box for other values to avoid confusion. Call `observable.box(value)` explictly in such cases. +* `isComputed` and `isObservable` no longer accept a property as second argument. Instead use `isComputedProp` and `isObservableProp`. +* Removed `whyRun`, use `trace` instead +* The spy event signature has slightly changed +* The `Atom` class is no longer exposed. Use `createAtom` instead (same signature). +* Calling reportObserved() on a self made atom will no longer trigger the hooks if reportObserved is triggered outside a reactive context. +* The options `struct` and `compareStructural` for computed values are deprecated, use `@computed.struct` or `computed({ equals: comparer.structural})` instead. +* `isModifierDescriptor` is no longer exposed. +* `deepEqual` is no longer exposed, use `comparer.structural` instead. +* `setReactionScheduler` -> `configure({ reactionScheduler: fn })` +* `reserveArrayBuffer` -> `configure({ reactionErrorHandler: fn })` +* `ObservableMap` is no longer exposed as constructor, use `observable.map` or `isObservableMap` instead +* `map` -> `observable.map` +* `runInAction` no longer accepts a custom scope +* Dropped the already deprecated and broken `default` export that made it harder to tree-shake mobx. Make sure to always use `import { x } from "mobx"` and not `import mobx from "mobx"`. +* Killed the already deprecated modifiers `asFlat` etc. If you war still using this, see the MobX 2 -> 3 migration notes. +* Observable maps now fully implement the map interface. See [#1361](https://github.com/mobxjs/mobx/pull/1361) by [Marc Fallows](https://github.com/marcfallows) +* Observable arrays will no longer expose the `.move` method +* Dropped the `observable.deep.struct` modifier +* Dropped the `observable.ref.struct` modifier +* `observable.struct` now behaves like `observable.ref.struct` (this used to be `observable.deep.struct`). That is; values in an `observable.struct` field will be stored as is, but structural comparison will be used when assigning a new value +* IReactionDisposer.onError has been removed, use the `onError` option of reactions instead ### Issues fixed in this release: The issues are incoprorated in the above notes. -* [#1316](https://github.com/mobxjs/mobx/issues/1316) - Improve `observable` api -* [#992](https://github.com/mobxjs/mobx/issues/992) - `onBecomeObserved` & `onBecomeUnobserved` -* [#1301](https://github.com/mobxjs/mobx/issues/1301) - Set `onError` handler when creating reactions -* [#817](https://github.com/mobxjs/mobx/issues/817) - Improve typings of `observe` -* [#800](https://github.com/mobxjs/mobx/issues/800) - Use `Map` as backend implementation of observable maps -* [#1361](https://github.com/mobxjs/mobx/issues/1361) - Make observableMaps structurally correct maps -* [#813](https://github.com/mobxjs/mobx/issues/813) - Create separate dev and production builds -* [#961](https://github.com/mobxjs/mobx/issues/961), [#1197](https://github.com/mobxjs/mobx/issues/1197) - Make it possible to forbid reading an untracked computed value -* [#1098](https://github.com/mobxjs/mobx/issues/1098) - Throw instead of warn if multiple MobX instances are active -* [#1122](https://github.com/mobxjs/mobx/issues/1122) - Atom hooks fired to often for observable maps -* [#1148](https://github.com/mobxjs/mobx/issues/1148) - Disposer of reactions should also cancel all scheduled effects -* [#1241](https://github.com/mobxjs/mobx/issues/1241) - Make it possible to disable error boundaries, to make it easier to find exceptions -* [#1263](https://github.com/mobxjs/mobx/issues/1263) - Remove bower.json +* [#1316](https://github.com/mobxjs/mobx/issues/1316) - Improve `observable` api +* [#992](https://github.com/mobxjs/mobx/issues/992) - `onBecomeObserved` & `onBecomeUnobserved` +* [#1301](https://github.com/mobxjs/mobx/issues/1301) - Set `onError` handler when creating reactions +* [#817](https://github.com/mobxjs/mobx/issues/817) - Improve typings of `observe` +* [#800](https://github.com/mobxjs/mobx/issues/800) - Use `Map` as backend implementation of observable maps +* [#1361](https://github.com/mobxjs/mobx/issues/1361) - Make observableMaps structurally correct maps +* [#813](https://github.com/mobxjs/mobx/issues/813) - Create separate dev and production builds +* [#961](https://github.com/mobxjs/mobx/issues/961), [#1197](https://github.com/mobxjs/mobx/issues/1197) - Make it possible to forbid reading an untracked computed value +* [#1098](https://github.com/mobxjs/mobx/issues/1098) - Throw instead of warn if multiple MobX instances are active +* [#1122](https://github.com/mobxjs/mobx/issues/1122) - Atom hooks fired to often for observable maps +* [#1148](https://github.com/mobxjs/mobx/issues/1148) - Disposer of reactions should also cancel all scheduled effects +* [#1241](https://github.com/mobxjs/mobx/issues/1241) - Make it possible to disable error boundaries, to make it easier to find exceptions +* [#1263](https://github.com/mobxjs/mobx/issues/1263) - Remove bower.json # 3.6.2 -* Fixed accidental dependency on the `node` typings. Fixes [#1387](https://github.com/mobxjs/mobx/issues/1387) / [#1362](https://github.com/mobxjs/mobx/issues/1387) +* Fixed accidental dependency on the `node` typings. Fixes [#1387](https://github.com/mobxjs/mobx/issues/1387) / [#1362](https://github.com/mobxjs/mobx/issues/1387) # 3.6.1 -* Fixed [#1358](https://github.com/mobxjs/mobx/pull/1359): Deep comparison failing on IE11. By [le0nik](https://github.com/le0nik) through [#1359](https://github.com/mobxjs/mobx/pull/1359) +* Fixed [#1358](https://github.com/mobxjs/mobx/pull/1359): Deep comparison failing on IE11. By [le0nik](https://github.com/le0nik) through [#1359](https://github.com/mobxjs/mobx/pull/1359) # 3.6.0 -* Fixed [#1118](https://github.com/mobxjs/mobx/issues/1118), the deepEquals operator build into mobx gave wrong results for non-primitive objects. This affected for example `computed.struct`, or the `compareStructural` of `reaction` +* Fixed [#1118](https://github.com/mobxjs/mobx/issues/1118), the deepEquals operator build into mobx gave wrong results for non-primitive objects. This affected for example `computed.struct`, or the `compareStructural` of `reaction` # 3.5.0/1 -* Introduced `trace` for easier debugging of reactions / computed values. See the [docs](https://mobx.js.org/best/trace.html) for details. -* Improved typings of `observableArray.find`, see [#1324](https://github.com/mobxjs/mobx/pull/1324) for details. +* Introduced `trace` for easier debugging of reactions / computed values. See the [docs](https://mobx.js.org/best/trace.html) for details. +* Improved typings of `observableArray.find`, see [#1324](https://github.com/mobxjs/mobx/pull/1324) for details. # 3.4.1 -* Republished 3.4.0, because the package update doesn't seem to distibute consistently through yarn / npm +* Republished 3.4.0, because the package update doesn't seem to distibute consistently through yarn / npm # 3.4.0 -* Improve Flow support by exposing typings regularly. Flow will automatically include them now. In your `.flowconfig` will have to remove the import in the `[libs]` section (as it's done [here](https://github.com/mobxjs/mobx/pull/1254#issuecomment-348926416)). Fixes [#1232](https://github.com/mobxjs/mobx/issues/1232). +* Improve Flow support by exposing typings regularly. Flow will automatically include them now. In your `.flowconfig` will have to remove the import in the `[libs]` section (as it's done [here](https://github.com/mobxjs/mobx/pull/1254#issuecomment-348926416)). Fixes [#1232](https://github.com/mobxjs/mobx/issues/1232). # 3.3.3 -* Fixed regression bug where observable map contents could not be replaced using another observable map [#1258](https://github.com/mobxjs/mobx/issues/1258) -* Fixed weird exception abot not being able to read `length` property of a function, see[#1238](https://github.com/mobxjs/mobx/issues/1238) through [#1257](https://github.com/mobxjs/mobx/issues/1238) by @dannsam +* Fixed regression bug where observable map contents could not be replaced using another observable map [#1258](https://github.com/mobxjs/mobx/issues/1258) +* Fixed weird exception abot not being able to read `length` property of a function, see[#1238](https://github.com/mobxjs/mobx/issues/1238) through [#1257](https://github.com/mobxjs/mobx/issues/1238) by @dannsam # 3.3.2 -* Fix bug where custom comparers could be invoked with `undefined` values. Fixes [#1208](https://github.com/mobxjs/mobx/issues/1208) -* Make typings for observable stricter when using flow [#1194](https://github.com/mobxjs/mobx/issues/1194), [#1231](https://github.com/mobxjs/mobx/issues/1231) -* Fix a bug where `map.replace` would trigger reactions for unchanged values, fixes [#1243](https://github.com/mobxjs/mobx/issues/1243) -* Fixed issue where `NaN` was considered unequal to `NaN` when a deep compare was made [#1249](https://github.com/mobxjs/mobx/issues/1249) +* Fix bug where custom comparers could be invoked with `undefined` values. Fixes [#1208](https://github.com/mobxjs/mobx/issues/1208) +* Make typings for observable stricter when using flow [#1194](https://github.com/mobxjs/mobx/issues/1194), [#1231](https://github.com/mobxjs/mobx/issues/1231) +* Fix a bug where `map.replace` would trigger reactions for unchanged values, fixes [#1243](https://github.com/mobxjs/mobx/issues/1243) +* Fixed issue where `NaN` was considered unequal to `NaN` when a deep compare was made [#1249](https://github.com/mobxjs/mobx/issues/1249) # 3.3.1 -* Fix bug allowing maps to be modified outside actions when using strict mode, fixes [#940](https://github.com/mobxjs/mobx/issues/940) -* Fixed [#1139](https://github.com/mobxjs/mobx/issues/1139) properly: `transaction` is no longer deprecated and doesn't disable tracking properties anymore -* Fixed [#1120](https://github.com/mobxjs/mobx/issues/1139): `isComputed` should return false for non-existing properties +* Fix bug allowing maps to be modified outside actions when using strict mode, fixes [#940](https://github.com/mobxjs/mobx/issues/940) +* Fixed [#1139](https://github.com/mobxjs/mobx/issues/1139) properly: `transaction` is no longer deprecated and doesn't disable tracking properties anymore +* Fixed [#1120](https://github.com/mobxjs/mobx/issues/1139): `isComputed` should return false for non-existing properties # 3.3.0 -* Undeprecated `transaction`, see [#1139](https://github.com/mobxjs/mobx/issues/1139) -* Fixed typings of reaction [#1136](https://github.com/mobxjs/mobx/issues/1136) -* It is now possible to re-define a computed property [#1121](https://github.com/mobxjs/mobx/issues/1121) -* Print an helpful error message when using `@action` on a getter [#971](https://github.com/mobxjs/mobx/issues/971) -* Improved typings of intercept [#1119](https://github.com/mobxjs/mobx/issues/1119) -* Made code base Prettier [#1103](https://github.com/mobxjs/mobx/issues/1103) -* react-native will now by default use the es module build as well. -* Added support for Weex, see [#1163](https://github.com/mobxjs/mobx/pull/1163/) -* Added workaround for Firefox issue causing MobX to crash, see [#614](https://github.com/mobxjs/mobx/issues/614) +* Undeprecated `transaction`, see [#1139](https://github.com/mobxjs/mobx/issues/1139) +* Fixed typings of reaction [#1136](https://github.com/mobxjs/mobx/issues/1136) +* It is now possible to re-define a computed property [#1121](https://github.com/mobxjs/mobx/issues/1121) +* Print an helpful error message when using `@action` on a getter [#971](https://github.com/mobxjs/mobx/issues/971) +* Improved typings of intercept [#1119](https://github.com/mobxjs/mobx/issues/1119) +* Made code base Prettier [#1103](https://github.com/mobxjs/mobx/issues/1103) +* react-native will now by default use the es module build as well. +* Added support for Weex, see [#1163](https://github.com/mobxjs/mobx/pull/1163/) +* Added workaround for Firefox issue causing MobX to crash, see [#614](https://github.com/mobxjs/mobx/issues/614) # 3.2.2 -* Fixes a bug (or a known limitation) described in [#1092](https://github.com/mobxjs/mobx/issue/1092/). It is now possible to have different observable administration on different levels of the prototype chain. By @guillaumeleclerc -* Fixed a build issue when using mobx in a project that was using rollup, fixes [#1099](https://github.com/mobxjs/mobx/issue/1099/) by @rossipedia -* Fixed typings of `useStrict`, by @rickbeerendonk +* Fixes a bug (or a known limitation) described in [#1092](https://github.com/mobxjs/mobx/issue/1092/). It is now possible to have different observable administration on different levels of the prototype chain. By @guillaumeleclerc +* Fixed a build issue when using mobx in a project that was using rollup, fixes [#1099](https://github.com/mobxjs/mobx/issue/1099/) by @rossipedia +* Fixed typings of `useStrict`, by @rickbeerendonk # 3.2.1 -* Introduced customizable value comperators to reactions and computed values. `reaction` and `computed` now support an additional option, `equals`, which takes a comparision function. See [#951](https://github.com/mobxjs/mobx/pull/951/) by @jamiewinder. Fixes #802 and #943. See the updated [`computed` docs](https://mobx.js.org/refguide/computed-decorator.html) for more details. +* Introduced customizable value comperators to reactions and computed values. `reaction` and `computed` now support an additional option, `equals`, which takes a comparision function. See [#951](https://github.com/mobxjs/mobx/pull/951/) by @jamiewinder. Fixes #802 and #943. See the updated [`computed` docs](https://mobx.js.org/refguide/computed-decorator.html) for more details. # 3.2.0 -* MobX will warn again when there are multiple instances of MobX loaded, as this lead to often to confusing bugs if the project setup was not properly. The signal mobx that multiple instances are loaded on purpose, use `mobx.extras.runInSandbox`. See [#1082](https://github.com/mobxjs/mobx/issues/1082) for details. +* MobX will warn again when there are multiple instances of MobX loaded, as this lead to often to confusing bugs if the project setup was not properly. The signal mobx that multiple instances are loaded on purpose, use `mobx.extras.runInSandbox`. See [#1082](https://github.com/mobxjs/mobx/issues/1082) for details. # 3.1.17 -* Improved typings of `IObservableArray.intercept`: use more restrictive types for `change` parameter of `handler`, by @bvanreeven -* Fixed [#1072](https://github.com/mobxjs/mobx/issues/1072), fields without a default value could not be observed yet when using TypeScript +* Improved typings of `IObservableArray.intercept`: use more restrictive types for `change` parameter of `handler`, by @bvanreeven +* Fixed [#1072](https://github.com/mobxjs/mobx/issues/1072), fields without a default value could not be observed yet when using TypeScript # 3.1.16 -* Restored `default` export (and added warning), which broke code that was importing mobx like `import mobx from "mobx"`. Use `import * as mobx from "mobx"` or use named importes instead. By @andykog, see #1043, #1050 -* Fixed several typos in exceptions and documentation +* Restored `default` export (and added warning), which broke code that was importing mobx like `import mobx from "mobx"`. Use `import * as mobx from "mobx"` or use named importes instead. By @andykog, see #1043, #1050 +* Fixed several typos in exceptions and documentation # 3.1.15 -* Fixed issue where `array.remove` did not work correctly in combination with `extras.interceptReads` +* Fixed issue where `array.remove` did not work correctly in combination with `extras.interceptReads` # 3.1.14 -* Fixed 3.1.12 / 3.1.13 module packing. See #1039; `module` target is now transpiled to ES5 as well +* Fixed 3.1.12 / 3.1.13 module packing. See #1039; `module` target is now transpiled to ES5 as well # 3.1.13 (Unpublished: Uglify chokes on it in CRA) -* Fixed build issue with webpack 2, see #1040 +* Fixed build issue with webpack 2, see #1040 # 3.1.12 (Unpublished: wasn't being bundled correctly by all bundlers) -* Added support for ES modules. See #1027 by @rossipedia -* Improved flow typings. See #1019 by @fb55 -* Introduced experimental feature `extras.interceptReads(observable: ObservableMap | ObservableArray | ObservableObject | ObservableBox, property?: string, handler: value => value): Disposer` that can be used to intercept _reads_ from observable objects, to transform values on the fly when a value is read. One can achieve similar things with this as with proxying reads. See #1036 +* Added support for ES modules. See #1027 by @rossipedia +* Improved flow typings. See #1019 by @fb55 +* Introduced experimental feature `extras.interceptReads(observable: ObservableMap | ObservableArray | ObservableObject | ObservableBox, property?: string, handler: value => value): Disposer` that can be used to intercept _reads_ from observable objects, to transform values on the fly when a value is read. One can achieve similar things with this as with proxying reads. See #1036 # 3.1.11 -* Using rollup as bundler, instead of custom hacked build scripts, by @rossipedia, see #1023 +* Using rollup as bundler, instead of custom hacked build scripts, by @rossipedia, see #1023 # 3.1.10 -* Fixed flow typings for `when`, by @jamsea -* Add flow typings for `map.replace`, by @leader22 -* Added `observableArray.findIndex`, by @leader22 -* Improved typings of `autorun` / `autorunAsync` to better support async / await, by @capaj -* Fixed typings of `action.bound`, see #803 +* Fixed flow typings for `when`, by @jamsea +* Add flow typings for `map.replace`, by @leader22 +* Added `observableArray.findIndex`, by @leader22 +* Improved typings of `autorun` / `autorunAsync` to better support async / await, by @capaj +* Fixed typings of `action.bound`, see #803 # 3.1.9 -* Introduced explicit `.get(index)` and `.set(index, value)` methods on observable arrays, for issues that have trouble handling many property descriptors on objects. See also #734 -* Made sure it is safe to call `onBecomeObserved` twice in row, fixes #874, #898 -* Fixed typings of `IReactionDisposer` +* Introduced explicit `.get(index)` and `.set(index, value)` methods on observable arrays, for issues that have trouble handling many property descriptors on objects. See also #734 +* Made sure it is safe to call `onBecomeObserved` twice in row, fixes #874, #898 +* Fixed typings of `IReactionDisposer` # 3.1.8 -* Fixed edge case where `autorun` was not triggered again if a computed value was invalidated by the reaction itself, see [#916](https://github.com/mobxjs/mobx/issues/916), by @andykog -* Added support for primtive keys in `createTransformer`, See #920 by @dnakov -* Improved typings of `isArrayLike`, see #904, by @mohsen1 +* Fixed edge case where `autorun` was not triggered again if a computed value was invalidated by the reaction itself, see [#916](https://github.com/mobxjs/mobx/issues/916), by @andykog +* Added support for primtive keys in `createTransformer`, See #920 by @dnakov +* Improved typings of `isArrayLike`, see #904, by @mohsen1 # 3.1.7 -* Reverted ES2015 module changes, as they broke with webpack 2 (will be re-released later) +* Reverted ES2015 module changes, as they broke with webpack 2 (will be re-released later) # 3.1.6 (Unpublished) -* Expose ES2015 modules to be used with advanced bundlers, by @mohsen1, fixes #868 -* Improved typings of `IObservableArray.intercept`: remove superflous type parameter, by @bvanreeven -* Improved typings of map changes, by @hediet +* Expose ES2015 modules to be used with advanced bundlers, by @mohsen1, fixes #868 +* Improved typings of `IObservableArray.intercept`: remove superflous type parameter, by @bvanreeven +* Improved typings of map changes, by @hediet # 3.1.5 -* Improved typings of map changes, see #847, by @hediet -* Fixed issue with `reaction` if `fireImmediately` was combined with `delay` option, see #837, by @SaboteurSpk +* Improved typings of map changes, see #847, by @hediet +* Fixed issue with `reaction` if `fireImmediately` was combined with `delay` option, see #837, by @SaboteurSpk # 3.1.4 -* Observable maps initialized from ES6 didn't deeply convert their values to observables. (fixes #869,by @ggarek) +* Observable maps initialized from ES6 didn't deeply convert their values to observables. (fixes #869,by @ggarek) # 3.1.3 -* Make sure that `ObservableArray.replace` can handle large arrays by not using splats internally. (See e.g. #859) -* Exposed `ObservableArray.spliceWithArray`, that unlike a normal splice, doesn't use a variadic argument list so that it is possible to splice in new arrays that are larger then allowed by the callstack. +* Make sure that `ObservableArray.replace` can handle large arrays by not using splats internally. (See e.g. #859) +* Exposed `ObservableArray.spliceWithArray`, that unlike a normal splice, doesn't use a variadic argument list so that it is possible to splice in new arrays that are larger then allowed by the callstack. # 3.1.2 -* Fixed incompatiblity issue with `mobx-react@4.1.0` +* Fixed incompatiblity issue with `mobx-react@4.1.0` # 3.1.1 (unpublished) -* Introduced `isBoxedObservable(value)`, fixes #804 +* Introduced `isBoxedObservable(value)`, fixes #804 # 3.1.0 @@ -479,8 +482,8 @@ The issues are incoprorated in the above notes. Strict mode has been relaxed a bit in this release. Also computed values can now better handle creating new observables (in an action if needed). The semantics are now as follows: -* In strict mode, it is not allowed to modify state that is already being _observed_ by some reaction. -* It is allowed to create and modify observable values in computed blocks, as long as they are not _observed_ yet. +* In strict mode, it is not allowed to modify state that is already being _observed_ by some reaction. +* It is allowed to create and modify observable values in computed blocks, as long as they are not _observed_ yet. In order words: Observables that are not in use anywhere yet, are not protected by MobX strict mode. This is fine as the main goal of strict mode is to avoid kicking of reactions at undesired places. @@ -488,42 +491,44 @@ Also strict mode enforces batched mutations of observables (through action). However, for unobserved observables this is not relevant; they won't kick of reactions at all. This fixes some uses cases where one now have to jump through hoops like: -* Creating observables in computed properties was fine already, but threw if this was done with the aid of an action. See issue [#798](https://github.com/mobxjs/mobx/issues/798). -* In strict mode, it was not possible to _update_ observable values without wrapping the code in `runInAction` or `action`. See issue [#563](https://github.com/mobxjs/mobx/issues/563) + +* Creating observables in computed properties was fine already, but threw if this was done with the aid of an action. See issue [#798](https://github.com/mobxjs/mobx/issues/798). +* In strict mode, it was not possible to _update_ observable values without wrapping the code in `runInAction` or `action`. See issue [#563](https://github.com/mobxjs/mobx/issues/563) Note that the following constructions are still anti patterns, although MobX won't throw anymore on them: -* Changing unobserved, but not just created observables in a computed value -* Invoke actions in computed values. Use reactions like `autorun` or `reaction` instead. -Note that observables that are not in use by a reaction, but that have `.observe` listeners attached, do *not* count towards being observed. +* Changing unobserved, but not just created observables in a computed value +* Invoke actions in computed values. Use reactions like `autorun` or `reaction` instead. + +Note that observables that are not in use by a reaction, but that have `.observe` listeners attached, do _not_ count towards being observed. Observe and intercept callbacks are concepts that do not relate to strict mode, actions or transactions. ### Other changes -* Reactions and observable values now consider `NaN === NaN`, See #805 by @andykog -* Merged #783: extract error messages to seperate file, so that they can be optimized in production builds (not yet done), by @reisel, #GoodnessSquad -* Improved typings of actions, see #796 by @mattiamanzati +* Reactions and observable values now consider `NaN === NaN`, See #805 by @andykog +* Merged #783: extract error messages to seperate file, so that they can be optimized in production builds (not yet done), by @reisel, #GoodnessSquad +* Improved typings of actions, see #796 by @mattiamanzati # 3.0.2 -* Fixed issue where MobX failed on environments where `Map` is not defined, #779 by @dirtyrolf -* MobX can now be compiled on windows as well! #772 by @madarauchiha #GoodnessSquad -* Added documentation on how Flow typings can be used, #766 by @wietsevenema -* Added support for `Symbol.toPrimitive()` and `valueOf()`, see #773 by @eladnava #GoodnessSquad -* Supressed an exception that was thrown when using the Chrome Developer tools to inspect arrays, see #752 +* Fixed issue where MobX failed on environments where `Map` is not defined, #779 by @dirtyrolf +* MobX can now be compiled on windows as well! #772 by @madarauchiha #GoodnessSquad +* Added documentation on how Flow typings can be used, #766 by @wietsevenema +* Added support for `Symbol.toPrimitive()` and `valueOf()`, see #773 by @eladnava #GoodnessSquad +* Supressed an exception that was thrown when using the Chrome Developer tools to inspect arrays, see #752 Re-introduced _structural comparison_. Seems we couldn't part from it yet :). So the following things have been added: -* `struct` option to `reaction` (alias for `compareStructural`, to get more consistency in naming) -* `observable.struct`, as alias for `observable.deep.struct` -* `observable.deep.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Converts new values automatically to observables (like `observable.deep`) -* `observable.ref.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Doesn't convert the new value into observables. -* `extras.deepEquals`: Check if two data structures are deeply equal. supports observable and non observable data structures. +* `struct` option to `reaction` (alias for `compareStructural`, to get more consistency in naming) +* `observable.struct`, as alias for `observable.deep.struct` +* `observable.deep.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Converts new values automatically to observables (like `observable.deep`) +* `observable.ref.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Doesn't convert the new value into observables. +* `extras.deepEquals`: Check if two data structures are deeply equal. supports observable and non observable data structures. # 3.0.1 -* `toString()` of observable arrays now behaves like normal arrays (by @capaj, see #759) -* Improved flow types of `toJS`by @jamsea (#758) +* `toString()` of observable arrays now behaves like normal arrays (by @capaj, see #759) +* Improved flow types of `toJS`by @jamsea (#758) # 3.0.0 @@ -537,7 +542,7 @@ Note that no changes to the runtime algorithm where made, almost all changes evo The api to create observables has been redesigned. By default, it keeps the automatic conversion behavior from MobX 2. -However, one can now have more fine grained control on how / which observables are constructed. +However, one can now have more fine grained control on how / which observables are constructed. Modifiers still exists, but they are more regular, and there should be less need for them. ### `observable(plainObject)` will no longer enhance objects, but clone instead @@ -561,11 +566,11 @@ See [#649](https://github.com/mobxjs/mobx/issues/649) There are now explicit methods to create an observable of a specific type. -* `observable.object(props, name?)` creates a new observable object, by cloning the give props and making them observable -* `observable.array(initialValues, name?)`. Take a guess.. -* `observable.map(initialValues, name?)` -* `observable.box(initialValue, name?)`. Creates a [boxed](http://mobxjs.github.io/mobx/refguide/boxed.html) value, which can be read from / written to using `.get()` and `.set(newValue)` -* `observable(value)`, as-is, based on the type of `value`, uses any of the above four functions to create a new observable. +* `observable.object(props, name?)` creates a new observable object, by cloning the give props and making them observable +* `observable.array(initialValues, name?)`. Take a guess.. +* `observable.map(initialValues, name?)` +* `observable.box(initialValue, name?)`. Creates a [boxed](http://mobxjs.github.io/mobx/refguide/boxed.html) value, which can be read from / written to using `.get()` and `.set(newValue)` +* `observable(value)`, as-is, based on the type of `value`, uses any of the above four functions to create a new observable. ### Shallow factories per type @@ -575,10 +580,10 @@ For example when storing objects from external libraries. In MobX 2 you needed to use `asFlat` or `asReference` modifiers for this. In MobX 3, there are factories to directly create non-converting data structures: -* `observable.shallowObject(props, name?)` -* `observable.shallowArray(initialValues, name?)` -* `observable.shallowMap(initialValues, name?)` -* `observable.shallowBox(initialValue, name?)` +* `observable.shallowObject(props, name?)` +* `observable.shallowArray(initialValues, name?)` +* `observable.shallowMap(initialValues, name?)` +* `observable.shallowBox(initialValue, name?)` So for example, `observable.shallowArray([todo1, todo2])` will create an observable array, but it won't try to convert the todos inside the array into observables as well. @@ -602,9 +607,9 @@ Modifiers can be used in combination `@observable`, `extendObservable` and `obse The following modifiers are available: -* `observable.deep`: This is the default modifier, used by any observable. It converts any assigned, non-primitive value into an observable value if it isn't one yet. -* `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. -* `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an collection, which is shallowly observable (instead of deep) +* `observable.deep`: This is the default modifier, used by any observable. It converts any assigned, non-primitive value into an observable value if it isn't one yet. +* `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. +* `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an collection, which is shallowly observable (instead of deep) Modifiers can be used as decorator: @@ -628,24 +633,25 @@ See [modifiers](http://mobxjs.github.io/mobx/refguide/modifiers.html) ### `computed` api has been simplified Using `computed` to create boxed observables has been simplified, and `computed` can now be invoked as follows: -* `computed(expr)` -* `computed(expr, setter)` -* `computed(expr, options)`, where options is an object that can specify one or more of the following fields: `name`, `setter`, `compareStructural` or `context` (the "this"). + +* `computed(expr)` +* `computed(expr, setter)` +* `computed(expr, options)`, where options is an object that can specify one or more of the following fields: `name`, `setter`, `compareStructural` or `context` (the "this"). Computed can also be used as a decorator: -* `@computed` -* `@computed.struct` when you want to compareStructural (previously was `@computed({asStructure: true})`) +* `@computed` +* `@computed.struct` when you want to compareStructural (previously was `@computed({asStructure: true})`) ### `reaction` api has been simplified The signature of `reaction` is now `reaction(dataFunc, effectFunc, options?)`, where the following options are accepted: -* `context`: The `this` to be used in the functions -* `fireImmediately` -* `delay`: Number in milliseconds that can be used to debounce the effect function. -* `compareStructural`: `false` by default. If `true`, the return value of the *data* function is structurally compared to its previous return value, and the *effect* function will only be invoked if there is a structural change in the output. -* `name`: String +* `context`: The `this` to be used in the functions +* `fireImmediately` +* `delay`: Number in milliseconds that can be used to debounce the effect function. +* `compareStructural`: `false` by default. If `true`, the return value of the _data_ function is structurally compared to its previous return value, and the _effect_ function will only be invoked if there is a structural change in the output. +* `name`: String ### Bound actions @@ -654,12 +660,12 @@ This means that now the following is possible: ```javascript class Ticker { - @observable tick = 0 + @observable tick = 0 - @action.bound - increment() { - this.tick++ // 'this' will always be correct - } + @action.bound + increment() { + this.tick++ // 'this' will always be correct + } } const ticker = new Ticker() @@ -671,10 +677,10 @@ setInterval(ticker.increment, 1000) Error handling in MobX has been made more consistent. In MobX 2 there was a best-effort recovery attempt if a derivation throws, but MobX 3 introduced more consistent behavior: -* Computed values that throw, store the exception and throw it to the next consumer(s). They keep tracking their data, so they are able to recover from exceptions in next re-runs. -* Reactions (like `autorun`, `when`, `reaction`, `render()` of `observer` components) will always catch their exceptions, and just log the error. They will keep tracking their data, so they are able to recover in next re-runs. -* The disposer of a reaction exposes an `onError(handler)` method, which makes it possible to attach custom error handling logic to an reaction (that overrides the default logging behavior). -* `extras.onReactionError(handler)` can be used to register a global onError handler for reactions (will fire after spy "error" event). This can be useful in tests etc. +* Computed values that throw, store the exception and throw it to the next consumer(s). They keep tracking their data, so they are able to recover from exceptions in next re-runs. +* Reactions (like `autorun`, `when`, `reaction`, `render()` of `observer` components) will always catch their exceptions, and just log the error. They will keep tracking their data, so they are able to recover in next re-runs. +* The disposer of a reaction exposes an `onError(handler)` method, which makes it possible to attach custom error handling logic to an reaction (that overrides the default logging behavior). +* `extras.onReactionError(handler)` can be used to register a global onError handler for reactions (will fire after spy "error" event). This can be useful in tests etc. See [#731](https://github.com/mobxjs/mobx/issues/731) @@ -695,10 +701,10 @@ Add flow types for methods and interfaces of observable variables: ```js const observableValue: IObservableValue = observable(1) -const observableArray: IObservableArray = observable([1,2,3]) +const observableArray: IObservableArray = observable([1, 2, 3]) const sum: IComputedValue = computed(() => { - return observableArray.reduce((a: number, b: number): number => a + b, 0) + return observableArray.reduce((a: number, b: number): number => a + b, 0) }) ``` @@ -729,27 +735,27 @@ Whether or not this was ever a good idea is debatable, but it stopped working in ### Other changes -* **Breaking change:** The arguments to `observe` listeners for computed and boxed observables have changed and are now consistent with the other apis. Instead of invoking the callback with `(newValue: T, oldValue: T)` they are now invoked with a single change object: `(change: {newValue: T, oldValue: T, object, type: "update"})` -* Using transaction is now deprecated, use `action` or `runInAction` instead. Transactions now will enter an `untracked` block as well, just as actions, which removes the conceptual difference. -* Upgraded to typescript 2 -* It is now possible to pass ES6 Maps to `observable` / observable maps. The map will be converted to an observable map (if keys are string like) -* Made `action` more debug friendly, it should now be easier to step through -* ObservableMap now has an additional method, `.replace(data)`, which is a combination of `clear()` and `merge(data)`. -* Passing a function to `observable` will now create a boxed observable refering to that function -* Fixed #603: exceptions in transaction breaks future reactions -* Fixed #698: createTransformer should support default arguments -* Transactions are no longer reported grouped in spy events. If you want to group events, use actions instead. -* Normalized `spy` events further. Computed values and actions now report `object` instead of `target` for the scope they have been applied to. -* The following deprecated methods have been removed: - * `transaction` - * `autorunUntil` - * `trackTransitions` - * `fastArray` - * `SimpleEventEmitter` - * `ObservableMap.toJs` (use `toJS`) - * `toJSlegacy` - * `toJSON` (use `toJS`) - * invoking `observe` and `inject` with plain javascript objects +* **Breaking change:** The arguments to `observe` listeners for computed and boxed observables have changed and are now consistent with the other apis. Instead of invoking the callback with `(newValue: T, oldValue: T)` they are now invoked with a single change object: `(change: {newValue: T, oldValue: T, object, type: "update"})` +* Using transaction is now deprecated, use `action` or `runInAction` instead. Transactions now will enter an `untracked` block as well, just as actions, which removes the conceptual difference. +* Upgraded to typescript 2 +* It is now possible to pass ES6 Maps to `observable` / observable maps. The map will be converted to an observable map (if keys are string like) +* Made `action` more debug friendly, it should now be easier to step through +* ObservableMap now has an additional method, `.replace(data)`, which is a combination of `clear()` and `merge(data)`. +* Passing a function to `observable` will now create a boxed observable refering to that function +* Fixed #603: exceptions in transaction breaks future reactions +* Fixed #698: createTransformer should support default arguments +* Transactions are no longer reported grouped in spy events. If you want to group events, use actions instead. +* Normalized `spy` events further. Computed values and actions now report `object` instead of `target` for the scope they have been applied to. +* The following deprecated methods have been removed: + * `transaction` + * `autorunUntil` + * `trackTransitions` + * `fastArray` + * `SimpleEventEmitter` + * `ObservableMap.toJs` (use `toJS`) + * `toJSlegacy` + * `toJSON` (use `toJS`) + * invoking `observe` and `inject` with plain javascript objects --- @@ -761,9 +767,9 @@ A deprecation message will now be printed if creating computed properties while ```javascript const x = observable({ - computedProp: function() { - return someComputation - } + computedProp: function() { + return someComputation + } }) // Due to automatic inferrence now available as computed property: @@ -776,9 +782,9 @@ Instead, to create a computed property, use: ```javascript observable({ - get computedProp() { - return someComputation - } + get computedProp() { + return someComputation + } }) ``` @@ -786,14 +792,14 @@ or alternatively: ```javascript observable({ - computedProp: computed(function() { - return someComputation - }) + computedProp: computed(function() { + return someComputation + }) }) ``` This change should avoid confusing experiences when trying to create methods that don't take arguments. -The current behavior will be kept as-is in the MobX 2.* range, +The current behavior will be kept as-is in the MobX 2.\* range, but from MobX 3 onward the argumentless functions will no longer be turned automatically into computed values; they will be treated the same as function with arguments. An observable _reference_ to the function will be made and the function itself will be preserved. @@ -803,10 +809,10 @@ N.B. If you want to introduce actions on an observable that modify its state, us ```javascript observable({ - counter: 0, - increment: action(function() { - this.counter++ - }) + counter: 0, + increment: action(function() { + this.counter++ + }) }) ``` @@ -824,74 +830,73 @@ Note, this only applies when using observable in this way; it doesn't apply when ### Misc -* Fixed #701: `toJS` sometimes failing to convert objects decorated with `@observable` (cause: `isObservable` sometimes returned false on these object) -* Fixed typings for `when` / `autorun` / `reaction`; they all return a disposer function. - +* Fixed #701: `toJS` sometimes failing to convert objects decorated with `@observable` (cause: `isObservable` sometimes returned false on these object) +* Fixed typings for `when` / `autorun` / `reaction`; they all return a disposer function. # 2.6.5 -* Added `move` operation to observable array, see [#697](https://github.com/mobxjs/mobx/pull/697) +* Added `move` operation to observable array, see [#697](https://github.com/mobxjs/mobx/pull/697) # 2.6.4 -* Fixed potential clean up issue if an exception was thrown from an intercept handler -* Improved typings of `asStructure` (by @nidu, see #687) -* Added support for `computed(asStructure(() => expr))` (by @yotambarzilay, see #685) +* Fixed potential clean up issue if an exception was thrown from an intercept handler +* Improved typings of `asStructure` (by @nidu, see #687) +* Added support for `computed(asStructure(() => expr))` (by @yotambarzilay, see #685) # 2.6.3 -* Fixed #603: exceptions in transaction breaks future reactions -* Improved typings of `toJS` -* Introduced `setReactionScheduler`. Internal api used by mobx-react@4 to be notified when reactions will be run +* Fixed #603: exceptions in transaction breaks future reactions +* Improved typings of `toJS` +* Introduced `setReactionScheduler`. Internal api used by mobx-react@4 to be notified when reactions will be run # 2.6.2 -* Changes related to `toJS` as mentioned in version `2.6.0` where not actually shipped. This has been fixed, so see release notes below. +* Changes related to `toJS` as mentioned in version `2.6.0` where not actually shipped. This has been fixed, so see release notes below. # 2.6.1 -* Introduced convenience `isArrayLike`: returns whether the argument is either a JS- or observable array. By @dslmeinte -* Improved readme. By @DavidLGoldberg -* Improved assertion message, by @ncammarate (See [#618](https://github.com/mobxjs/mobx/pull/618)) -* Added HashNode badge, by @sandeeppanda92 +* Introduced convenience `isArrayLike`: returns whether the argument is either a JS- or observable array. By @dslmeinte +* Improved readme. By @DavidLGoldberg +* Improved assertion message, by @ncammarate (See [#618](https://github.com/mobxjs/mobx/pull/618)) +* Added HashNode badge, by @sandeeppanda92 # 2.6.0 _Marked as minor release as the behavior of `toJS` has been changed, which might be interpreted both as bug-fix or as breaking change, depending of how you interpreted the docs_ -* Fixed [#566](https://github.com/mobxjs/mobx/pull/566): Fixed incorrect behavior of `toJS`: `toJS` will now only recurse into observable object, not all objects. The new behavior is now aligned with what is suggested in the docs, but as a result the semantics changed a bit. `toJSlegacy` will be around for a while implementing the old behavior. See [#589](See https://github.com/mobxjs/mobx/pull/589) for more details. -* Fixed [#571](https://github.com/mobxjs/mobx/pull/571): Don't use `instanceof` operator. Should fix issues if MobX is included multiple times in the same bundle. -* Fixed [#576](https://github.com/mobxjs/mobx/pull/576): disallow passing actions directly to `autorun`; as they won't be tracked by @jeffijoe -* Extending observable objects with other observable (objects) is now explicitly forbidden, fixes [#540](https://github.com/mobxjs/mobx/pull/540). +* Fixed [#566](https://github.com/mobxjs/mobx/pull/566): Fixed incorrect behavior of `toJS`: `toJS` will now only recurse into observable object, not all objects. The new behavior is now aligned with what is suggested in the docs, but as a result the semantics changed a bit. `toJSlegacy` will be around for a while implementing the old behavior. See [#589](See https://github.com/mobxjs/mobx/pull/589) for more details. +* Fixed [#571](https://github.com/mobxjs/mobx/pull/571): Don't use `instanceof` operator. Should fix issues if MobX is included multiple times in the same bundle. +* Fixed [#576](https://github.com/mobxjs/mobx/pull/576): disallow passing actions directly to `autorun`; as they won't be tracked by @jeffijoe +* Extending observable objects with other observable (objects) is now explicitly forbidden, fixes [#540](https://github.com/mobxjs/mobx/pull/540). # 2.5.2 -* Introduced `isComputed` -* Observable objects can now have a type: `IObservableObject`, see [#484](https://github.com/mobxjs/mobx/pull/484) by @spiffytech -* Restored 2.4 behavior of boxed observables inside observable objects, see [#558](https://github.com/mobxjs/mobx/issues/558) +* Introduced `isComputed` +* Observable objects can now have a type: `IObservableObject`, see [#484](https://github.com/mobxjs/mobx/pull/484) by @spiffytech +* Restored 2.4 behavior of boxed observables inside observable objects, see [#558](https://github.com/mobxjs/mobx/issues/558) # 2.5.1 -* Computed properties can now be created by using getter / setter functions. This is the idiomatic way to introduce computed properties from now on: +* Computed properties can now be created by using getter / setter functions. This is the idiomatic way to introduce computed properties from now on: ```javascript const box = observable({ - length: 2, - get squared() { - return this.length * this.length - }, - set squared(value) { - this.length = Math.sqrt(value) - } + length: 2, + get squared() { + return this.length * this.length + }, + set squared(value) { + this.length = Math.sqrt(value) + } }) ``` # 2.5.0 -* Core derivation algorithm has received some majore improvements by @asterius1! See below. Pr #452, 489 -* Introduced setters for computed properties, use `computed(expr, setter)` or `@computed get name() { return expr } set name (value) { action }`. `computed` can now be used as modifier in `observable` / `extendObservable`, #421, #463 (see below for example) -* Introduced `isStrictModeEnabled()`, deprecated `useStrict()` without arguments, see #464 -* Fixed #505, accessing an observable property throws before it is initialized +* Core derivation algorithm has received some majore improvements by @asterius1! See below. Pr #452, 489 +* Introduced setters for computed properties, use `computed(expr, setter)` or `@computed get name() { return expr } set name (value) { action }`. `computed` can now be used as modifier in `observable` / `extendObservable`, #421, #463 (see below for example) +* Introduced `isStrictModeEnabled()`, deprecated `useStrict()` without arguments, see #464 +* Fixed #505, accessing an observable property throws before it is initialized MobX is now able track and memoize computed values while an (trans)action is running. Before 2.5, accessing a computed value during a transaction always resulted in a recomputation each time the computed value was accessed, because one of the upstream observables (might) have changed. @@ -900,123 +905,130 @@ This means that computed values are now always memoized for the duration of the In specific cases, this might signficantly speed up actions that extensively make decisions based on computed values. Example: + ```javascript class Square { - @observable length = 2 - @computed get squared() { - return this.length * this.length - } - // mobx now supports setters for computed values - set squared(surfaceSize) { - this.length = Math.sqrt(surfaceSize) - } - - // core changes make actions more efficient if extensively using computed values: - @action stuff() { - this.length = 3 - console.log(this.squared) // recomputes in both 2.5 and before - console.log(this.squared) // no longer recomputes - this.length = 4 - console.log(this.squared) // recomputes in both 2.5 and before - // after the action, before 2.5 squared would compute another time (if in use by a reaction), that is no longer the case - } + @observable length = 2 + @computed + get squared() { + return this.length * this.length + } + // mobx now supports setters for computed values + set squared(surfaceSize) { + this.length = Math.sqrt(surfaceSize) + } + + // core changes make actions more efficient if extensively using computed values: + @action + stuff() { + this.length = 3 + console.log(this.squared) // recomputes in both 2.5 and before + console.log(this.squared) // no longer recomputes + this.length = 4 + console.log(this.squared) // recomputes in both 2.5 and before + // after the action, before 2.5 squared would compute another time (if in use by a reaction), that is no longer the case + } } ``` ES5 example for setters: + ```javascript function Square() { - extendObservable(this, { - length: 2, - squared: computed( - function() { - return this.squared * this.squared - }, - function(surfaceSize) { - this.length = Math.sqrt(surfaceSize) - } - ) - }) + extendObservable(this, { + length: 2, + squared: computed( + function() { + return this.squared * this.squared + }, + function(surfaceSize) { + this.length = Math.sqrt(surfaceSize) + } + ) + }) } ``` # 2.4.4 -* Fixed #503: map.delete returns boolean -* Fix return type of `runInAction`, #499 by @Strate -* Fixed enumerability of observable array methods, see #496. -* Use TypeScript typeguards, #487 by @Strate -* Added overloads to `action` for better type inference, #500 by @Strate -* Fixed #502: `extendObservable` fails on objects created with `Object.create(null)` -* Implemented #480 / #488: better typings for `asMap`, by @Strate +* Fixed #503: map.delete returns boolean +* Fix return type of `runInAction`, #499 by @Strate +* Fixed enumerability of observable array methods, see #496. +* Use TypeScript typeguards, #487 by @Strate +* Added overloads to `action` for better type inference, #500 by @Strate +* Fixed #502: `extendObservable` fails on objects created with `Object.create(null)` +* Implemented #480 / #488: better typings for `asMap`, by @Strate # 2.4.3 -* Objects with a `null` prototype are now considered plain objects as well -* Improved error message for non-converging cyclic reactions -* Fixed potential HMR issue +* Objects with a `null` prototype are now considered plain objects as well +* Improved error message for non-converging cyclic reactions +* Fixed potential HMR issue # 2.4.2 -* Improved error message when wrongly using `@computed`, by @bb (#450) -* `observableArray.slice` now automatically converts observable arrays to plain arrays, fixes #460 -* Improved error message when an uncaught exception is thrown by a MobX tracked function +* Improved error message when wrongly using `@computed`, by @bb (#450) +* `observableArray.slice` now automatically converts observable arrays to plain arrays, fixes #460 +* Improved error message when an uncaught exception is thrown by a MobX tracked function # 2.4.1 -* `@action` decorated methods are now configurable. Fixes #441 -* The `onBecomeObserved` event handler is now triggered when an atom is observed, instead of when it is bound as dependency. Fixes #427 and makes atoms easier to extend. -* if `useStrict()` is invoked without arguments, it now returns the current value of strict mode. -* the current reaction is now always passed as first argument to the callbacks of `autorun`, `autorunAsync`, `when` and `reaction`. This allows reactions to be immediately disposed during the first run. See #438, by @andykog +* `@action` decorated methods are now configurable. Fixes #441 +* The `onBecomeObserved` event handler is now triggered when an atom is observed, instead of when it is bound as dependency. Fixes #427 and makes atoms easier to extend. +* if `useStrict()` is invoked without arguments, it now returns the current value of strict mode. +* the current reaction is now always passed as first argument to the callbacks of `autorun`, `autorunAsync`, `when` and `reaction`. This allows reactions to be immediately disposed during the first run. See #438, by @andykog # 2.4.0 -* _Note: the internal version of MobX has been bumped. This version has no breaking api changes, but if you have MobX loaded multiple times in your project, they all have to be upgraded to `2.4.0`. MobX will report this when starting._ -* Made dependency tracking and binding significant faster. Should result in huge performance improvements when working with large collections. -* Fixed typescript decorator issue, #423, #425? (by @bb) +* _Note: the internal version of MobX has been bumped. This version has no breaking api changes, but if you have MobX loaded multiple times in your project, they all have to be upgraded to `2.4.0`. MobX will report this when starting._ +* Made dependency tracking and binding significant faster. Should result in huge performance improvements when working with large collections. +* Fixed typescript decorator issue, #423, #425? (by @bb) # 2.3.7 -* Fixed issue where computed values were tracked and accidentally kept alive during actions +* Fixed issue where computed values were tracked and accidentally kept alive during actions # 2.3.6 -* Fixed #406: Observable maps doesn't work with empty initial value in Safari -* Implemented #357, #348: ObservableMap and ObservableArray now support iterators. Use [`@@iterator()` or iterall](https://github.com/leebyron/iterall) in ES5 environments. + +* Fixed #406: Observable maps doesn't work with empty initial value in Safari +* Implemented #357, #348: ObservableMap and ObservableArray now support iterators. Use [`@@iterator()` or iterall](https://github.com/leebyron/iterall) in ES5 environments. # 2.3.5 -* Fixed #364: Observable arrays not reacting properly to index assignments under iOS safari (mobile) 9.1.1 By @andykog -* Fixed #387: Typings of boxed values -* Added warning when reading array entries out of bounds. See #381 +* Fixed #364: Observable arrays not reacting properly to index assignments under iOS safari (mobile) 9.1.1 By @andykog +* Fixed #387: Typings of boxed values +* Added warning when reading array entries out of bounds. See #381 # 2.3.4 -* Fixed #360: Removed expensive cycle detection (cycles are still detected, but a bit later) -* Fixed #377: `toJS` serialization of Dates and Regexes preserves the original values -* Fixed #379: `@action` decorated methods can now be inherited / overriden +* Fixed #360: Removed expensive cycle detection (cycles are still detected, but a bit later) +* Fixed #377: `toJS` serialization of Dates and Regexes preserves the original values +* Fixed #379: `@action` decorated methods can now be inherited / overriden # 2.3.3 -* Fixed #186: Log a warning instead of an error if an exception is thrown in a derivation. Fixes issue where React Native would produce unusable error screens (because it shows the first logged error) -* Fixed #333: Fixed some interoperability issues in combination with `Reflect` / `InversifyJS` decorators. @andykog -* Fixed #333: `@observable` class properties are now _owned_ by their instance again, meaning they will show up in `Object.keys()` and `.hasOwnProperty` @andykog +* Fixed #186: Log a warning instead of an error if an exception is thrown in a derivation. Fixes issue where React Native would produce unusable error screens (because it shows the first logged error) +* Fixed #333: Fixed some interoperability issues in combination with `Reflect` / `InversifyJS` decorators. @andykog +* Fixed #333: `@observable` class properties are now _owned_ by their instance again, meaning they will show up in `Object.keys()` and `.hasOwnProperty` @andykog # 2.3.2 -* Fixed #328: Fixed exception when inspecting observable in `onBecomeObserved` -* Fixed #341: `array.find` now returns `undefined` instead of `null` when nothing was found, behavior now matches the docs. (By @hellectronic) +* Fixed #328: Fixed exception when inspecting observable in `onBecomeObserved` +* Fixed #341: `array.find` now returns `undefined` instead of `null` when nothing was found, behavior now matches the docs. (By @hellectronic) # 2.3.1 -* Fixed #327: spy not working with runInAction +* Fixed #327: spy not working with runInAction # 2.3.0 ### Introduced `whyRun`: + Usage: -* `whyRun()` -* `whyRun(Reaction object / ComputedValue object / disposer function)` -* `whyRun(object, "computed property name")` + +* `whyRun()` +* `whyRun(Reaction object / ComputedValue object / disposer function)` +* `whyRun(object, "computed property name")` `whyRun` is a small utility that can be used inside computed value or reaction (`autorun`, `reaction` or the `render` method of an `observer` React component) and prints why the derivation is currently running, and under which circumstances it will run again. @@ -1025,120 +1037,123 @@ This should help to get a deeper understanding when and why MobX runs stuff, and This feature can probably be improved based on your feedback, so feel free to file issues with suggestions! ### Semantic changes: -* `@observable` is now always defined on the class prototypes and not in the instances. This means that `@observable` properties are enumerable, but won't appear if `Object.keys` or `hasOwnProperty` is used on a class _instance_. -* Updated semantics of `reaction` as discussed in `#278`. The expression now needs to return a value and the side effect won't be triggered if the result didn't change. `asStructure` is supported in these cases. In contrast to MobX 2.2, effects will no longer be run if the output of the expression didn't change. + +* `@observable` is now always defined on the class prototypes and not in the instances. This means that `@observable` properties are enumerable, but won't appear if `Object.keys` or `hasOwnProperty` is used on a class _instance_. +* Updated semantics of `reaction` as discussed in `#278`. The expression now needs to return a value and the side effect won't be triggered if the result didn't change. `asStructure` is supported in these cases. In contrast to MobX 2.2, effects will no longer be run if the output of the expression didn't change. ### Enhancements -* Introduces `isAction(fn)` #290 -* If an (argumentless) action is passed to `observable` / `extendObservable`, it will not be converted into a computed property. -* Fixed #285: class instances are now also supported by `toJS`. Also members defined on prototypes which are enumerable are converted. -* Map keys are now always coerced to strings. Fixes #308 -* `when`, `autorun` and `autorunAsync` now accept custom debug names (see #293, by @jamiewinder) -* Fixed #286: autoruns no longer stop working if an action throws an exception -* Implemented `runInAction`, can be used to create on the fly actions (especially useful in combination with `async/await`, see #299 -* Improved performance and reduced mem usage of decorators signficantly (by defining the properties on the prototype if possible), and removed subtle differences between the implementation and behavior in babel and typescript. -* Updated logo as per #244. Tnx @osenvosem! +* Introduces `isAction(fn)` #290 +* If an (argumentless) action is passed to `observable` / `extendObservable`, it will not be converted into a computed property. +* Fixed #285: class instances are now also supported by `toJS`. Also members defined on prototypes which are enumerable are converted. +* Map keys are now always coerced to strings. Fixes #308 +* `when`, `autorun` and `autorunAsync` now accept custom debug names (see #293, by @jamiewinder) +* Fixed #286: autoruns no longer stop working if an action throws an exception +* Implemented `runInAction`, can be used to create on the fly actions (especially useful in combination with `async/await`, see #299 +* Improved performance and reduced mem usage of decorators signficantly (by defining the properties on the prototype if possible), and removed subtle differences between the implementation and behavior in babel and typescript. +* Updated logo as per #244. Tnx @osenvosem! # 2.2.2: -* Fixed issue #267: exception when `useStrict(true)` was invoked in combination with `@observable` attributes when using Babel -* Fixed issue #269: @action in combination with typescript targeting ES6 and reflect.ts -* Improved compatibility with `JSON.stringify`, removed incorrect deprecation message -* Improved some error messages +* Fixed issue #267: exception when `useStrict(true)` was invoked in combination with `@observable` attributes when using Babel +* Fixed issue #269: @action in combination with typescript targeting ES6 and reflect.ts +* Improved compatibility with `JSON.stringify`, removed incorrect deprecation message +* Improved some error messages # 2.2.1 -* Fixed issue where typescript threw a compile error when using `@action` without params on a field -* Fixed issue where context was accidentally shared between class instances when using `@action` on a field +* Fixed issue where typescript threw a compile error when using `@action` without params on a field +* Fixed issue where context was accidentally shared between class instances when using `@action` on a field # 2.2.0 See the [release announcement](https://medium.com/@mweststrate/45cdc73c7c8d) for the full details of this release: Introduced: -* `action` / `@action` -* `intercept` -* `spy` -* `reaction` -* `useStrict` -* improved debug names -* `toJSON` was renamed to `toJS` -* `observable(asMap())` is the new idiomatic way to create maps -* the effect of `when` is now untracked, similar to `reaction. -* `extras.trackTransations` is deprecated, use `spy` instead -* `untracked` has been undeprecated -* introduced / documented: `getAtom`, `getDebugName`, `isSpyEnabled`, `spyReport`, `spyReportStart`, `spyReportEnd` -* deprecated `extras.SimpleEventEmitter` -* array splice events now also report the `added` collection and `removedCount` + +* `action` / `@action` +* `intercept` +* `spy` +* `reaction` +* `useStrict` +* improved debug names +* `toJSON` was renamed to `toJS` +* `observable(asMap())` is the new idiomatic way to create maps +* the effect of `when` is now untracked, similar to `reaction. +* `extras.trackTransations` is deprecated, use `spy` instead +* `untracked` has been undeprecated +* introduced / documented: `getAtom`, `getDebugName`, `isSpyEnabled`, `spyReport`, `spyReportStart`, `spyReportEnd` +* deprecated `extras.SimpleEventEmitter` +* array splice events now also report the `added` collection and `removedCount` # 2.1.7 -* Fixed a false negative in cycle detection, as reported in #236 +* Fixed a false negative in cycle detection, as reported in #236 # 2.1.6 -* Fixed #236, #237 call stack issues when working with large arrays +* Fixed #236, #237 call stack issues when working with large arrays # 2.1.5 -* Fix #222 (by @andykog) run `observe` callback of computed properties in untracked mode. +* Fix #222 (by @andykog) run `observe` callback of computed properties in untracked mode. # 2.1.4 -* Fixed #201 (see also #160), another iOS enumerability issue... By @luosong +* Fixed #201 (see also #160), another iOS enumerability issue... By @luosong # 2.1.3 -* Fixed #191, when using babel, complex field initializers where shared. By @andykog -* Added `lib/mobx.umd.min.js` for minified cdn builds, see #85 +* Fixed #191, when using babel, complex field initializers where shared. By @andykog +* Added `lib/mobx.umd.min.js` for minified cdn builds, see #85 # 2.1.2 -* Improved debug names of objects created using a constructor -* Fixed(?) some issues with iOS7 as reported in #60 by @bstst +* Improved debug names of objects created using a constructor +* Fixed(?) some issues with iOS7 as reported in #60 by @bstst # 2.1.1 -* Fixed issue where `autorun`s created inside `autorun`s were not always kicked off. (`mobx-react`'s `observer` was not affected). Please upgrade if you often use autorun. -* Fixed typings of `mobx.map`, a list of entries is also acceptable. -* (Experimental) Improved error recovery a bit further +* Fixed issue where `autorun`s created inside `autorun`s were not always kicked off. (`mobx-react`'s `observer` was not affected). Please upgrade if you often use autorun. +* Fixed typings of `mobx.map`, a list of entries is also acceptable. +* (Experimental) Improved error recovery a bit further # 2.1.0 -* MobX is now chatty again when an exception occurs inside a autorun / computed value / React.render. Previously this was considered to be the responsibility of the surrounding code. But if exceptions were eaten this would be really tricky to debug. -* (Experimental) MobX will now do a poor attempt to recover from exceptions that occured in autorun / computed value / React.render. +* MobX is now chatty again when an exception occurs inside a autorun / computed value / React.render. Previously this was considered to be the responsibility of the surrounding code. But if exceptions were eaten this would be really tricky to debug. +* (Experimental) MobX will now do a poor attempt to recover from exceptions that occured in autorun / computed value / React.render. # 2.0.6 -* `resetGlobalState` is now part of the `mobx.extras` namespace, as it is useful for test setup, to restore inconsistent state after test failures. -* `resetGlobalState` now also resets the caches of `createTransformer`, see #163. +* `resetGlobalState` is now part of the `mobx.extras` namespace, as it is useful for test setup, to restore inconsistent state after test failures. +* `resetGlobalState` now also resets the caches of `createTransformer`, see #163. # 2.0.5 -* WIP on bower support +* WIP on bower support # 2.0.4 -* `$transformId` property on transformed objects should be non-enumerable. Fixes #170. +* `$transformId` property on transformed objects should be non-enumerable. Fixes #170. # 2.0.3 -* Always peek if inspecting a stale, computed value. Fixes #165. +* Always peek if inspecting a stale, computed value. Fixes #165. # 2.0.2 -* Fixed issue where changing an object property was tracked, which could lead to unending loops in `autorunAsync`. +* Fixed issue where changing an object property was tracked, which could lead to unending loops in `autorunAsync`. # 2.0.1 -* Undeprecated `observable(scalar)` (see 143) -* `expr` no longer prints incorrect deprecated messages (see 143) -* Requires `mobx` twice no longer fails. +* Undeprecated `observable(scalar)` (see 143) +* `expr` no longer prints incorrect deprecated messages (see 143) +* Requires `mobx` twice no longer fails. # 2.0.0 ## A new name... + Welcome to ~Mobservable~ MobX 2! First of all, there is the name change. The new name is shorter and funnier and it has the right emphasis: MobX is about reactive programming. Not about observability of data structures, which is just a technical necessity. @@ -1155,6 +1170,7 @@ Besides that, MobX is just a large collection of minor improvements over Mobserv Make sure to remove your old `mobservable` dependencies when installing the new `mobx` dependencies! ## `autorun`s are now allowed to cause cycles! + `autorun` is now allowed to have cycles. In Mobservable 1 an exception was thrown as soon as an autorun modified a variable which it was reading as well. In MobX 2 these situations are now allowed and the autorun will trigger itself to be fired again immediately after the current execution. This is fine as long as the autorun terminates within a reasonable amount of iterations (100). @@ -1167,10 +1183,11 @@ Creating an observable from a primitive or a reference no longer returns a gette This is less confusing, easier to debug and more efficient. So to read or write from an observable scalar use: + ```javascript -const temperature = observable(27); -temperature.set(15); // previously: temperature(15) -temperature.get(); // previously: temperature() +const temperature = observable(27) +temperature.set(15) // previously: temperature(15) +temperature.get() // previously: temperature() ``` `observable(scalar)` has been deprecated to make the api smaller and the syntax more uniform. In practice having observable objects, arrays and decorators seems to suffice in 99% of the cases. Deprecating this functionality means that people have simply less concepts to learn. Probably creating observable scalars will continue to work for a long time, as it is important to the internals of MobX and very convenient for testing. @@ -1200,90 +1217,90 @@ In MobX 2 it is no longer allowed for a computed function or `autorun` to throw ## Improved build -* MobX is roughly 20% faster -* MobX is smaller: 75KB -> 60KB unminified, and 54KB -> 30KB minified. -* Distributable builds are no longer available in the git repository, use unpkg instead: -* Commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.js -* Minified commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.min.js -* UMD build: https://unpkg.com/mobx@^2.0.0/lib/mobx.umd.js -* To use the minified build, require / import the lib from `"mobx/lib/mobx.min.js"` (or set up an alias in your webpack configuration if applicable) +* MobX is roughly 20% faster +* MobX is smaller: 75KB -> 60KB unminified, and 54KB -> 30KB minified. +* Distributable builds are no longer available in the git repository, use unpkg instead: +* Commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.js +* Minified commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.min.js +* UMD build: https://unpkg.com/mobx@^2.0.0/lib/mobx.umd.js +* To use the minified build, require / import the lib from `"mobx/lib/mobx.min.js"` (or set up an alias in your webpack configuration if applicable) ## Other changes -* Improved debug names of all observables. This is especially visible when using `mobx-react-devtools` or `extras.trackTransitions`. -* Renamed `extras.SimpleEventEmitter` to `SimpleEventEmitter` -* Removed already deprecated methods: `isReactive`, `makeReactive`, `observeUntil`, `observeAsync` -* Removed `extras.getDNode` -* Invoking `ObservableArray.peek` is no longer registered as listener -* Deprecated `untracked`. It wasn't documented and nobody seems to miss it. +* Improved debug names of all observables. This is especially visible when using `mobx-react-devtools` or `extras.trackTransitions`. +* Renamed `extras.SimpleEventEmitter` to `SimpleEventEmitter` +* Removed already deprecated methods: `isReactive`, `makeReactive`, `observeUntil`, `observeAsync` +* Removed `extras.getDNode` +* Invoking `ObservableArray.peek` is no longer registered as listener +* Deprecated `untracked`. It wasn't documented and nobody seems to miss it. # 1.2.5 -* Map no longer throws when `.has`, `.get` or `.delete` is invoked with an invalid key (#116) -* Files are now compiled without sourcemap to avoid issues when loading mobservable in a debugger when `src/` folder is not available. +* Map no longer throws when `.has`, `.get` or `.delete` is invoked with an invalid key (#116) +* Files are now compiled without sourcemap to avoid issues when loading mobservable in a debugger when `src/` folder is not available. # 1.2.4 -* Fixed: observable arrays didn't properly apply modifiers if created using `asFlat([])` or `fastArray([])` -* Don't try to make frozen objects observable (by @andykog) -* `observableArray.reverse` no longer mutates the arry but just returns a sorted copy -* Updated tests to use babel6 +* Fixed: observable arrays didn't properly apply modifiers if created using `asFlat([])` or `fastArray([])` +* Don't try to make frozen objects observable (by @andykog) +* `observableArray.reverse` no longer mutates the arry but just returns a sorted copy +* Updated tests to use babel6 # 1.2.3 -* observableArray.sort no longer mutates the array being sorted but returns a sorted clone instead (#90) -* removed an incorrect internal state assumption (#97) +* observableArray.sort no longer mutates the array being sorted but returns a sorted clone instead (#90) +* removed an incorrect internal state assumption (#97) # 1.2.2 -* Add bower support +* Add bower support # 1.2.1 -* Computed value now yields consistent results when being inspected while in transaction +* Computed value now yields consistent results when being inspected while in transaction # 1.2.0 -* Implemented #67: Reactive graph transformations. See: http://mobxjs.github.io/mobservable/refguide/create-transformer.html +* Implemented #67: Reactive graph transformations. See: http://mobxjs.github.io/mobservable/refguide/create-transformer.html # 1.1.8 -* Implemented #59, `isObservable` and `observe` now support a property name as second param to observe individual values on maps and objects. +* Implemented #59, `isObservable` and `observe` now support a property name as second param to observe individual values on maps and objects. # 1.1.7 -* Fixed #77: package consumers with --noImplicitAny should be able to build +* Fixed #77: package consumers with --noImplicitAny should be able to build # 1.1.6 -* Introduced `mobservable.fastArray(array)`, in addition to `mobservable.observable(array)`. Which is much faster when adding items but doesn't support enumerability (`for (var idx in ar) ..` loops). -* Introduced `observableArray.peek()`, for fast access to the array values. Should be used read-only. +* Introduced `mobservable.fastArray(array)`, in addition to `mobservable.observable(array)`. Which is much faster when adding items but doesn't support enumerability (`for (var idx in ar) ..` loops). +* Introduced `observableArray.peek()`, for fast access to the array values. Should be used read-only. # 1.1.5 -* Fixed 71: transactions should not influence running computations +* Fixed 71: transactions should not influence running computations # 1.1.4 -* Fixed #65; illegal state exception when using a transaction inside a reactive function. Credits: @kmalakoff +* Fixed #65; illegal state exception when using a transaction inside a reactive function. Credits: @kmalakoff # 1.1.3 -* Fixed #61; if autorun was created during a transaction, postpone execution until the end of the transaction +* Fixed #61; if autorun was created during a transaction, postpone execution until the end of the transaction # 1.1.2 -* Fixed exception when autorunUntil finished immediately +* Fixed exception when autorunUntil finished immediately # 1.1.1 -* `toJSON` now serializes object trees with cycles as well. If you know the object tree is acyclic, pass in `false` as second parameter for a performance gain. +* `toJSON` now serializes object trees with cycles as well. If you know the object tree is acyclic, pass in `false` as second parameter for a performance gain. # 1.1.0 -* Exposed `ObservableMap` type -* Introduced `mobservable.untracked(block)` -* Introduced `mobservable.autorunAsync(block, delay)` +* Exposed `ObservableMap` type +* Introduced `mobservable.untracked(block)` +* Introduced `mobservable.autorunAsync(block, delay)` # 1.0.9 @@ -1299,113 +1316,113 @@ Fix incompatibility issue with systemjs bundler (see PR 52) # 1.0.4/5 -* `map.size` is now a property instead of a function -* `map()` now accepts an array as entries to construct the new map -* introduced `isObservableObject`, `isObservableArray` and `isObservableMap` -* introduced `observe`, to observe observable arrays, objects and maps, similarly to Object.observe and Array.observe +* `map.size` is now a property instead of a function +* `map()` now accepts an array as entries to construct the new map +* introduced `isObservableObject`, `isObservableArray` and `isObservableMap` +* introduced `observe`, to observe observable arrays, objects and maps, similarly to Object.observe and Array.observe # 1.0.3 -* `extendObservable` now supports passing in multiple object properties +* `extendObservable` now supports passing in multiple object properties # 1.0.2 -* added `mobservable.map()`, which creates a new map similarly to ES6 maps, yet observable. Until properly documentation, see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). +* added `mobservable.map()`, which creates a new map similarly to ES6 maps, yet observable. Until properly documentation, see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). # 1.0.1 -* Stricter argument checking for several apis. +* Stricter argument checking for several apis. # 1.0 ## Renames -* `isReactive` -> `isObservable` -* `makeReactive` -> `observable` -* `extendReactive` -> `extendObservable` -* `observe` -> `autorun` -* `observeUntil` -> `autorunUntil` -* `observeAsync` -> `autorunAsync` -* `reactiveComponent` -> `observer` (in `mobservable-react` package) +* `isReactive` -> `isObservable` +* `makeReactive` -> `observable` +* `extendReactive` -> `extendObservable` +* `observe` -> `autorun` +* `observeUntil` -> `autorunUntil` +* `observeAsync` -> `autorunAsync` +* `reactiveComponent` -> `observer` (in `mobservable-react` package) ## Breaking changes -* dropped the `strict` and `logLevel` settings of mobservable. View functions are by default run in `strict` mode, `autorun` (formerly: `observe`) functions in `non-strict` mode (strict indicates that it is allowed to change other observable values during the computation of a view funtion). -Use `extras.withStrict(boolean, block)` if you want to deviate from the default behavior. -* `observable` (formerly `makeReactive`) no longer accepts an options object. The modifiers `asReference`, `asStructure` and `asFlat` can be used instead. -* dropped the `default` export of observable -* Removed all earlier deprecated functions +* dropped the `strict` and `logLevel` settings of mobservable. View functions are by default run in `strict` mode, `autorun` (formerly: `observe`) functions in `non-strict` mode (strict indicates that it is allowed to change other observable values during the computation of a view funtion). + Use `extras.withStrict(boolean, block)` if you want to deviate from the default behavior. +* `observable` (formerly `makeReactive`) no longer accepts an options object. The modifiers `asReference`, `asStructure` and `asFlat` can be used instead. +* dropped the `default` export of observable +* Removed all earlier deprecated functions ## Bugfixes / improvements -* `mobservable` now ships with TypeScript 1.6 compliant module typings, no external typings file is required anymore. -* `mobservable-react` supports React Native as well through the import `"mobservable-react/native"`. -* Improved debugger support -* `for (var key in observablearray)` now lists the correct keys -* `@observable` now works correct on classes that are transpiled by either TypeScript or Babel (Not all constructions where supported in Babel earlier) -* Simplified error handling, mobservable will no longer catch errors in views, which makes the stack traces easier to debug. -* Removed the initial 'welcom to mobservable' logline that was printed during start-up. +* `mobservable` now ships with TypeScript 1.6 compliant module typings, no external typings file is required anymore. +* `mobservable-react` supports React Native as well through the import `"mobservable-react/native"`. +* Improved debugger support +* `for (var key in observablearray)` now lists the correct keys +* `@observable` now works correct on classes that are transpiled by either TypeScript or Babel (Not all constructions where supported in Babel earlier) +* Simplified error handling, mobservable will no longer catch errors in views, which makes the stack traces easier to debug. +* Removed the initial 'welcom to mobservable' logline that was printed during start-up. # 0.7.1 -* Backported Babel support for the @observable decorator from the 1.0 branch. The decorator should now behave the same when compiled with either Typescript or Babeljs. +* Backported Babel support for the @observable decorator from the 1.0 branch. The decorator should now behave the same when compiled with either Typescript or Babeljs. # 0.7.0 -* Introduced `strict` mode (see issues [#30](), [#31]()) -* Renamed `sideEffect` to `observe` -* Renamed `when` to `observeUntil` -* Introduced `observeAsync`. -* Fixed issue where changing the `logLevel` was not picked up. -* Improved typings. -* Introduces `asStructure` (see [#8]()) and `asFlat`. -* Assigning a plain object to a reactive structure no longer clones the object, instead, the original object is decorated. (Arrays are still cloned due to Javascript limitations to extend arrays). -* Reintroduced `expr(func)` as shorthand for `makeReactive(func)()`, which is useful to create temporarily views inside views -* Deprecated the options object that could be passed to `makeReactive`. -* Deprecated the options object that could be passed to `makeReactive`: - * A `thisArg` can be passed as second param. - * A name (for debugging) can be passed as second or third param - * The `as` modifier is no longer needed, use `asReference` (instead of `as:'reference'`) or `asFlat` (instead of `recurse:false`). +* Introduced `strict` mode (see issues [#30](), [#31]()) +* Renamed `sideEffect` to `observe` +* Renamed `when` to `observeUntil` +* Introduced `observeAsync`. +* Fixed issue where changing the `logLevel` was not picked up. +* Improved typings. +* Introduces `asStructure` (see [#8]()) and `asFlat`. +* Assigning a plain object to a reactive structure no longer clones the object, instead, the original object is decorated. (Arrays are still cloned due to Javascript limitations to extend arrays). +* Reintroduced `expr(func)` as shorthand for `makeReactive(func)()`, which is useful to create temporarily views inside views +* Deprecated the options object that could be passed to `makeReactive`. +* Deprecated the options object that could be passed to `makeReactive`: + * A `thisArg` can be passed as second param. + * A name (for debugging) can be passed as second or third param + * The `as` modifier is no longer needed, use `asReference` (instead of `as:'reference'`) or `asFlat` (instead of `recurse:false`). # 0.6.10 -* Fixed issue where @observable did not properly create a stand-alone view +* Fixed issue where @observable did not properly create a stand-alone view # 0.6.9 -* Fixed bug where views where sometimes not triggered again if the dependency tree changed to much. +* Fixed bug where views where sometimes not triggered again if the dependency tree changed to much. # 0.6.8 -* Introduced `when`, which, given a reactive predicate, observes it until it returns true. -* Renamed `sideEffect -> observe` +* Introduced `when`, which, given a reactive predicate, observes it until it returns true. +* Renamed `sideEffect -> observe` # 0.6.7: -* Improved logging +* Improved logging # 0.6.6: -* Deprecated observable array `.values()` and `.clone()` -* Deprecated observeUntilInvalid; use sideEffect instead -* Renamed mobservable.toJson to mobservable.toJSON +* Deprecated observable array `.values()` and `.clone()` +* Deprecated observeUntilInvalid; use sideEffect instead +* Renamed mobservable.toJson to mobservable.toJSON # 0.6.5: -* It is no longer possible to create impure views; views that alter other reactive values. -* Update links to the new documentation. +* It is no longer possible to create impure views; views that alter other reactive values. +* Update links to the new documentation. # 0.6.4: -* 2nd argument of sideEffect is now the scope, instead of an options object which hadn't any useful properties +* 2nd argument of sideEffect is now the scope, instead of an options object which hadn't any useful properties # 0.6.3 -* Deprecated: reactiveComponent, reactiveComponent from the separate package mobservable-react should be used instead -* Store the trackingstack globally, so that multiple instances of mobservable can run together +* Deprecated: reactiveComponent, reactiveComponent from the separate package mobservable-react should be used instead +* Store the trackingstack globally, so that multiple instances of mobservable can run together # 0.6.2 -* Deprecated: @observable on functions (use getter functions instead) -* Introduced: `getDependencyTree`, `getObserverTree` and `trackTransitions` -* Minor performance improvements +* Deprecated: @observable on functions (use getter functions instead) +* Introduced: `getDependencyTree`, `getObserverTree` and `trackTransitions` +* Minor performance improvements diff --git a/package.json b/package.json index 4318f7a71..107e1148f 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "tape": "^4.2.2", "ts-jest": "^22.0.0", "tslib": "^1.7.1", + "tslint-config-prettier": "^1.17.0", "typescript": "^3.2.1", "uglify-es": "^3.3.9" }, @@ -118,4 +119,4 @@ "/node_modules/" ] } -} \ No newline at end of file +} diff --git a/src/api/flow.ts b/src/api/flow.ts index 4108494e9..34c9867ee 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -4,38 +4,29 @@ let generatorId = 0 export type CancellablePromise = Promise & { cancel(): void } -export interface FlowIterator { - next(value?: any): IteratorResult | Promise> - return?(value?: any): IteratorResult | Promise> - throw?(e?: any): IteratorResult | Promise> +export interface FlowYield { + // fake, only for typing + "!!flowYield": undefined } -export function flow(generator: () => FlowIterator): () => CancellablePromise -export function flow( - generator: (a1: A1) => FlowIterator -): (a1: A1) => CancellablePromise // Ideally we want to have R instead of Any, but cannot specify R without specifying A1 etc... 'any' as result is better then not specifying request args -export function flow( - generator: (a1: A1, a2: A2) => FlowIterator -): (a1: A1, a2: A2) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3) => FlowIterator -): (a1: A1, a2: A2, a3: A3) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3, a4: A4) => FlowIterator -): (a1: A1, a2: A2, a3: A3, a4: A4) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => FlowIterator -): (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6) => FlowIterator -): (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7) => FlowIterator -): (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7) => CancellablePromise -export function flow( - generator: (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8) => FlowIterator -): (a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8) => CancellablePromise -export function flow(generator: Function) { +export interface FlowReturn { + // fake, only for typing + "!!flowReturn": T +} + +// we skip promises that are the result of yielding promises (except if they use flowReturn) +export type FlowReturnType = IfAllAreFlowYieldThenVoid< + R extends FlowReturn ? FR : R extends Promise ? FlowYield : R +> + +// we extract yielded promises from the return type +export type IfAllAreFlowYieldThenVoid = Exclude extends never + ? void + : Exclude + +export function flow( + generator: (...args: Args) => IterableIterator +): (...args: Args) => CancellablePromise> { if (arguments.length !== 1) fail(process.env.NODE_ENV && `Flow expects one 1 argument and cannot be used as decorator`) const name = generator.name || "" @@ -49,7 +40,7 @@ export function flow(generator: Function) { let rejector: (error: any) => void let pendingPromise: CancellablePromise | undefined = undefined - const res = new Promise(function(resolve, reject) { + const promise = new Promise(function(resolve, reject) { let stepId = 0 rejector = reject @@ -96,7 +87,7 @@ export function flow(generator: Function) { onFulfilled(undefined) // kick off the process }) as any - res.cancel = action(`${name} - runid: ${runId} - cancel`, function() { + promise.cancel = action(`${name} - runid: ${runId} - cancel`, function() { try { if (pendingPromise) cancelPromise(pendingPromise) // Finally block can return (or yield) stuff.. @@ -111,10 +102,22 @@ export function flow(generator: Function) { rejector(e) // there could be a throwing finally block } }) - return res + return promise as CancellablePromise> } } function cancelPromise(promise) { if (typeof promise.cancel === "function") promise.cancel() } + +/** + * Used for TypeScript to force a flow to return a promise. + * + * @export + * @template T + * @param {T} val + * @returns {FlowReturn} + */ +export function castFlowReturn(val: T): FlowReturn { + return val as any +} diff --git a/src/mobx.ts b/src/mobx.ts index 6c618c710..22e6a7db0 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -29,7 +29,7 @@ try { // (in which case the expression below would be substituted with 'production') process.env.NODE_ENV } catch (e) { - var g = typeof window !== "undefined" ? window : global + const g = typeof window !== "undefined" ? window : global if (typeof process === "undefined") g.process = {} g.process.env = {} } @@ -143,7 +143,8 @@ export { isComputingDerivation as _isComputingDerivation, onReactionError, interceptReads as _interceptReads, - IComputedValueOptions + IComputedValueOptions, + castFlowReturn } from "./internal" // Devtools support diff --git a/tslint.json b/tslint.json index fb557aa0e..3085dbecb 100644 --- a/tslint.json +++ b/tslint.json @@ -1,55 +1,26 @@ { + "extends": ["tslint-config-prettier"], "rules": { "class-name": true, - "comment-format": [ - true, - "check-space" - ], + "comment-format": [true, "check-space"], "curly": false, - "indent": [ - true, - "tabs" - ], - "interface-name": true, + "interface-name": false, "jsdoc-format": true, - "no-consecutive-blank-lines" : true, + "no-consecutive-blank-lines": true, "no-debugger": true, "no-duplicate-key": true, "no-duplicate-variable": true, "no-eval": true, "no-internal-module": true, - "no-trailing-whitespace": true, "no-shadowed-variable": true, "no-switch-case-fall-through": true, "no-unreachable": true, "no-unused-expression": true, - "no_unused-variable": [ - true - ], + "no_unused-variable": [true], "no-use-before-declare": false, "no-var-keyword": true, - "one-line": [ - true, - "check-open-brace", - "check-whitespace", - "check-catch" - ], - "quotemark": [ - true, - "double" - ], - "semicolon": true, - "trailing-comma": [ - true, - { - "multiline": "never", - "singleline": "never" - } - ], - "triple-equals": [ - true, - "allow-null-check" - ], + "one-line": [true, "check-open-brace", "check-whitespace", "check-catch"], + "triple-equals": [true, "allow-null-check"], "typedef-whitespace": [ true, { @@ -60,17 +31,6 @@ "variable-declaration": "nospace" } ], - "variable-name": [ - true, - "ban-keywords" - ], - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type" - ] + "variable-name": [true, "ban-keywords"] } } diff --git a/yarn.lock b/yarn.lock index d4b11940d..c1d15e58e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6031,6 +6031,11 @@ tslib@^1.7.1: version "1.9.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7" +tslint-config-prettier@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz#946ed6117f98f3659a65848279156d87628c33dc" + integrity sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw== + tty-browserify@0.0.0, tty-browserify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" From fb09b3d7a77813a9f39469330323fb6390e22399 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 4 Dec 2018 18:38:29 +0100 Subject: [PATCH 0002/1043] fixed unit tests --- src/mobx.ts | 4 ++-- test/base/api.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mobx.ts b/src/mobx.ts index 22e6a7db0..a9547e92f 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -124,6 +124,7 @@ export { onBecomeObserved, onBecomeUnobserved, flow, + castFlowReturn, toJS, trace, IObserverTree, @@ -143,8 +144,7 @@ export { isComputingDerivation as _isComputingDerivation, onReactionError, interceptReads as _interceptReads, - IComputedValueOptions, - castFlowReturn + IComputedValueOptions } from "./internal" // Devtools support diff --git a/test/base/api.js b/test/base/api.js index f5094bf75..b26a71f21 100644 --- a/test/base/api.js +++ b/test/base/api.js @@ -20,6 +20,7 @@ test("correct api should be exposed", function() { "decorate", "extendObservable", "flow", + "castFlowReturn", "get", "_getAdministration", "getAtom", From 7f94889b31b504cbea35068bef658213a46bfbc3 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 11 Dec 2018 19:57:44 +0100 Subject: [PATCH 0003/1043] fix for castFlowReturn --- src/api/flow.ts | 6 ++++-- test/base/flow.js | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api/flow.ts b/src/api/flow.ts index 34c9867ee..d65f45ad2 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -16,7 +16,9 @@ export interface FlowReturn { // we skip promises that are the result of yielding promises (except if they use flowReturn) export type FlowReturnType = IfAllAreFlowYieldThenVoid< - R extends FlowReturn ? FR : R extends Promise ? FlowYield : R + R extends FlowReturn + ? FR extends Promise ? FRP : FR + : R extends Promise ? FlowYield : R > // we extract yielded promises from the return type @@ -111,7 +113,7 @@ function cancelPromise(promise) { } /** - * Used for TypeScript to force a flow to return a promise. + * Used for TypeScript to make flows that return a promise return the actual promise result. * * @export * @template T diff --git a/test/base/flow.js b/test/base/flow.js index 5b043cb33..f0cad50d0 100644 --- a/test/base/flow.js +++ b/test/base/flow.js @@ -1,6 +1,5 @@ import * as mobx from "../../src/mobx.ts" -import { castFlowReturn } from "../../src/mobx" -const { flow } = mobx +import { castFlowReturn, flow } from "../../src/mobx" function delay(time, value, shouldThrow = false) { return new Promise((resolve, reject) => { From 0612cb1f79f06f7e4875e815f1182807325235ea Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 24 Dec 2018 10:52:16 +0100 Subject: [PATCH 0004/1043] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c06f7826..ef61c6d43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -* Improved flow support in typescript. It will now infer arguments and return values correctly. The only exception is that when the `flow` wrapped function returns a `Promise` then it should `return castFlowReturn(somePromise)` to keep the type inference happy. +* Improved flow support in typescript. It will now infer arguments and return values correctly. # 5.8.0 / 4.8.0 From 16783ef1db4303dad717dea75215b67df1dfe81a Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 24 Dec 2018 10:53:25 +0100 Subject: [PATCH 0005/1043] Update flow.js --- test/base/flow.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/test/base/flow.js b/test/base/flow.js index f0cad50d0..cdcd6e8c1 100644 --- a/test/base/flow.js +++ b/test/base/flow.js @@ -1,5 +1,5 @@ import * as mobx from "../../src/mobx.ts" -import { castFlowReturn, flow } from "../../src/mobx" +import { flow } from "../../src/mobx" function delay(time, value, shouldThrow = false) { return new Promise((resolve, reject) => { @@ -349,7 +349,3 @@ test("cancelled flow should not result in runaway reject", async () => { expect("" + e).toBe("Error: FLOW_CANCELLED") } }) - -test("castFlowReturn should return the passed argument", () => { - expect(castFlowReturn(5)).toBe(5) -}) From 2cdb4797939b1f29e2db3ed248a2c63d16cf04bc Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 24 Dec 2018 10:53:55 +0100 Subject: [PATCH 0006/1043] Update api.js --- test/base/api.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/base/api.js b/test/base/api.js index b26a71f21..f5094bf75 100644 --- a/test/base/api.js +++ b/test/base/api.js @@ -20,7 +20,6 @@ test("correct api should be exposed", function() { "decorate", "extendObservable", "flow", - "castFlowReturn", "get", "_getAdministration", "getAtom", From e0d7e99bb08b08b373591faf26589ed3c6109167 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 24 Dec 2018 10:54:16 +0100 Subject: [PATCH 0007/1043] Update flow.ts --- src/api/flow.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/api/flow.ts b/src/api/flow.ts index d65f45ad2..f76213972 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -111,15 +111,3 @@ export function flow( function cancelPromise(promise) { if (typeof promise.cancel === "function") promise.cancel() } - -/** - * Used for TypeScript to make flows that return a promise return the actual promise result. - * - * @export - * @template T - * @param {T} val - * @returns {FlowReturn} - */ -export function castFlowReturn(val: T): FlowReturn { - return val as any -} From cec58eb8d8be2ed07c040760f7f93f18dd54ce70 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 24 Dec 2018 10:58:47 +0100 Subject: [PATCH 0008/1043] Update mobx.ts --- src/mobx.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mobx.ts b/src/mobx.ts index 39a0ed72c..4688f5a6f 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -125,7 +125,6 @@ export { onBecomeObserved, onBecomeUnobserved, flow, - castFlowReturn, toJS, trace, IObserverTree, From 728a82917afe6361c7dca88e21d5e72dc2118dcc Mon Sep 17 00:00:00 2001 From: Wee Date: Sun, 6 Jan 2019 23:11:18 +0800 Subject: [PATCH 0009/1043] feat: add `equals` option to `observable.box` (resolve #1580) --- src/api/observable.ts | 6 ++-- src/types/observablemap.ts | 9 ++++-- src/types/observableobject.ts | 4 +-- src/types/observablevalue.ts | 13 ++++++-- test/base/observables.js | 58 +++++++++++++++++++++++++++++++++-- 5 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/api/observable.ts b/src/api/observable.ts index b59ae12b0..2c3cd740c 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -1,5 +1,6 @@ import { IEnhancer, + IEqualsComparer, IObservableArray, IObservableDecorator, IObservableMapInitialValues, @@ -25,6 +26,7 @@ import { export type CreateObservableOptions = { name?: string + equals?: IEqualsComparer deep?: boolean defaultDecorator?: IObservableDecorator proxy?: boolean @@ -41,7 +43,7 @@ export const defaultCreateObservableOptions: CreateObservableOptions = { Object.freeze(defaultCreateObservableOptions) function assertValidOption(key: string) { - if (!/^(deep|name|defaultDecorator|proxy)$/.test(key)) + if (!/^(deep|name|equals|defaultDecorator|proxy)$/.test(key)) fail(`invalid option for (extend)observable: ${key}`) } @@ -142,7 +144,7 @@ const observableFactories: IObservableFactories = { box(value?: T, options?: CreateObservableOptions): IObservableValue { if (arguments.length > 2) incorrectlyUsedAsDecorator("box") const o = asCreateObservableOptions(options) - return new ObservableValue(value, getEnhancerFromOptions(o), o.name) + return new ObservableValue(value, getEnhancerFromOptions(o), o) }, array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray { if (arguments.length > 2) incorrectlyUsedAsDecorator("array") diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index eeb61382c..ac166fedd 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -174,7 +174,12 @@ export class ObservableMap if (entry) { entry.setNewValue(value) } else { - entry = new ObservableValue(value, referenceEnhancer, `${this.name}.${key}?`, false) + entry = new ObservableValue( + value, + referenceEnhancer, + { name: `${this.name}.${key}?` }, + false + ) this._hasMap.set(key, entry) } return entry @@ -210,7 +215,7 @@ export class ObservableMap const observable = new ObservableValue( newValue, this.enhancer, - `${this.name}.${key}`, + { name: `${this.name}.${key}` }, false ) this._data.set(key, observable) diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index b1f28c8eb..ee8f1579d 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -148,7 +148,7 @@ export class ObservableObjectAdministration entry = new ObservableValue( exists, referenceEnhancer, - `${this.name}.${key.toString()}?`, + { name: `${this.name}.${key.toString()}?` }, false ) map.set(key, entry) @@ -173,7 +173,7 @@ export class ObservableObjectAdministration const observable = new ObservableValue( newValue, enhancer, - `${this.name}.${propName}`, + { name: `${this.name}.${propName}` }, false ) this.values.set(propName, observable) diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 8436c75db..823d75e1c 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -2,10 +2,12 @@ import { Atom, IEnhancer, IInterceptable, + IEqualsComparer, IInterceptor, IListenable, Lambda, checkIfStateModificationsAreAllowed, + comparer, createInstanceofPredicate, getNextId, hasInterceptors, @@ -47,11 +49,15 @@ export class ObservableValue extends Atom changeListeners value dehancer: any + private equals: IEqualsComparer constructor( value: T, public enhancer: IEnhancer, - name = "ObservableValue@" + getNextId(), + { + name = "ObservableValue@" + getNextId(), + equals = comparer.default + }: { name?: string; equals?: IEqualsComparer }, notifySpy = true ) { super(name) @@ -60,6 +66,7 @@ export class ObservableValue extends Atom // only notify spy if this is a stand-alone observable spyReport({ type: "create", name: this.name, newValue: "" + this.value }) } + this.equals = equals } private dehanceValue(value: T): T { @@ -70,7 +77,9 @@ export class ObservableValue extends Atom public set(newValue: T) { const oldValue = this.value newValue = this.prepareNewValue(newValue) as any - if (newValue !== globalState.UNCHANGED) { + const changed = !this.equals(oldValue, newValue) + + if (newValue !== globalState.UNCHANGED && changed) { const notifySpy = isSpyEnabled() if (notifySpy && process.env.NODE_ENV !== "production") { spyReportStart({ diff --git a/test/base/observables.js b/test/base/observables.js index e2f78d4af..62e932e6b 100644 --- a/test/base/observables.js +++ b/test/base/observables.js @@ -149,6 +149,60 @@ test("dynamic2", function(done) { } }) +test("box uses equals", function(done) { + try { + var x = observable.box("a", { + equals: (oldValue, newValue) => { + return oldValue.toLowerCase() === newValue.toLowerCase() + } + }) + + var b = buffer() + m.observe(x, b) + + x.set("A") + x.set("b") + x.set("B") + x.set("C") + + expect(["b", "C"]).toEqual(b.toArray()) + expect(mobx._isComputingDerivation()).toBe(false) + + done() + } catch (e) { + console.log(e.stack) + } +}) + +test("box uses equals2", function(done) { + try { + var x = observable.box("01", { + equals: (oldValue, newValue) => { + return parseInt(oldValue) === parseInt(newValue) + } + }) + + var y = computed(function() { + return parseInt(x) + }) + + var b = buffer() + m.observe(y, b) + + x.set("2") + x.set("02") + x.set("002") + x.set("03") + + expect([2, 3]).toEqual(b.toArray()) + expect(mobx._isComputingDerivation()).toBe(false) + + done() + } catch (e) { + console.log(e.stack) + } +}) + test("readme1", function(done) { try { var b = buffer() @@ -157,7 +211,7 @@ test("readme1", function(done) { var order = {} order.price = observable.box(10) // Prints: New price: 24 - //in TS, just: value(() => this.price() * (1+vat())) + // in TS, just: value(() => this.price() * (1+vat())) order.priceWithVat = computed(function() { return order.price.get() * (1 + vat.get()) }) @@ -191,7 +245,7 @@ test("batch", function() { a.set(4) b.set(5) - // Note, 60 should not happen! (that is d beign computed before c after update of b) + // Note, 60 should not happen! (that is d begin computed before c after update of b) expect(buf.toArray()).toEqual([36, 100]) var x = mobx.transaction(function() { From 6971ef5febef9a8fff519eeb1ea5f25a621a1a61 Mon Sep 17 00:00:00 2001 From: SayBGM Date: Tue, 15 Jan 2019 09:35:51 +0900 Subject: [PATCH 0010/1043] Quotation marks style unification I unified the quotation style of the source code in the Readme document. --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 35e3896e4..f93abf2de 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,11 @@ MobX adds observable capabilities to existing data structures like objects, arra This can simply be done by annotating your class properties with the [@observable](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) decorator (ES.Next). ```javascript -import { observable } from "mobx" +import { observable } from 'mobx'; class Todo { id = Math.random(); - @observable title = ""; + @observable title = ''; @observable finished = false; } ``` @@ -106,11 +106,11 @@ Or you can skip them altoghether, as MobX can be used fine without decorator _sy Many MobX users prefer the slightly more concise decorator syntax, but the following snippet achieves the same: ```javascript -import { decorate, observable } from "mobx" +import { decorate, observable } from 'mobx'; class Todo { id = Math.random(); - title = ""; + title = ''; finished = false; } decorate(Todo, { @@ -173,7 +173,7 @@ class TodoListView extends Component { const TodoView = observer(({todo}) =>
  • todo.finished = !todo.finished} />{todo.title} @@ -197,7 +197,7 @@ For example the following `autorun` prints a log message each time the amount of ```javascript autorun(() => { - console.log("Tasks left: " + todos.unfinishedTodoCount) + console.log(`Tasks left: { todos.unfinishedTodoCount }`) }) ``` @@ -227,8 +227,8 @@ There is no technical need for firing events, calling a dispatcher, etc. A React ```javascript store.todos.push( - new Todo("Get Coffee"), - new Todo("Write simpler code") + new Todo('Get Coffee'), + new Todo('Write simpler code') ); store.todos[0].finished = true; ``` From 5237b01baf1bf7767cf5b2bbe026d71f29cfaab3 Mon Sep 17 00:00:00 2001 From: SayBGM Date: Tue, 15 Jan 2019 09:43:54 +0900 Subject: [PATCH 0011/1043] Template string grammar error correction --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f93abf2de..e4109427d 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,7 @@ For example the following `autorun` prints a log message each time the amount of ```javascript autorun(() => { - console.log(`Tasks left: { todos.unfinishedTodoCount }`) + console.log(`Tasks left: ${ todos.unfinishedTodoCount }`) }) ``` From fbe835a91fb77f159fbc27adc56c1a020296c56b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 09:55:51 +0100 Subject: [PATCH 0012/1043] Make sure isolateGlobalState is called first, fixes#1869 --- src/api/configure.ts | 6 +++--- test/base/strict-mode.js | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/api/configure.ts b/src/api/configure.ts index 38647e61a..f01e7cd55 100644 --- a/src/api/configure.ts +++ b/src/api/configure.ts @@ -19,6 +19,9 @@ export function configure(options: { disableErrorBoundaries, reactionScheduler } = options + if (options.isolateGlobalState === true) { + isolateGlobalState() + } if (enforceActions !== undefined) { if (typeof enforceActions === "boolean" || enforceActions === "strict") deprecated( @@ -49,9 +52,6 @@ export function configure(options: { if (computedRequiresReaction !== undefined) { globalState.computedRequiresReaction = !!computedRequiresReaction } - if (options.isolateGlobalState === true) { - isolateGlobalState() - } if (disableErrorBoundaries !== undefined) { if (disableErrorBoundaries === true) console.warn( diff --git a/test/base/strict-mode.js b/test/base/strict-mode.js index 11b4c1a13..50394c4c0 100644 --- a/test/base/strict-mode.js +++ b/test/base/strict-mode.js @@ -240,3 +240,12 @@ test("warn on unsafe reads", function() { mobx.configure({ computedRequiresReaction: false }) } }) + +test("#1869", function() { + const x = mobx.observable.box(3) + mobx.configure({ enforceActions: "always", isolateGlobalState: true }) + expect(() => { + x.set(4) + }).toThrow("Since strict-mode is enabled") + mobx._resetGlobalState() // should preserve strict mode +}) From 1b0f5ed4b24844498152e90c08c6a3287fe468d5 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 10:04:50 +0100 Subject: [PATCH 0013/1043] made computed props non-configurable to earlier detect delete or inheritance abuse. Fixes #1867 --- src/types/observableobject.ts | 2 +- test/base/__snapshots__/proxies.js.snap | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index b1f28c8eb..2658a770e 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -375,7 +375,7 @@ export function generateComputedPropConfig(propName) { return ( computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = { - configurable: true, + configurable: false, // See https://github.com/mobxjs/mobx/issues/1867, for computeds, we don't want reconfiguration, as this will potentially leak memory! enumerable: false, get() { return getAdministrationForComputedPropOwner(this).read(propName) diff --git a/test/base/__snapshots__/proxies.js.snap b/test/base/__snapshots__/proxies.js.snap index b32750d0e..30195e20d 100644 --- a/test/base/__snapshots__/proxies.js.snap +++ b/test/base/__snapshots__/proxies.js.snap @@ -21,7 +21,7 @@ Object { "set": [Function], }, "y": Object { - "configurable": true, + "configurable": false, "enumerable": false, "get": [Function], "set": [Function], @@ -56,7 +56,7 @@ Object { "set": [Function], }, "y": Object { - "configurable": true, + "configurable": false, "enumerable": false, "get": [Function], "set": [Function], @@ -91,7 +91,7 @@ Object { "set": [Function], }, "y": Object { - "configurable": true, + "configurable": false, "enumerable": false, "get": [Function], "set": [Function], From 053adacfb40ebf4981fcfc64c25a294547a95114 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 10:22:49 +0100 Subject: [PATCH 0014/1043] Fixed #1850: trace + debug cannot handle multi line comments --- src/core/observable.ts | 2 +- test/base/trace.js | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/core/observable.ts b/src/core/observable.ts index a73d39afe..f8ab4f7a4 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -248,7 +248,7 @@ You are entering this break point because derivation '${derivation.name}' is bei Just follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update The stackframe you are looking for is at least ~6-8 stack-frames up. -${derivation instanceof ComputedValue ? derivation.derivation.toString() : ""} +${derivation instanceof ComputedValue ? derivation.derivation.toString().replace(/[*]\//g, "/") : ""} The dependencies for this derivation are: diff --git a/test/base/trace.js b/test/base/trace.js index 023c5661b..833d5b06f 100644 --- a/test/base/trace.js +++ b/test/base/trace.js @@ -15,6 +15,9 @@ test("trace", () => { firstname: "Michel", lastname: "Weststrate", get fullname() { + /* test multi line comment + (run this unit test from VS code, and pass 'true' as third argument to trace below to verify) + */ var res = this.firstname + " " + this.lastname mobx.trace(this, "fullname") return res @@ -53,3 +56,25 @@ test("trace", () => { console.log = baselog } }) + +test("1850", () => { + const x = mobx.observable({ + firstname: "Michel", + lastname: "Weststrate", + get fullname() { + /* test multi line comment + (run this unit test from VS code, to manually verify serialization) + */ + var res = this.firstname + " " + this.lastname + mobx.trace(this, "fullname", true) + return res + } + }) + + mobx.autorun(() => { + x.fullname + }) + expect(() => { + x.firstname += "!" + }).not.toThrow("Unexpected identifier") +}) From d5f88556b55dcd438b7f52e1d9d5e823b9897160 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 10:31:49 +0100 Subject: [PATCH 0015/1043] Made test to verify error behavior --- test/base/__snapshots__/action.js.snap | 7 +++++++ test/base/action.js | 20 ++++++++++++++++++++ test/utils/test-utils.js | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/base/__snapshots__/action.js.snap diff --git a/test/base/__snapshots__/action.js.snap b/test/base/__snapshots__/action.js.snap new file mode 100644 index 000000000..a66ba97b9 --- /dev/null +++ b/test/base/__snapshots__/action.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`error logging, #1836 1`] = ` +", [mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@71], Error: Reaction error +, Error: Action error +" +`; diff --git a/test/base/action.js b/test/base/action.js index ae8a748f5..18bbd5d86 100644 --- a/test/base/action.js +++ b/test/base/action.js @@ -506,3 +506,23 @@ test("Fix #1367", () => { ) expect(mobx.isAction(x.method)).toBe(true) }) + +test("error logging, #1836", () => { + const messages = utils.consoleError(() => { + try { + const a = mobx.observable.box(3) + mobx.autorun(() => { + if (a.get() === 4) throw new Error("Reaction error") + }) + + mobx.action(() => { + a.set(4) + throw new Error("Action error") + })() + } catch (e) { + console.error(e) + } + }) + + expect(messages).toMatchSnapshot() +}) diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index 437e128e8..286f27879 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -15,7 +15,8 @@ export function consoleError(block, regex) { console.error = orig } expect(messages.length).toBeGreaterThan(0) - expect(messages).toMatch(regex) + if (regex) expect(messages).toMatch(regex) + return messages } export function consoleWarn(block, regex) { From 19ec1703de27944704649ab76a8a6f6f742e2f71 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 11:43:52 +0100 Subject: [PATCH 0016/1043] Fixed logging in trace test --- test/base/trace.js | 37 ++++++++++++++++++++----------------- test/utils/test-utils.js | 10 ++++++++-- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/test/base/trace.js b/test/base/trace.js index 833d5b06f..15e3bab02 100644 --- a/test/base/trace.js +++ b/test/base/trace.js @@ -1,6 +1,7 @@ "use strict" const mobx = require("../../src/mobx.ts") +const utils = require("../utils/test-utils") test("trace", () => { mobx._resetGlobalState() @@ -58,23 +59,25 @@ test("trace", () => { }) test("1850", () => { - const x = mobx.observable({ - firstname: "Michel", - lastname: "Weststrate", - get fullname() { - /* test multi line comment - (run this unit test from VS code, to manually verify serialization) - */ - var res = this.firstname + " " + this.lastname - mobx.trace(this, "fullname", true) - return res - } - }) + utils.supressConsole(() => { + const x = mobx.observable({ + firstname: "Michel", + lastname: "Weststrate", + get fullname() { + /* test multi line comment + (run this unit test from VS code, to manually verify serialization) + */ + var res = this.firstname + " " + this.lastname + mobx.trace(this, "fullname", true) + return res + } + }) - mobx.autorun(() => { - x.fullname + mobx.autorun(() => { + x.fullname + }) + expect(() => { + x.firstname += "!" + }).not.toThrow("Unexpected identifier") }) - expect(() => { - x.firstname += "!" - }).not.toThrow("Unexpected identifier") }) diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index 286f27879..5037ac0d0 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -38,16 +38,22 @@ export function consoleWarn(block, regex) { } export function supressConsole(block) { + const messages = [] const { warn, error } = console Object.assign(console, { - warn() {}, - error() {} + warn(e) { + messages.push("[warn] " + e) + }, + error(e) { + messages.push("[error] " + e) + } }) try { block() } finally { Object.assign(console, { warn, error }) } + return messages } export function stripAdminFromDescriptors(snapshot) { From 41ba822917e70f3acabb985b656f302bad2db2a8 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 11:45:46 +0100 Subject: [PATCH 0017/1043] Improved error logging, suppress reaction errors if action is already throwing. Fixes #1836 --- src/core/action.ts | 13 +++++++++++-- src/core/globalstate.ts | 6 ++++++ src/core/reaction.ts | 10 +++++++--- test/base/__snapshots__/action.js.snap | 15 +++++++++++---- test/base/__snapshots__/spy.js.snap | 2 +- test/base/action.js | 25 +++++++++++++++++++++++-- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/core/action.ts b/src/core/action.ts index 013533259..18ad5a02a 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -31,10 +31,19 @@ export function createAction(actionName: string, fn: Function): Function & IActi export function executeAction(actionName: string, fn: Function, scope?: any, args?: IArguments) { const runInfo = startAction(actionName, fn, scope, args) + let shouldSupressReactionError = true try { - return fn.apply(scope, args) + const res = fn.apply(scope, args) + shouldSupressReactionError = false + return res } finally { - endAction(runInfo) + if (shouldSupressReactionError) { + globalState.suppressReactionErrors = shouldSupressReactionError + endAction(runInfo) + globalState.suppressReactionErrors = false + } else { + endAction(runInfo) + } } } diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 75f737c39..e93facd80 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -106,6 +106,12 @@ export class MobXGlobals { * the stack when an exception occurs while debugging. */ disableErrorBoundaries = false + + /* + * If true, we are already handling an exception in an action. Any errors in reactions should be supressed, as + * they are not the cause, see: https://github.com/mobxjs/mobx/issues/1836 + */ + suppressReactionErrors = false } let canMergeGlobalState = true diff --git a/src/core/reaction.ts b/src/core/reaction.ts index 730ec4519..749cd9f72 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -153,9 +153,13 @@ export class Reaction implements IDerivation, IReactionPublic { if (globalState.disableErrorBoundaries) throw error - const message = `[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '${this}` - console.error(message, error) - /** If debugging brought you here, please, read the above message :-). Tnx! */ + const message = `[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '${this}'` + if (globalState.suppressReactionErrors) { + console.warn(`[mobx] (error in reaction '${this.name}' suppressed, fix error of causing action below)`) // prettier-ignore + } else { + console.error(message, error) + /** If debugging brought you here, please, read the above message :-). Tnx! */ + } if (isSpyEnabled()) { spyReport({ diff --git a/test/base/__snapshots__/action.js.snap b/test/base/__snapshots__/action.js.snap index a66ba97b9..86a2171e0 100644 --- a/test/base/__snapshots__/action.js.snap +++ b/test/base/__snapshots__/action.js.snap @@ -1,7 +1,14 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`error logging, #1836 1`] = ` -", [mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@71], Error: Reaction error -, Error: Action error -" +exports[`error logging, #1836 - 1 1`] = ` +Array [ + "[warn] [mobx] (error in reaction 'Autorun@71' suppressed, fix error of causing action below)", + "[error] Error: Action error", +] +`; + +exports[`error logging, #1836 - 2 1`] = ` +Array [ + "[error] [mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@74]'", +] `; diff --git a/test/base/__snapshots__/spy.js.snap b/test/base/__snapshots__/spy.js.snap index 418ff7b43..52446be64 100644 --- a/test/base/__snapshots__/spy.js.snap +++ b/test/base/__snapshots__/spy.js.snap @@ -33,7 +33,7 @@ Array [ }, Object { "error": "Oops", - "message": "[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[autorun]", + "message": "[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[autorun]'", "name": "autorun", "type": "error", }, diff --git a/test/base/action.js b/test/base/action.js index 18bbd5d86..7117bacce 100644 --- a/test/base/action.js +++ b/test/base/action.js @@ -507,8 +507,8 @@ test("Fix #1367", () => { expect(mobx.isAction(x.method)).toBe(true) }) -test("error logging, #1836", () => { - const messages = utils.consoleError(() => { +test("error logging, #1836 - 1", () => { + const messages = utils.supressConsole(() => { try { const a = mobx.observable.box(3) mobx.autorun(() => { @@ -520,6 +520,27 @@ test("error logging, #1836", () => { throw new Error("Action error") })() } catch (e) { + expect(e.toString()).toEqual("Error: Action error") + console.error(e) + } + }) + + expect(messages).toMatchSnapshot() +}) + +test("error logging, #1836 - 2", () => { + const messages = utils.supressConsole(() => { + try { + const a = mobx.observable.box(3) + mobx.autorun(() => { + if (a.get() === 4) throw new Error("Reaction error") + }) + + mobx.action(() => { + a.set(4) + })() + } catch (e) { + expect(e.toString()).toEqual("Error: Action error") console.error(e) } }) From a5cb65926621266716f8d11d716bf337e60dc3c1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 12:06:22 +0100 Subject: [PATCH 0018/1043] Don't allow Map subclasses, see: #1858 --- src/types/observablemap.ts | 7 +++++-- test/base/map.js | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index eeb61382c..534464358 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -300,8 +300,11 @@ export class ObservableMap if (isPlainObject(other)) Object.keys(other).forEach(key => this.set((key as any) as K, other[key])) else if (Array.isArray(other)) other.forEach(([key, value]) => this.set(key, value)) - else if (isES6Map(other)) other.forEach((value, key) => this.set(key, value)) - else if (other !== null && other !== undefined) + else if (isES6Map(other)) { + if (other.constructor !== Map) + return fail("Cannot initialize from classes that inherit from Map: " + other.constructor.name) // prettier-ignore + other.forEach((value, key) => this.set(key, value)) + } else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other) }) return this diff --git a/test/base/map.js b/test/base/map.js index 595777afa..f73a9ec9c 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -705,3 +705,12 @@ test("#1583 map.size not reactive", () => { map.set(3, 3) expect(sizes).toEqual([0, 1, 2]) }) + +test("#1858 Map should not be inherited", () => { + class MyMap extends Map {} + + const map = new MyMap() + expect(() => { + mobx.observable.map(map) + }).toThrow("Cannot initialize from classes that inherit from Map: MyMap") +}) From 949b5e8eee880f29fd72b4f24678071372b96693 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 12:12:00 +0100 Subject: [PATCH 0019/1043] revert changelog changes --- CHANGELOG.md | 1244 +++++++++++++++++++++++++------------------------- 1 file changed, 612 insertions(+), 632 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef61c6d43..12258884b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,3 @@ -* Improved flow support in typescript. It will now infer arguments and return values correctly. - # 5.8.0 / 4.8.0 * MobX now requires TypeScript 3 (this was already the case in 5.7.0, but in this version the difference is actually noticeable in the typings). @@ -10,84 +8,82 @@ * Fixed onBecome(Un)Observed dispoer cleanup. Fixes [#1537](https://github.com/mobxjs/mobx/issues/1537) through [#1833](https://github.com/mobxjs/mobx/pull/1833) by [fi3ework](https://github.com/fi3ework) # 5.7.1 / 4.7.1 - -* Fixed [#1839](https://github.com/mobxjs/mobx/issues/1839), ObservableArrayAdministration.dehanceValues does not dehance last value. +* Fixed [#1839](https://github.com/mobxjs/mobx/issues/1839), ObservableArrayAdministration.dehanceValues does not dehance last value. # 5.7.0 / 4.7.0 -# 5.7.0 / 4.7.0 +* Upgraded typings to TypeScript 3 +* Fixed [#1742](https://github.com/mobxjs/mobx/issues/1742), change detection fails when multiple mobx instances were active. +* Fixed [#1624](https://github.com/mobxjs/mobx/issues/1624), use built-in flow types for iterators +* Fixed [#1777](https://github.com/mobxjs/mobx/issues/1777) through [#1826](https://github.com/mobxjs/mobx/pull/1826), stack overflow exception, in development mode, when using `@computed` on a React component. The MobX 5 behavior here has been reverted to the MobX 4 behavior. -* Upgraded typings to TypeScript 3 -* Fixed [#1742](https://github.com/mobxjs/mobx/issues/1742), change detection fails when multiple mobx instances were active. -* Fixed [#1624](https://github.com/mobxjs/mobx/issues/1624), use built-in flow types for iterators -* Fixed [#1777](https://github.com/mobxjs/mobx/issues/1777) through [#1826](https://github.com/mobxjs/mobx/pull/1826), stack overflow exception, in development mode, when using `@computed` on a React component. The MobX 5 behavior here has been reverted to the MobX 4 behavior. # 5.6.0 / 4.6.0 -* `keepAlive` has become smarter and won't recomputed computed values that are kept alive, as long as they aren't read. Implements [#1534](https://github.com/mobxjs/mobx/issues/1534) -* Fixed [#1796](https://github.com/mobxjs/mobx/issues/1796), undeleting a property that had an initial value of `undefined` was undetected -* Improved Flow typings, see [#1794](https://github.com/mobxjs/mobx/pull/1794) and [#1786](https://github.com/mobxjs/mobx/pull/1786) +* `keepAlive` has become smarter and won't recomputed computed values that are kept alive, as long as they aren't read. Implements [#1534](https://github.com/mobxjs/mobx/issues/1534) +* Fixed [#1796](https://github.com/mobxjs/mobx/issues/1796), undeleting a property that had an initial value of `undefined` was undetected +* Improved Flow typings, see [#1794](https://github.com/mobxjs/mobx/pull/1794) and [#1786](https://github.com/mobxjs/mobx/pull/1786) # 5.5.2 / 4.5.2 -* Fixed bug in `toJS` not handling `null` values correctly. Fixes [#1557](https://github.com/mobxjs/mobx/issues/1557) through [#1783](https://github.com/mobxjs/mobx/pull/1783) by [@wangyiz4262](https://github.com/wangyiz4262) +* Fixed bug in `toJS` not handling `null` values correctly. Fixes [#1557](https://github.com/mobxjs/mobx/issues/1557) through [#1783](https://github.com/mobxjs/mobx/pull/1783) by [@wangyiz4262](https://github.com/wangyiz4262) # 5.5.1 / 4.5.1 -* `toJS` now has a `recurseEverything` everything option, that even detects and converts observable objects that are "behind" non-observable objects. See [#1699](https://github.com/mobxjs/mobx/pull/1699) by [wangyiz4262](https://github.com/wangyiz4262) -* Added flow typings form `comparer`, see [#1751](https://github.com/mobxjs/mobx/pull/1752) by [pdong](https://github.com/pdong) -* Update flow typings for configuration options, [#1772](https://github.com/mobxjs/mobx/pull/1772) by [alexandersorokin](https://github.com/alexandersorokin) +* `toJS` now has a `recurseEverything` everything option, that even detects and converts observable objects that are "behind" non-observable objects. See [#1699](https://github.com/mobxjs/mobx/pull/1699) by [wangyiz4262](https://github.com/wangyiz4262) +* Added flow typings form `comparer`, see [#1751](https://github.com/mobxjs/mobx/pull/1752) by [pdong](https://github.com/pdong) +* Update flow typings for configuration options, [#1772](https://github.com/mobxjs/mobx/pull/1772) by [alexandersorokin](https://github.com/alexandersorokin) # 5.5.0 / 4.5.0 (Minor version of `5` was bumped significantly to make the number better correlate together :-)) -* Fixed [#1740](https://github.com/mobxjs/mobx/issues/1740): combining decorators and `extendObservable` in a class constructor caused errors to be thrown -* Fixed [#1739](https://github.com/mobxjs/mobx/issues/1740): - * Proxies: `delete`-ing a property was not always picked up by the reactivity system - * Non-proxies: `remove()`-ing a property was not always picked up by the `has()` and `get()` utilities - * `has` now returns `true` for computed fields - * `get` now returns a value for computed fields -* Introduced `_allowStateChangeInsideComputed`. Don't use it :-). -* MobX is now transpiled using babel 7 +* Fixed [#1740](https://github.com/mobxjs/mobx/issues/1740): combining decorators and `extendObservable` in a class constructor caused errors to be thrown +* Fixed [#1739](https://github.com/mobxjs/mobx/issues/1740): + * Proxies: `delete`-ing a property was not always picked up by the reactivity system + * Non-proxies: `remove()`-ing a property was not always picked up by the `has()` and `get()` utilities + * `has` now returns `true` for computed fields + * `get` now returns a value for computed fields +* Introduced `_allowStateChangeInsideComputed`. Don't use it :-). +* MobX is now transpiled using babel 7 # 5.1.2 / 4.4.2 -* Fixed [#1650](https://github.com/mobxjs/mobx/issues/1650), decorating fields with the name `toString` does not behave correctly. +* Fixed [#1650](https://github.com/mobxjs/mobx/issues/1650), decorating fields with the name `toString` does not behave correctly. # 5.1.1 / 4.4.1 -* Improved typings of `decorate`, see [#1711](https://github.com/mobxjs/mobx/pull/1711) by [makepost](https://github.com/makepost) +* Improved typings of `decorate`, see [#1711](https://github.com/mobxjs/mobx/pull/1711) by [makepost](https://github.com/makepost) # 5.1.0 / 4.4.0 -* Improved handling of multiple MobX instances. MobX will no longer complain about being loaded multiple times (one should still prevent it though, to prevent blowing up bundle size!), but merge internal state by default. If multiple MobX versions need to be loaded, call `configure({ isolateGlobalState: true })`. Note that this means that observables from the different MobX instances won't cooperate. Fixes [#1681](https://github.com/mobxjs/mobx/issues/1681), [#1082](https://github.com/mobxjs/mobx/issues/1082) -* `enforceActions` options now supports the values: `"never"`, `"observed"` and `"always"` to make the behavior more clear. Fixes [#1680](https://github.com/mobxjs/mobx/issues/1680), [#1473](https://github.com/mobxjs/mobx/issues/1473) +* Improved handling of multiple MobX instances. MobX will no longer complain about being loaded multiple times (one should still prevent it though, to prevent blowing up bundle size!), but merge internal state by default. If multiple MobX versions need to be loaded, call `configure({ isolateGlobalState: true })`. Note that this means that observables from the different MobX instances won't cooperate. Fixes [#1681](https://github.com/mobxjs/mobx/issues/1681), [#1082](https://github.com/mobxjs/mobx/issues/1082) +* `enforceActions` options now supports the values: `"never"`, `"observed"` and `"always"` to make the behavior more clear. Fixes [#1680](https://github.com/mobxjs/mobx/issues/1680), [#1473](https://github.com/mobxjs/mobx/issues/1473) # 5.0.5 -* Fixed [#1667](https://github.com/mobxjs/mobx/issues/1667): creating a large array could result in undefined items (MobX 4.\* was not affected) +* Fixed [#1667](https://github.com/mobxjs/mobx/issues/1667): creating a large array could result in undefined items (MobX 4.* was not affected) # 4.3.2 / 5.0.4 -* Fixed [#1685](https://github.com/mobxjs/mobx/issues/1685): expose `IAutorunOptions` -* `decorate` now can apply multiple decorators, by accepting an array and applying them right to left: `decorate(Todo, { title: [serializable(primitive), persist('object'), observable] })`. By [@ramybenaroya](https://github.com/ramybenaroya) through [#1691](https://github.com/mobxjs/mobx/pull/1691) and [#1686](https://github.com/mobxjs/mobx/pull/1686) -* Improved typings of `flow` so that it accepts async generators. By [@dannsam](https://github.com/dannsam) through [#1656](https://github.com/mobxjs/mobx/pull/1656) and [#1655](https://github.com/mobxjs/mobx/pull/1655) -* `keys()` now also supports arrays. Fixes [#1600](https://github.com/mobxjs/mobx/pull/1600) through [#1601](https://github.com/mobxjs/mobx/pull/1601) by [@nunocastromartins](https://github.com/nunocastromartins) +* Fixed [#1685](https://github.com/mobxjs/mobx/issues/1685): expose `IAutorunOptions` +* `decorate` now can apply multiple decorators, by accepting an array and applying them right to left: `decorate(Todo, { title: [serializable(primitive), persist('object'), observable] })`. By [@ramybenaroya](https://github.com/ramybenaroya) through [#1691](https://github.com/mobxjs/mobx/pull/1691) and [#1686](https://github.com/mobxjs/mobx/pull/1686) +* Improved typings of `flow` so that it accepts async generators. By [@dannsam](https://github.com/dannsam) through [#1656](https://github.com/mobxjs/mobx/pull/1656) and [#1655](https://github.com/mobxjs/mobx/pull/1655) +* `keys()` now also supports arrays. Fixes [#1600](https://github.com/mobxjs/mobx/pull/1600) through [#1601](https://github.com/mobxjs/mobx/pull/1601) by [@nunocastromartins](https://github.com/nunocastromartins) # 5.0.3 -* Fixed issue where it was no longer possible to define custom properties on observable arrays +* Fixed issue where it was no longer possible to define custom properties on observable arrays # 5.0.2 -* Fixed issue where iterators where not compiled to ES5, breaking the ES5 based builds. +* Fixed issue where iterators where not compiled to ES5, breaking the ES5 based builds. # 5.0.1 (Unpublished) -* Fixed regression bug: `ObservableMap.size` was no longer observable. Fixes [#1583](https://github.com/mobxjs/mobx/issues/1583) -* Downgraded lib export from ES6 to ES5. To many build tools still trip over ES6. Fixes [#1584](https://github.com/mobxjs/mobx/issues/1584). A modern build is available through `import ... from "mobx/lib/mobx.es6"` (or setup an alias in your build system) -* Added support for mobx-react-devtools +* Fixed regression bug: `ObservableMap.size` was no longer observable. Fixes [#1583](https://github.com/mobxjs/mobx/issues/1583) +* Downgraded lib export from ES6 to ES5. To many build tools still trip over ES6. Fixes [#1584](https://github.com/mobxjs/mobx/issues/1584). A modern build is available through `import ... from "mobx/lib/mobx.es6"` (or setup an alias in your build system) +* Added support for mobx-react-devtools # 5.0.0 @@ -97,118 +93,119 @@ MobX 5 is the first MobX version fully leveraging Proxies. This has two big advantages -1. MobX can now detect the addition of properties on plain observable objects, so it is now possible to use plain observable objects as dynamic collections. -2. Observable arrays are now recognized as arrays by all third party libraries, which will avoid the need to slice them. +1. MobX can now detect the addition of properties on plain observable objects, so it is now possible to use plain observable objects as dynamic collections. +2. Observable arrays are now recognized as arrays by all third party libraries, which will avoid the need to slice them. ### The system requirements to run MobX has been upped -* MobX 5 can only be used on environments that support `Proxies`. In practice this means, no Internet Explorer (Edge is fine). No nodejs < 6. React Native on Android only when JavaScript core is [upgraded](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). All modern browsers are supported. -* Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. -* If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. -* The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. +* MobX 5 can only be used on environments that support `Proxies`. In practice this means, no Internet Explorer (Edge is fine). No nodejs < 6. React Native on Android only when JavaScript core is [upgraded](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). All modern browsers are supported. +* Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. +* If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. +* The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. ### Breaking changes -* The required runtime needs to support the non-polyfillable `Proxy` API. -* The minimum runtime target is now ES2015, not ES5 -* `spy` has become a no-op in production builds -* All earlier deprecated APIs are dropped. Make sure to not have any deprecation warnings before upgrading. -* `array.move` and `array.peek` are removed from the API -* Dropped the third argument to `array.find` and `array.findIndex` since they were not standardized in ES. -* `.$mobx` property has been dropped from all observables and replaced by a Symbol. Instead of using `x.$mobx.name`, use `import { $mobx } from "mobx"; x[$mobx].name` etc. -* In some cases, the order in which autoruns are fired could have changed due to some internal optimizations (note that MobX never had a guarantee about the order in which autoruns fired!) +* The required runtime needs to support the non-polyfillable `Proxy` API. +* The minimum runtime target is now ES2015, not ES5 +* `spy` has become a no-op in production builds +* All earlier deprecated APIs are dropped. Make sure to not have any deprecation warnings before upgrading. +* `array.move` and `array.peek` are removed from the API +* Dropped the third argument to `array.find` and `array.findIndex` since they were not standardized in ES. +* `.$mobx` property has been dropped from all observables and replaced by a Symbol. Instead of using `x.$mobx.name`, use `import { $mobx } from "mobx"; x[$mobx].name` etc. +* In some cases, the order in which autoruns are fired could have changed due to some internal optimizations (note that MobX never had a guarantee about the order in which autoruns fired!) ### New features -* It is possible to pass the `proxy: false` argument to `observable.object` to disable proxying (theoretically slightly faster, but removes no dynamic key addition) +* It is possible to pass the `proxy: false` argument to `observable.object` to disable proxying (theoretically slightly faster, but removes no dynamic key addition) ### Known Issues -* Observable objects can no longer be frozen (otherwise they would become un-observable😎). If you are actually trying to do so MobX will now throw an exception like: `[mobx] Dynamic observable objects cannot be frozen]`. A place where that might happen unexpectedly is when passing an observable object as `style` property to a React component. Like ``, since React will freeze all style objects. The work-around is to simply pass a fresh, non-observable object for styling like: ``. -* ~~If you are using `mobx` with `mobx-react`, and you are upgrading `mobx-react` to the MobX 5 compatible version (`mobx-react@5.2.0`) you will notice that `this.props` or `this.state` are not yet observable in the `constructor` or `componentWillMount`. This is for forward compatibility with React 16.3 where `componentWillMount` has been deprecated. In most cases using `componentDidMount` instead will suffice, especially when the goal is to setup reactions. For more info see [#478](https://github.com/mobxjs/mobx-react/issues/478).~~ Fixed in mobx-react 5.2.1. But note that you should still migrate away from `componentWillMount`😎. -* Jest `toEqual` might throw an error `allKeys[x].match is not a function` when trying to equal observable arrays. This is a bug in Jest [report](https://github.com/facebook/jest/issues/6398). The simple work around for now is to slice (or `toJS` if the problem is recursive) the array first. -* Jest `toEqual` matcher might no longer correctly equal your class instances, complaining about differences in the MobX adminstration. This is due to a bug with the processing of symbols: [report](https://github.com/facebook/jest/issues/6392). For now you might want to use a custom matcher if you are directly equalling observable objects. As a work around `toJS(object)` could be used before diffing. +* Observable objects can no longer be frozen (otherwise they would become un-observable😎). If you are actually trying to do so MobX will now throw an exception like: `[mobx] Dynamic observable objects cannot be frozen]`. A place where that might happen unexpectedly is when passing an observable object as `style` property to a React component. Like ``, since React will freeze all style objects. The work-around is to simply pass a fresh, non-observable object for styling like: ``. +* ~~If you are using `mobx` with `mobx-react`, and you are upgrading `mobx-react` to the MobX 5 compatible version (`mobx-react@5.2.0`) you will notice that `this.props` or `this.state` are not yet observable in the `constructor` or `componentWillMount`. This is for forward compatibility with React 16.3 where `componentWillMount` has been deprecated. In most cases using `componentDidMount` instead will suffice, especially when the goal is to setup reactions. For more info see [#478](https://github.com/mobxjs/mobx-react/issues/478).~~ Fixed in mobx-react 5.2.1. But note that you should still migrate away from `componentWillMount`😎. +* Jest `toEqual` might throw an error `allKeys[x].match is not a function` when trying to equal observable arrays. This is a bug in Jest [report](https://github.com/facebook/jest/issues/6398). The simple work around for now is to slice (or `toJS` if the problem is recursive) the array first. +* Jest `toEqual` matcher might no longer correctly equal your class instances, complaining about differences in the MobX adminstration. This is due to a bug with the processing of symbols: [report](https://github.com/facebook/jest/issues/6392). For now you might want to use a custom matcher if you are directly equalling observable objects. As a work around `toJS(object)` could be used before diffing. _Note June 7th, 2018:_ Both issues are already in Jest master and should be released soon. ### Migration guide -* Make sure to not use any API that produces deprecation warnings in MobX 4. Beyond that MobX 5 should pretty well as drop-in replacement of MobX 4. -* You _could_ perform the following clean ups: - * Don't `slice()` arrays when passing them to external libraries. (Note you still shouldn't pass observable data structures to non-`observer` React components, which is an orthogonal concept) - * You could replace observable maps with observable objects if you are only using string-based keys. -* Don't call the `reverse` or `sort` operations directly on observableArray's anymore, as it's behavior slightly differed from the built-in implementations of those methods. Instead use `observableArray.slice().sort()` to perform the sort on a copy. This gives no additional performance overhead compared to MobX 4. (The reason behind this is that built-in `sort` updates the array in place, but the observable array implementation always performed the sort on a defensive copy, and this change makes that explicit). +* Make sure to not use any API that produces deprecation warnings in MobX 4. Beyond that MobX 5 should pretty well as drop-in replacement of MobX 4. +* You _could_ perform the following clean ups: + * Don't `slice()` arrays when passing them to external libraries. (Note you still shouldn't pass observable data structures to non-`observer` React components, which is an orthogonal concept) + * You could replace observable maps with observable objects if you are only using string-based keys. +* Don't call the `reverse` or `sort` operations directly on observableArray's anymore, as it's behavior slightly differed from the built-in implementations of those methods. Instead use `observableArray.slice().sort()` to perform the sort on a copy. This gives no additional performance overhead compared to MobX 4. (The reason behind this is that built-in `sort` updates the array in place, but the observable array implementation always performed the sort on a defensive copy, and this change makes that explicit). + ### API's that have been dropped -* The `arrayBuffer` setting is no longer supported by `configure` (it has become irrelevant) -* `observable.shallowBox`, `observable.shallowArray`, `observable.shallowMap`, `observable.shallowObject`, `extendShallowObservable` api's have been removed. Instead, pass `{ deep: false }` to their non-shallow counter parts. -* `observableArray.peek`, `observableArray.move` +* The `arrayBuffer` setting is no longer supported by `configure` (it has become irrelevant) +* `observable.shallowBox`, `observable.shallowArray`, `observable.shallowMap`, `observable.shallowObject`, `extendShallowObservable` api's have been removed. Instead, pass `{ deep: false }` to their non-shallow counter parts. +* `observableArray.peek`, `observableArray.move` # 4.3.1 -* Fixed [#1534](Fixes https://github.com/mobxjs/mobx/issues/1534): @computed({keepAlive: true}) no long calculates before being accessed. -* Added the `$mobx` export symbol for MobX 5 forward compatibity +* Fixed [#1534](Fixes https://github.com/mobxjs/mobx/issues/1534): @computed({keepAlive: true}) no long calculates before being accessed. +* Added the `$mobx` export symbol for MobX 5 forward compatibity # 4.3.0 -* Introduced the `entries(observable)` API, by @samjacobclift through [#1536](https://github.com/mobxjs/mobx/pull/1536) -* Fixed [#1535](https://github.com/mobxjs/mobx/issues/1535): Change in nested computed value was not propagated if read outside action context when there is a pending reaction. For more details see the exact test case. -* Illegal property access through prototypes is now a warning instead of an error. Fixes [#1506](https://github.com/mobxjs/mobx/issues/1506). By @AmazingTurtle through [#1529](https://github.com/mobxjs/mobx/pull/1529) -* Fixed issue where providing a custom setter to `@computed({ set: ... })` wasn't picked up -* Fixed #1545: Actions properties where not re-assignable when using TypeScript -* Illegal Access checks are now a warning instead of an error. Fix +* Introduced the `entries(observable)` API, by @samjacobclift through [#1536](https://github.com/mobxjs/mobx/pull/1536) +* Fixed [#1535](https://github.com/mobxjs/mobx/issues/1535): Change in nested computed value was not propagated if read outside action context when there is a pending reaction. For more details see the exact test case. +* Illegal property access through prototypes is now a warning instead of an error. Fixes [#1506](https://github.com/mobxjs/mobx/issues/1506). By @AmazingTurtle through [#1529](https://github.com/mobxjs/mobx/pull/1529) +* Fixed issue where providing a custom setter to `@computed({ set: ... })` wasn't picked up +* Fixed #1545: Actions properties where not re-assignable when using TypeScript +* Illegal Access checks are now a warning instead of an error. Fix # 4.2.1 -* Fixed flow typings for `mobx.configure` [#1521](https://github.com/mobxjs/mobx/pull/1521) by @andrew--r -* Improved typings for `mobx.flow`, fixes [#1527](https://github.com/mobxjs/mobx/issues/1527) -* Throw error when using `@observable` in combination with a getter. [#1511](https://github.com/mobxjs/mobx/pull/1511) by @quanganhtran -* `toJS` now uses Map internally, for faster detection of cycles. [#1517](https://github.com/mobxjs/mobx/pull/1517) by @loatheb -* Fixed [#1512](https://github.com/mobxjs/mobx/issues/1512): `observe` hooks not being triggered when using `mobx.set`, Fixed in [#1514](https://github.com/mobxjs/mobx/pull/1514) by @quanganhtran -* Several minor improvements, additional tests and doc improvements. +* Fixed flow typings for `mobx.configure` [#1521](https://github.com/mobxjs/mobx/pull/1521) by @andrew--r +* Improved typings for `mobx.flow`, fixes [#1527](https://github.com/mobxjs/mobx/issues/1527) +* Throw error when using `@observable` in combination with a getter. [#1511](https://github.com/mobxjs/mobx/pull/1511) by @quanganhtran +* `toJS` now uses Map internally, for faster detection of cycles. [#1517](https://github.com/mobxjs/mobx/pull/1517) by @loatheb +* Fixed [#1512](https://github.com/mobxjs/mobx/issues/1512): `observe` hooks not being triggered when using `mobx.set`, Fixed in [#1514](https://github.com/mobxjs/mobx/pull/1514) by @quanganhtran +* Several minor improvements, additional tests and doc improvements. # 4.2.0 -* Introduced `configure({ enforceActions: "strict" })`, which is more strict then `enforceActions: true`, as it will also throw on non-observed changes to observables. See also [#1473](https://github.com/mobxjs/mobx/issues/1473) -* Fixed [#1480](https://github.com/mobxjs/mobx/issues/1480): Exceptions in the effect handler of `reaction` where not properly picked up by the global reaction system -* Fixed a bug where computed values updated their cached value, even when the comparer considered the new value equal to the previous one. Thanks @kuitos for finding this and fixing it! [#1499](https://github.com/mobxjs/mobx/pull/1499) -* Undeprecated `ObservableMap`, fixes [#1496](https://github.com/mobxjs/mobx/issues/1496) -* Observable arrays now support `Symbol.toStringTag` (if available / polyfilled). This allows libraries like Ramda to detect automatically that observable arrays are arrays. Fixes [#1490](https://github.com/mobxjs/mobx/issues/1490). Note that `Array.isArray` will keep returning false for the entire MobX 4 range. -* Actions are now always `configurable` and `writable`, like in MobX 3. Fixes [#1477](https://github.com/mobxjs/mobx/issues/1477) -* Merged several improvements to the flow typings. [#1501](https://github.com/mobxjs/mobx/pull/1501) by @quanganhtran -* Fixed several accidental usages of the global `fail`, by @mtaran-google through [#1483](https://github.com/mobxjs/mobx/pull/1483) and [#1482](https://github.com/mobxjs/mobx/pull/1482) +* Introduced `configure({ enforceActions: "strict" })`, which is more strict then `enforceActions: true`, as it will also throw on non-observed changes to observables. See also [#1473](https://github.com/mobxjs/mobx/issues/1473) +* Fixed [#1480](https://github.com/mobxjs/mobx/issues/1480): Exceptions in the effect handler of `reaction` where not properly picked up by the global reaction system +* Fixed a bug where computed values updated their cached value, even when the comparer considered the new value equal to the previous one. Thanks @kuitos for finding this and fixing it! [#1499](https://github.com/mobxjs/mobx/pull/1499) +* Undeprecated `ObservableMap`, fixes [#1496](https://github.com/mobxjs/mobx/issues/1496) +* Observable arrays now support `Symbol.toStringTag` (if available / polyfilled). This allows libraries like Ramda to detect automatically that observable arrays are arrays. Fixes [#1490](https://github.com/mobxjs/mobx/issues/1490). Note that `Array.isArray` will keep returning false for the entire MobX 4 range. +* Actions are now always `configurable` and `writable`, like in MobX 3. Fixes [#1477](https://github.com/mobxjs/mobx/issues/1477) +* Merged several improvements to the flow typings. [#1501](https://github.com/mobxjs/mobx/pull/1501) by @quanganhtran +* Fixed several accidental usages of the global `fail`, by @mtaran-google through [#1483](https://github.com/mobxjs/mobx/pull/1483) and [#1482](https://github.com/mobxjs/mobx/pull/1482) # 4.1.1 -* Import `default` from MobX will no longer throw, but only warn instead. This fixes some issues with tools that reflect on the `default` export of a module -* Disposing a spy listener inside a spy handler no longer causes an exception. Fixes [#1459](https://github.com/mobxjs/mobx/issues/1459) through [#1460](https://github.com/mobxjs/mobx/pull/1460) by [farwayer](https://github.com/farwayer) -* Added a missing `runInAction` overload in the flow typings. [#1451](https://github.com/mobxjs/mobx/pull/1451) by [AMilassin](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3AAMilassin) -* Improved the typings of `decorate`. See [#1450](https://github.com/mobxjs/mobx/pull/1450) by [makepost](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3Amakepost) +* Import `default` from MobX will no longer throw, but only warn instead. This fixes some issues with tools that reflect on the `default` export of a module +* Disposing a spy listener inside a spy handler no longer causes an exception. Fixes [#1459](https://github.com/mobxjs/mobx/issues/1459) through [#1460](https://github.com/mobxjs/mobx/pull/1460) by [farwayer](https://github.com/farwayer) +* Added a missing `runInAction` overload in the flow typings. [#1451](https://github.com/mobxjs/mobx/pull/1451) by [AMilassin](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3AAMilassin) +* Improved the typings of `decorate`. See [#1450](https://github.com/mobxjs/mobx/pull/1450) by [makepost](https://github.com/mobxjs/mobx/issues?q=is%3Apr+author%3Amakepost) # 4.1.0 -* Introduced `keepAlive` as option to `computed` -* All observable api's now default to `any` for their generic arguments -* Improved `flow` cancellation -* The effect of `when` is now automatically an action. -* `@computed` properties are now declared on their owner rather then the protoptype. Fixes an issue where `@computed` fields didn't work in React Native on proxied objects. See [#1396](https://github.com/mobxjs/mobx/issues/1396) -* `action` and `action.bound` decorated fields are now reassignable, so that they can be stubbed +* Introduced `keepAlive` as option to `computed` +* All observable api's now default to `any` for their generic arguments +* Improved `flow` cancellation +* The effect of `when` is now automatically an action. +* `@computed` properties are now declared on their owner rather then the protoptype. Fixes an issue where `@computed` fields didn't work in React Native on proxied objects. See [#1396](https://github.com/mobxjs/mobx/issues/1396) +* `action` and `action.bound` decorated fields are now reassignable, so that they can be stubbed # 4.0.2 -* Fixed issue where exceptions like `TypeError: Cannot define property:__mobxDidRunLazyInitializers, object is not extensible.` were thrown. Fixes [#1404](https://github.com/mobxjs/mobx/issues/1404) -* Improved flow typings for `flow`, [#1399](https://github.com/mobxjs/mobx/pull/1399) by @ismailhabib +* Fixed issue where exceptions like `TypeError: Cannot define property:__mobxDidRunLazyInitializers, object is not extensible.` were thrown. Fixes [#1404](https://github.com/mobxjs/mobx/issues/1404) +* Improved flow typings for `flow`, [#1399](https://github.com/mobxjs/mobx/pull/1399) by @ismailhabib # 4.0.1 -* Updated flow typings, see [#1393](https://github.com/mobxjs/mobx/pull/1393) by [andrew--r](https://github.com/andrew--r) +* Updated flow typings, see [#1393](https://github.com/mobxjs/mobx/pull/1393) by [andrew--r](https://github.com/andrew--r) # 4.0.0 -* For the highlights of this release, read the [blog](https://medium.com/p/c1fbc08008da/): -* For migration notes: see the [wiki page](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) -* Note; many things that were removed to make the api surface smaller. If you think some feature shouldn't have been removed, feel free to open an issue! +* For the highlights of this release, read the [blog](https://medium.com/p/c1fbc08008da/): +* For migration notes: see the [wiki page](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) +* Note; many things that were removed to make the api surface smaller. If you think some feature shouldn't have been removed, feel free to open an issue! This is the extensive list of all changes. @@ -216,280 +213,277 @@ This is the extensive list of all changes. The changes mentioned here are discussed in detail in the [release highlights](https://medium.com/p/c1fbc08008da/), or were simply updated in the docs. -* MobX 4 introduces separation between the production and non production build. The production build strips most typechecks, resulting in a faster and smaller build. Make sure to substitute process.env.NODE_ENV = "production" in your build process! If you are using MobX in a react project, you most probably already have set this up. Otherwise, the idea is explained [here](https://reactjs.org/docs/add-react-to-an-existing-app.html). -* Introduced `flow` to create a chain of async actions. This is the same function as [`asyncActions`](https://github.com/mobxjs/mobx-utils#asyncaction) of the mobx-utils package -* These `flow`'s are now cancellable, by calling `.cancel()` on the returned promise, which will throw a cancellation exception into the generator function. -* `flow` also has experimental support for async iterators (`async * function`) -* Introduced `decorate(thing, decorators)` to decorate classes or object without needing decorator syntax. -* Introduced `onBecomeObserved` and `onBecomeUnobserved`. These API's enable hooking into the observability system and get notified about when an observable starts / stops becoming used. This is great to automaticaly fetch data from external resources, or stop doing so. -* `computed` / `@computed` now accepts a `requiresReaction` option. If it set, the computed value will throw an exception if it is being read while not being tracked by some reaction. -* To make `requiresReaction` the default, use `mobx.configure({ computedRequiresReaction: true })` -* Introduced `mobx.configure({ disableErrorBoundaries })`, for easier debugging of exceptoins. By [NaridaL](https://github.com/NaridaL) through [#1262](https://github.com/mobxjs/mobx/pull/1262) -* `toJS` now accepts the options: `{ detectCycles?: boolean, exportMapsAsObjects?: boolean }`, both `true` by default -* Observable maps are now backed by real ES6 Maps. This means that any value can be used as key now, not just strings and numbers. -* The flow typings have been updated. Since this is a manual effort, there can be mistakes, so feel free to PR! - -* `computed(fn, options?)` / `@computed(options) get fn()` now accept the following options: - - * `set: (value) => void` to set a custom setter on the computed property - * `name: "debug name"` - * `equals: fn` the equality value to use for the computed to determine whether its output has changed. The default is `comparer.default`. Alternatives are `comparer.structural`, `comparer.identity` or just your own comparison function. - * `requiresReaction: boolean` see above. - -* `autorun(fn, options?)` now accepts the following options: - - * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` - * `name: "debug name"` - * `scheduler: function` a custom scheduler to run the autorun. For example to connect running the autorun to `requestAnimationFrame`. See the docs for more details - * `onError`. A custom error handler to be notified when an autorun throws an exception. - -* `reaction(expr, effect, options?)` now accepts the following options: - - * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` - * `fireImmediately`. Immediately fire the effect function after the first evaluation of `expr` - * `equals`. Custom equality function to determine whether the `expr` function differed from its previous result, and hence should fire `effect`. Accepts the same options as the `equals` option of computed. - * All the options `autorun` accepts - -* `when(predicate, effect?, options?)` now accepts the following options: - * `name: "debug name"` - * `onError`. A custom error handler to be notified when an autorun throws an exception. - * `timeout: number` a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time -* The `effect` parameter of `when` has become optional. If it is omitted, `when` will return a promise. This makes it easy to `await` a condition, for example: `await when(() => user.profile.loaded)`. The returned promise can be cancelled using `promise.cancel()` - -* There is now an utility API that enables manipulating observable maps, objects and arrays with the same api. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. - - * `values(thing)` returns all values in the collection as array - * `keys(thing)` returns all keys in the collection as array - * `set(thing, key, value)` or `set(thing, { key: value })` Updates the given collection with the provided key / value pair(s). - * `remove(thing, key)` removes the specified child from the collection. For arrays splicing is used. - * `has(thing, key)` returns true if the collection has the specified _observable_ property. - * `get(thing, key)` returns the chlid under the specified key. - -* `observable`, `observable.array`, `observable.object`, `observable.map` and `extendObservable` now accept an additional options object, which can specify the following attributes: - * `name: "debug name"` - * `deep: boolean`. `true` by default, indicates whether the children of this collection are automatically converted into observables as well. - * `defaultDecorator: ` specifies the default decorator used for new children / properties, by default: `observable.deep`, but could be changed to `observable.ref`, `observable.struct` etc. (The `deep` property is just a short-hand for switching between `observable.deep` or `observable.ref` as default decorator for new properties) +* MobX 4 introduces separation between the production and non production build. The production build strips most typechecks, resulting in a faster and smaller build. Make sure to substitute process.env.NODE_ENV = "production" in your build process! If you are using MobX in a react project, you most probably already have set this up. Otherwise, the idea is explained [here](https://reactjs.org/docs/add-react-to-an-existing-app.html). +* Introduced `flow` to create a chain of async actions. This is the same function as [`asyncActions`](https://github.com/mobxjs/mobx-utils#asyncaction) of the mobx-utils package +* These `flow`'s are now cancellable, by calling `.cancel()` on the returned promise, which will throw a cancellation exception into the generator function. +* `flow` also has experimental support for async iterators (`async * function`) +* Introduced `decorate(thing, decorators)` to decorate classes or object without needing decorator syntax. +* Introduced `onBecomeObserved` and `onBecomeUnobserved`. These API's enable hooking into the observability system and get notified about when an observable starts / stops becoming used. This is great to automaticaly fetch data from external resources, or stop doing so. +* `computed` / `@computed` now accepts a `requiresReaction` option. If it set, the computed value will throw an exception if it is being read while not being tracked by some reaction. +* To make `requiresReaction` the default, use `mobx.configure({ computedRequiresReaction: true })` +* Introduced `mobx.configure({ disableErrorBoundaries })`, for easier debugging of exceptoins. By [NaridaL](https://github.com/NaridaL) through [#1262](https://github.com/mobxjs/mobx/pull/1262) +* `toJS` now accepts the options: `{ detectCycles?: boolean, exportMapsAsObjects?: boolean }`, both `true` by default +* Observable maps are now backed by real ES6 Maps. This means that any value can be used as key now, not just strings and numbers. +* The flow typings have been updated. Since this is a manual effort, there can be mistakes, so feel free to PR! + +* `computed(fn, options?)` / `@computed(options) get fn()` now accept the following options: + * `set: (value) => void` to set a custom setter on the computed property + * `name: "debug name"` + * `equals: fn` the equality value to use for the computed to determine whether its output has changed. The default is `comparer.default`. Alternatives are `comparer.structural`, `comparer.identity` or just your own comparison function. + * `requiresReaction: boolean` see above. + +* `autorun(fn, options?)` now accepts the following options: + * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` + * `name: "debug name"` + * `scheduler: function` a custom scheduler to run the autorun. For example to connect running the autorun to `requestAnimationFrame`. See the docs for more details + * `onError`. A custom error handler to be notified when an autorun throws an exception. + +* `reaction(expr, effect, options?)` now accepts the following options: + * `delay: number` debounce the autorun with the given amount of milliseconds. This replaces the MobX 3 api `autorunAsync` + * `fireImmediately`. Immediately fire the effect function after the first evaluation of `expr` + * `equals`. Custom equality function to determine whether the `expr` function differed from its previous result, and hence should fire `effect`. Accepts the same options as the `equals` option of computed. + * All the options `autorun` accepts + +* `when(predicate, effect?, options?)` now accepts the following options: + * `name: "debug name"` + * `onError`. A custom error handler to be notified when an autorun throws an exception. + * `timeout: number` a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time +* The `effect` parameter of `when` has become optional. If it is omitted, `when` will return a promise. This makes it easy to `await` a condition, for example: `await when(() => user.profile.loaded)`. The returned promise can be cancelled using `promise.cancel()` + +* There is now an utility API that enables manipulating observable maps, objects and arrays with the same api. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. + * `values(thing)` returns all values in the collection as array + * `keys(thing)` returns all keys in the collection as array + * `set(thing, key, value)` or `set(thing, { key: value })` Updates the given collection with the provided key / value pair(s). + * `remove(thing, key)` removes the specified child from the collection. For arrays splicing is used. + * `has(thing, key)` returns true if the collection has the specified _observable_ property. + * `get(thing, key)` returns the chlid under the specified key. + +* `observable`, `observable.array`, `observable.object`, `observable.map` and `extendObservable` now accept an additional options object, which can specify the following attributes: + * `name: "debug name"` + * `deep: boolean`. `true` by default, indicates whether the children of this collection are automatically converted into observables as well. + * `defaultDecorator: ` specifies the default decorator used for new children / properties, by default: `observable.deep`, but could be changed to `observable.ref`, `observable.struct` etc. (The `deep` property is just a short-hand for switching between `observable.deep` or `observable.ref` as default decorator for new properties) + ### Breaking changes The changes mentioned here are discussed in detail in the [migration notes](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) -* MobX 4 requires `Map` to be globally available. Polyfill it if targeting IE < 11 or other older browsers. -* For typescript users, MobX now requires `Map` and several `Symbol`s to exist for its typings. So make sure that the `lib` configuration of your project is set to `"es6"`. (The compilation target can still be `"es5"`) -* `observable.shallowArray(values)` has been removed, instead use `observable.array(values, { deep: false })` -* `observable.shallowMap(values)` has been removed, instead use `observable.map(values, { deep: false })` -* `observable.shallowObject(values)` has been removed, instead use `observable.object(values, {}, { deep: false })` -* `extendShallowObservable(target, props)`, instead use `extendObservable(target, props, {}, { deep: false })` -* The decorators `observable.ref`, `observable.shallow`, `observable.deep`, `observable.struct` can no longer be used as functions. Instead, they should be passed as part of the `decorators` param to resp. `observable.object` and `extendObservable` -* The new signature of `extendObservable` is `extendObservable(target, props, decorators?, options?)`. This also means it is no longer possible to pass multiple bags of properties to `extendObservable`. `extendObservable` can no longer be used to re-declare properties. Use `set` instead to update existing properties (or introduce new ones). -* Iterating maps now follows the spec, that is, `map.values()`, `map.entries()`, `map.keys()`, `map[@@iterator]()` and `array[@@iterator]()` no longer return an array, but an iterator. Use `mobx.values(map)` or `Array.from(map)` to convert the iterators to arrays. -* dropped `@computed.equals`, instead, you can now use `@computed({ equals: ... })` -* `useStrict(boolean)` was dropped, use `configure({ enforceActions: boolean })` instead -* `isolateGlobalState` was dropped, use `configure({ isolateGlobalState: true})` instead -* If there are multiple mobx instances active in a single project, an exception will be thrown. Previously only a warning was printed. Fixes #1098. For details, see [#1082](https://github.com/mobxjs/mobx/issues/1082). -* Dropped the `shareGlobalState` feature. Instead, projects should be setup properly and it is up to the hosting package to make sure that there is only one MobX instance -* `expr` has been moved to mobx-utils. Remember, `expr(fn)` is just `computed(fn).get()` -* `createTransformer` has been moved to mobx-utils -* Passing `context` explicitly to `autorun`, `reaction` etc is no longer supported. Use arrow functions or function.bind instead. -* Removed `autorunAsync`. Use the `delay` option of `autorun` instead. -* `autorun`, `when`, `reaction` don't support name as first argument anymore, instead pass the `name` option. -* The `extras.` namespace has been dropped to enable tree-shaking non-used MobX features. All methods that where there originally are now exported at top level. If they are part of the official public API (you are encouraged to use them) they are exported as is. If they are experimental or somehow internal (you are discouraged to use them), they are prefixed with `_`. -* Dropped bower support. Fixes #1263 -* The `spyReportStart`, `spyReportEnd`, `spyReport` and `isSpyEnabled` are no longer public. It is no longer possible to emit custom spy events as to avoid confusing in listeners what the possible set of events is. -* Dropped `isStrictModeEnabled` -* `observable(value)` will only succeed if it can turn the value into an observable data structure (a Map, Array or observable object). But it will no longer create an observable box for other values to avoid confusion. Call `observable.box(value)` explictly in such cases. -* `isComputed` and `isObservable` no longer accept a property as second argument. Instead use `isComputedProp` and `isObservableProp`. -* Removed `whyRun`, use `trace` instead -* The spy event signature has slightly changed -* The `Atom` class is no longer exposed. Use `createAtom` instead (same signature). -* Calling reportObserved() on a self made atom will no longer trigger the hooks if reportObserved is triggered outside a reactive context. -* The options `struct` and `compareStructural` for computed values are deprecated, use `@computed.struct` or `computed({ equals: comparer.structural})` instead. -* `isModifierDescriptor` is no longer exposed. -* `deepEqual` is no longer exposed, use `comparer.structural` instead. -* `setReactionScheduler` -> `configure({ reactionScheduler: fn })` -* `reserveArrayBuffer` -> `configure({ reactionErrorHandler: fn })` -* `ObservableMap` is no longer exposed as constructor, use `observable.map` or `isObservableMap` instead -* `map` -> `observable.map` -* `runInAction` no longer accepts a custom scope -* Dropped the already deprecated and broken `default` export that made it harder to tree-shake mobx. Make sure to always use `import { x } from "mobx"` and not `import mobx from "mobx"`. -* Killed the already deprecated modifiers `asFlat` etc. If you war still using this, see the MobX 2 -> 3 migration notes. -* Observable maps now fully implement the map interface. See [#1361](https://github.com/mobxjs/mobx/pull/1361) by [Marc Fallows](https://github.com/marcfallows) -* Observable arrays will no longer expose the `.move` method -* Dropped the `observable.deep.struct` modifier -* Dropped the `observable.ref.struct` modifier -* `observable.struct` now behaves like `observable.ref.struct` (this used to be `observable.deep.struct`). That is; values in an `observable.struct` field will be stored as is, but structural comparison will be used when assigning a new value -* IReactionDisposer.onError has been removed, use the `onError` option of reactions instead +* MobX 4 requires `Map` to be globally available. Polyfill it if targeting IE < 11 or other older browsers. +* For typescript users, MobX now requires `Map` and several `Symbol`s to exist for its typings. So make sure that the `lib` configuration of your project is set to `"es6"`. (The compilation target can still be `"es5"`) +* `observable.shallowArray(values)` has been removed, instead use `observable.array(values, { deep: false })` +* `observable.shallowMap(values)` has been removed, instead use `observable.map(values, { deep: false })` +* `observable.shallowObject(values)` has been removed, instead use `observable.object(values, {}, { deep: false })` +* `extendShallowObservable(target, props)`, instead use `extendObservable(target, props, {}, { deep: false })` +* The decorators `observable.ref`, `observable.shallow`, `observable.deep`, `observable.struct` can no longer be used as functions. Instead, they should be passed as part of the `decorators` param to resp. `observable.object` and `extendObservable` +* The new signature of `extendObservable` is `extendObservable(target, props, decorators?, options?)`. This also means it is no longer possible to pass multiple bags of properties to `extendObservable`. `extendObservable` can no longer be used to re-declare properties. Use `set` instead to update existing properties (or introduce new ones). +* Iterating maps now follows the spec, that is, `map.values()`, `map.entries()`, `map.keys()`, `map[@@iterator]()` and `array[@@iterator]()` no longer return an array, but an iterator. Use `mobx.values(map)` or `Array.from(map)` to convert the iterators to arrays. +* dropped `@computed.equals`, instead, you can now use `@computed({ equals: ... })` +* `useStrict(boolean)` was dropped, use `configure({ enforceActions: boolean })` instead +* `isolateGlobalState` was dropped, use `configure({ isolateGlobalState: true})` instead +* If there are multiple mobx instances active in a single project, an exception will be thrown. Previously only a warning was printed. Fixes #1098. For details, see [#1082](https://github.com/mobxjs/mobx/issues/1082). +* Dropped the `shareGlobalState` feature. Instead, projects should be setup properly and it is up to the hosting package to make sure that there is only one MobX instance +* `expr` has been moved to mobx-utils. Remember, `expr(fn)` is just `computed(fn).get()` +* `createTransformer` has been moved to mobx-utils +* Passing `context` explicitly to `autorun`, `reaction` etc is no longer supported. Use arrow functions or function.bind instead. +* Removed `autorunAsync`. Use the `delay` option of `autorun` instead. +* `autorun`, `when`, `reaction` don't support name as first argument anymore, instead pass the `name` option. +* The `extras.` namespace has been dropped to enable tree-shaking non-used MobX features. All methods that where there originally are now exported at top level. If they are part of the official public API (you are encouraged to use them) they are exported as is. If they are experimental or somehow internal (you are discouraged to use them), they are prefixed with `_`. +* Dropped bower support. Fixes #1263 +* The `spyReportStart`, `spyReportEnd`, `spyReport` and `isSpyEnabled` are no longer public. It is no longer possible to emit custom spy events as to avoid confusing in listeners what the possible set of events is. +* Dropped `isStrictModeEnabled` +* `observable(value)` will only succeed if it can turn the value into an observable data structure (a Map, Array or observable object). But it will no longer create an observable box for other values to avoid confusion. Call `observable.box(value)` explictly in such cases. +* `isComputed` and `isObservable` no longer accept a property as second argument. Instead use `isComputedProp` and `isObservableProp`. +* Removed `whyRun`, use `trace` instead +* The spy event signature has slightly changed +* The `Atom` class is no longer exposed. Use `createAtom` instead (same signature). +* Calling reportObserved() on a self made atom will no longer trigger the hooks if reportObserved is triggered outside a reactive context. +* The options `struct` and `compareStructural` for computed values are deprecated, use `@computed.struct` or `computed({ equals: comparer.structural})` instead. +* `isModifierDescriptor` is no longer exposed. +* `deepEqual` is no longer exposed, use `comparer.structural` instead. +* `setReactionScheduler` -> `configure({ reactionScheduler: fn })` +* `reserveArrayBuffer` -> `configure({ reactionErrorHandler: fn })` +* `ObservableMap` is no longer exposed as constructor, use `observable.map` or `isObservableMap` instead +* `map` -> `observable.map` +* `runInAction` no longer accepts a custom scope +* Dropped the already deprecated and broken `default` export that made it harder to tree-shake mobx. Make sure to always use `import { x } from "mobx"` and not `import mobx from "mobx"`. +* Killed the already deprecated modifiers `asFlat` etc. If you war still using this, see the MobX 2 -> 3 migration notes. +* Observable maps now fully implement the map interface. See [#1361](https://github.com/mobxjs/mobx/pull/1361) by [Marc Fallows](https://github.com/marcfallows) +* Observable arrays will no longer expose the `.move` method +* Dropped the `observable.deep.struct` modifier +* Dropped the `observable.ref.struct` modifier +* `observable.struct` now behaves like `observable.ref.struct` (this used to be `observable.deep.struct`). That is; values in an `observable.struct` field will be stored as is, but structural comparison will be used when assigning a new value +* IReactionDisposer.onError has been removed, use the `onError` option of reactions instead ### Issues fixed in this release: The issues are incoprorated in the above notes. -* [#1316](https://github.com/mobxjs/mobx/issues/1316) - Improve `observable` api -* [#992](https://github.com/mobxjs/mobx/issues/992) - `onBecomeObserved` & `onBecomeUnobserved` -* [#1301](https://github.com/mobxjs/mobx/issues/1301) - Set `onError` handler when creating reactions -* [#817](https://github.com/mobxjs/mobx/issues/817) - Improve typings of `observe` -* [#800](https://github.com/mobxjs/mobx/issues/800) - Use `Map` as backend implementation of observable maps -* [#1361](https://github.com/mobxjs/mobx/issues/1361) - Make observableMaps structurally correct maps -* [#813](https://github.com/mobxjs/mobx/issues/813) - Create separate dev and production builds -* [#961](https://github.com/mobxjs/mobx/issues/961), [#1197](https://github.com/mobxjs/mobx/issues/1197) - Make it possible to forbid reading an untracked computed value -* [#1098](https://github.com/mobxjs/mobx/issues/1098) - Throw instead of warn if multiple MobX instances are active -* [#1122](https://github.com/mobxjs/mobx/issues/1122) - Atom hooks fired to often for observable maps -* [#1148](https://github.com/mobxjs/mobx/issues/1148) - Disposer of reactions should also cancel all scheduled effects -* [#1241](https://github.com/mobxjs/mobx/issues/1241) - Make it possible to disable error boundaries, to make it easier to find exceptions -* [#1263](https://github.com/mobxjs/mobx/issues/1263) - Remove bower.json +* [#1316](https://github.com/mobxjs/mobx/issues/1316) - Improve `observable` api +* [#992](https://github.com/mobxjs/mobx/issues/992) - `onBecomeObserved` & `onBecomeUnobserved` +* [#1301](https://github.com/mobxjs/mobx/issues/1301) - Set `onError` handler when creating reactions +* [#817](https://github.com/mobxjs/mobx/issues/817) - Improve typings of `observe` +* [#800](https://github.com/mobxjs/mobx/issues/800) - Use `Map` as backend implementation of observable maps +* [#1361](https://github.com/mobxjs/mobx/issues/1361) - Make observableMaps structurally correct maps +* [#813](https://github.com/mobxjs/mobx/issues/813) - Create separate dev and production builds +* [#961](https://github.com/mobxjs/mobx/issues/961), [#1197](https://github.com/mobxjs/mobx/issues/1197) - Make it possible to forbid reading an untracked computed value +* [#1098](https://github.com/mobxjs/mobx/issues/1098) - Throw instead of warn if multiple MobX instances are active +* [#1122](https://github.com/mobxjs/mobx/issues/1122) - Atom hooks fired to often for observable maps +* [#1148](https://github.com/mobxjs/mobx/issues/1148) - Disposer of reactions should also cancel all scheduled effects +* [#1241](https://github.com/mobxjs/mobx/issues/1241) - Make it possible to disable error boundaries, to make it easier to find exceptions +* [#1263](https://github.com/mobxjs/mobx/issues/1263) - Remove bower.json # 3.6.2 -* Fixed accidental dependency on the `node` typings. Fixes [#1387](https://github.com/mobxjs/mobx/issues/1387) / [#1362](https://github.com/mobxjs/mobx/issues/1387) +* Fixed accidental dependency on the `node` typings. Fixes [#1387](https://github.com/mobxjs/mobx/issues/1387) / [#1362](https://github.com/mobxjs/mobx/issues/1387) # 3.6.1 -* Fixed [#1358](https://github.com/mobxjs/mobx/pull/1359): Deep comparison failing on IE11. By [le0nik](https://github.com/le0nik) through [#1359](https://github.com/mobxjs/mobx/pull/1359) +* Fixed [#1358](https://github.com/mobxjs/mobx/pull/1359): Deep comparison failing on IE11. By [le0nik](https://github.com/le0nik) through [#1359](https://github.com/mobxjs/mobx/pull/1359) # 3.6.0 -* Fixed [#1118](https://github.com/mobxjs/mobx/issues/1118), the deepEquals operator build into mobx gave wrong results for non-primitive objects. This affected for example `computed.struct`, or the `compareStructural` of `reaction` +* Fixed [#1118](https://github.com/mobxjs/mobx/issues/1118), the deepEquals operator build into mobx gave wrong results for non-primitive objects. This affected for example `computed.struct`, or the `compareStructural` of `reaction` # 3.5.0/1 -* Introduced `trace` for easier debugging of reactions / computed values. See the [docs](https://mobx.js.org/best/trace.html) for details. -* Improved typings of `observableArray.find`, see [#1324](https://github.com/mobxjs/mobx/pull/1324) for details. +* Introduced `trace` for easier debugging of reactions / computed values. See the [docs](https://mobx.js.org/best/trace.html) for details. +* Improved typings of `observableArray.find`, see [#1324](https://github.com/mobxjs/mobx/pull/1324) for details. # 3.4.1 -* Republished 3.4.0, because the package update doesn't seem to distibute consistently through yarn / npm +* Republished 3.4.0, because the package update doesn't seem to distibute consistently through yarn / npm # 3.4.0 -* Improve Flow support by exposing typings regularly. Flow will automatically include them now. In your `.flowconfig` will have to remove the import in the `[libs]` section (as it's done [here](https://github.com/mobxjs/mobx/pull/1254#issuecomment-348926416)). Fixes [#1232](https://github.com/mobxjs/mobx/issues/1232). +* Improve Flow support by exposing typings regularly. Flow will automatically include them now. In your `.flowconfig` will have to remove the import in the `[libs]` section (as it's done [here](https://github.com/mobxjs/mobx/pull/1254#issuecomment-348926416)). Fixes [#1232](https://github.com/mobxjs/mobx/issues/1232). # 3.3.3 -* Fixed regression bug where observable map contents could not be replaced using another observable map [#1258](https://github.com/mobxjs/mobx/issues/1258) -* Fixed weird exception abot not being able to read `length` property of a function, see[#1238](https://github.com/mobxjs/mobx/issues/1238) through [#1257](https://github.com/mobxjs/mobx/issues/1238) by @dannsam +* Fixed regression bug where observable map contents could not be replaced using another observable map [#1258](https://github.com/mobxjs/mobx/issues/1258) +* Fixed weird exception abot not being able to read `length` property of a function, see[#1238](https://github.com/mobxjs/mobx/issues/1238) through [#1257](https://github.com/mobxjs/mobx/issues/1238) by @dannsam # 3.3.2 -* Fix bug where custom comparers could be invoked with `undefined` values. Fixes [#1208](https://github.com/mobxjs/mobx/issues/1208) -* Make typings for observable stricter when using flow [#1194](https://github.com/mobxjs/mobx/issues/1194), [#1231](https://github.com/mobxjs/mobx/issues/1231) -* Fix a bug where `map.replace` would trigger reactions for unchanged values, fixes [#1243](https://github.com/mobxjs/mobx/issues/1243) -* Fixed issue where `NaN` was considered unequal to `NaN` when a deep compare was made [#1249](https://github.com/mobxjs/mobx/issues/1249) +* Fix bug where custom comparers could be invoked with `undefined` values. Fixes [#1208](https://github.com/mobxjs/mobx/issues/1208) +* Make typings for observable stricter when using flow [#1194](https://github.com/mobxjs/mobx/issues/1194), [#1231](https://github.com/mobxjs/mobx/issues/1231) +* Fix a bug where `map.replace` would trigger reactions for unchanged values, fixes [#1243](https://github.com/mobxjs/mobx/issues/1243) +* Fixed issue where `NaN` was considered unequal to `NaN` when a deep compare was made [#1249](https://github.com/mobxjs/mobx/issues/1249) # 3.3.1 -* Fix bug allowing maps to be modified outside actions when using strict mode, fixes [#940](https://github.com/mobxjs/mobx/issues/940) -* Fixed [#1139](https://github.com/mobxjs/mobx/issues/1139) properly: `transaction` is no longer deprecated and doesn't disable tracking properties anymore -* Fixed [#1120](https://github.com/mobxjs/mobx/issues/1139): `isComputed` should return false for non-existing properties +* Fix bug allowing maps to be modified outside actions when using strict mode, fixes [#940](https://github.com/mobxjs/mobx/issues/940) +* Fixed [#1139](https://github.com/mobxjs/mobx/issues/1139) properly: `transaction` is no longer deprecated and doesn't disable tracking properties anymore +* Fixed [#1120](https://github.com/mobxjs/mobx/issues/1139): `isComputed` should return false for non-existing properties # 3.3.0 -* Undeprecated `transaction`, see [#1139](https://github.com/mobxjs/mobx/issues/1139) -* Fixed typings of reaction [#1136](https://github.com/mobxjs/mobx/issues/1136) -* It is now possible to re-define a computed property [#1121](https://github.com/mobxjs/mobx/issues/1121) -* Print an helpful error message when using `@action` on a getter [#971](https://github.com/mobxjs/mobx/issues/971) -* Improved typings of intercept [#1119](https://github.com/mobxjs/mobx/issues/1119) -* Made code base Prettier [#1103](https://github.com/mobxjs/mobx/issues/1103) -* react-native will now by default use the es module build as well. -* Added support for Weex, see [#1163](https://github.com/mobxjs/mobx/pull/1163/) -* Added workaround for Firefox issue causing MobX to crash, see [#614](https://github.com/mobxjs/mobx/issues/614) +* Undeprecated `transaction`, see [#1139](https://github.com/mobxjs/mobx/issues/1139) +* Fixed typings of reaction [#1136](https://github.com/mobxjs/mobx/issues/1136) +* It is now possible to re-define a computed property [#1121](https://github.com/mobxjs/mobx/issues/1121) +* Print an helpful error message when using `@action` on a getter [#971](https://github.com/mobxjs/mobx/issues/971) +* Improved typings of intercept [#1119](https://github.com/mobxjs/mobx/issues/1119) +* Made code base Prettier [#1103](https://github.com/mobxjs/mobx/issues/1103) +* react-native will now by default use the es module build as well. +* Added support for Weex, see [#1163](https://github.com/mobxjs/mobx/pull/1163/) +* Added workaround for Firefox issue causing MobX to crash, see [#614](https://github.com/mobxjs/mobx/issues/614) # 3.2.2 -* Fixes a bug (or a known limitation) described in [#1092](https://github.com/mobxjs/mobx/issue/1092/). It is now possible to have different observable administration on different levels of the prototype chain. By @guillaumeleclerc -* Fixed a build issue when using mobx in a project that was using rollup, fixes [#1099](https://github.com/mobxjs/mobx/issue/1099/) by @rossipedia -* Fixed typings of `useStrict`, by @rickbeerendonk +* Fixes a bug (or a known limitation) described in [#1092](https://github.com/mobxjs/mobx/issue/1092/). It is now possible to have different observable administration on different levels of the prototype chain. By @guillaumeleclerc +* Fixed a build issue when using mobx in a project that was using rollup, fixes [#1099](https://github.com/mobxjs/mobx/issue/1099/) by @rossipedia +* Fixed typings of `useStrict`, by @rickbeerendonk # 3.2.1 -* Introduced customizable value comperators to reactions and computed values. `reaction` and `computed` now support an additional option, `equals`, which takes a comparision function. See [#951](https://github.com/mobxjs/mobx/pull/951/) by @jamiewinder. Fixes #802 and #943. See the updated [`computed` docs](https://mobx.js.org/refguide/computed-decorator.html) for more details. +* Introduced customizable value comperators to reactions and computed values. `reaction` and `computed` now support an additional option, `equals`, which takes a comparision function. See [#951](https://github.com/mobxjs/mobx/pull/951/) by @jamiewinder. Fixes #802 and #943. See the updated [`computed` docs](https://mobx.js.org/refguide/computed-decorator.html) for more details. # 3.2.0 -* MobX will warn again when there are multiple instances of MobX loaded, as this lead to often to confusing bugs if the project setup was not properly. The signal mobx that multiple instances are loaded on purpose, use `mobx.extras.runInSandbox`. See [#1082](https://github.com/mobxjs/mobx/issues/1082) for details. +* MobX will warn again when there are multiple instances of MobX loaded, as this lead to often to confusing bugs if the project setup was not properly. The signal mobx that multiple instances are loaded on purpose, use `mobx.extras.runInSandbox`. See [#1082](https://github.com/mobxjs/mobx/issues/1082) for details. # 3.1.17 -* Improved typings of `IObservableArray.intercept`: use more restrictive types for `change` parameter of `handler`, by @bvanreeven -* Fixed [#1072](https://github.com/mobxjs/mobx/issues/1072), fields without a default value could not be observed yet when using TypeScript +* Improved typings of `IObservableArray.intercept`: use more restrictive types for `change` parameter of `handler`, by @bvanreeven +* Fixed [#1072](https://github.com/mobxjs/mobx/issues/1072), fields without a default value could not be observed yet when using TypeScript # 3.1.16 -* Restored `default` export (and added warning), which broke code that was importing mobx like `import mobx from "mobx"`. Use `import * as mobx from "mobx"` or use named importes instead. By @andykog, see #1043, #1050 -* Fixed several typos in exceptions and documentation +* Restored `default` export (and added warning), which broke code that was importing mobx like `import mobx from "mobx"`. Use `import * as mobx from "mobx"` or use named importes instead. By @andykog, see #1043, #1050 +* Fixed several typos in exceptions and documentation # 3.1.15 -* Fixed issue where `array.remove` did not work correctly in combination with `extras.interceptReads` +* Fixed issue where `array.remove` did not work correctly in combination with `extras.interceptReads` # 3.1.14 -* Fixed 3.1.12 / 3.1.13 module packing. See #1039; `module` target is now transpiled to ES5 as well +* Fixed 3.1.12 / 3.1.13 module packing. See #1039; `module` target is now transpiled to ES5 as well # 3.1.13 (Unpublished: Uglify chokes on it in CRA) -* Fixed build issue with webpack 2, see #1040 +* Fixed build issue with webpack 2, see #1040 # 3.1.12 (Unpublished: wasn't being bundled correctly by all bundlers) -* Added support for ES modules. See #1027 by @rossipedia -* Improved flow typings. See #1019 by @fb55 -* Introduced experimental feature `extras.interceptReads(observable: ObservableMap | ObservableArray | ObservableObject | ObservableBox, property?: string, handler: value => value): Disposer` that can be used to intercept _reads_ from observable objects, to transform values on the fly when a value is read. One can achieve similar things with this as with proxying reads. See #1036 +* Added support for ES modules. See #1027 by @rossipedia +* Improved flow typings. See #1019 by @fb55 +* Introduced experimental feature `extras.interceptReads(observable: ObservableMap | ObservableArray | ObservableObject | ObservableBox, property?: string, handler: value => value): Disposer` that can be used to intercept _reads_ from observable objects, to transform values on the fly when a value is read. One can achieve similar things with this as with proxying reads. See #1036 # 3.1.11 -* Using rollup as bundler, instead of custom hacked build scripts, by @rossipedia, see #1023 +* Using rollup as bundler, instead of custom hacked build scripts, by @rossipedia, see #1023 # 3.1.10 -* Fixed flow typings for `when`, by @jamsea -* Add flow typings for `map.replace`, by @leader22 -* Added `observableArray.findIndex`, by @leader22 -* Improved typings of `autorun` / `autorunAsync` to better support async / await, by @capaj -* Fixed typings of `action.bound`, see #803 +* Fixed flow typings for `when`, by @jamsea +* Add flow typings for `map.replace`, by @leader22 +* Added `observableArray.findIndex`, by @leader22 +* Improved typings of `autorun` / `autorunAsync` to better support async / await, by @capaj +* Fixed typings of `action.bound`, see #803 # 3.1.9 -* Introduced explicit `.get(index)` and `.set(index, value)` methods on observable arrays, for issues that have trouble handling many property descriptors on objects. See also #734 -* Made sure it is safe to call `onBecomeObserved` twice in row, fixes #874, #898 -* Fixed typings of `IReactionDisposer` +* Introduced explicit `.get(index)` and `.set(index, value)` methods on observable arrays, for issues that have trouble handling many property descriptors on objects. See also #734 +* Made sure it is safe to call `onBecomeObserved` twice in row, fixes #874, #898 +* Fixed typings of `IReactionDisposer` # 3.1.8 -* Fixed edge case where `autorun` was not triggered again if a computed value was invalidated by the reaction itself, see [#916](https://github.com/mobxjs/mobx/issues/916), by @andykog -* Added support for primtive keys in `createTransformer`, See #920 by @dnakov -* Improved typings of `isArrayLike`, see #904, by @mohsen1 +* Fixed edge case where `autorun` was not triggered again if a computed value was invalidated by the reaction itself, see [#916](https://github.com/mobxjs/mobx/issues/916), by @andykog +* Added support for primtive keys in `createTransformer`, See #920 by @dnakov +* Improved typings of `isArrayLike`, see #904, by @mohsen1 # 3.1.7 -* Reverted ES2015 module changes, as they broke with webpack 2 (will be re-released later) +* Reverted ES2015 module changes, as they broke with webpack 2 (will be re-released later) # 3.1.6 (Unpublished) -* Expose ES2015 modules to be used with advanced bundlers, by @mohsen1, fixes #868 -* Improved typings of `IObservableArray.intercept`: remove superflous type parameter, by @bvanreeven -* Improved typings of map changes, by @hediet +* Expose ES2015 modules to be used with advanced bundlers, by @mohsen1, fixes #868 +* Improved typings of `IObservableArray.intercept`: remove superflous type parameter, by @bvanreeven +* Improved typings of map changes, by @hediet # 3.1.5 -* Improved typings of map changes, see #847, by @hediet -* Fixed issue with `reaction` if `fireImmediately` was combined with `delay` option, see #837, by @SaboteurSpk +* Improved typings of map changes, see #847, by @hediet +* Fixed issue with `reaction` if `fireImmediately` was combined with `delay` option, see #837, by @SaboteurSpk # 3.1.4 -* Observable maps initialized from ES6 didn't deeply convert their values to observables. (fixes #869,by @ggarek) +* Observable maps initialized from ES6 didn't deeply convert their values to observables. (fixes #869,by @ggarek) # 3.1.3 -* Make sure that `ObservableArray.replace` can handle large arrays by not using splats internally. (See e.g. #859) -* Exposed `ObservableArray.spliceWithArray`, that unlike a normal splice, doesn't use a variadic argument list so that it is possible to splice in new arrays that are larger then allowed by the callstack. +* Make sure that `ObservableArray.replace` can handle large arrays by not using splats internally. (See e.g. #859) +* Exposed `ObservableArray.spliceWithArray`, that unlike a normal splice, doesn't use a variadic argument list so that it is possible to splice in new arrays that are larger then allowed by the callstack. # 3.1.2 -* Fixed incompatiblity issue with `mobx-react@4.1.0` +* Fixed incompatiblity issue with `mobx-react@4.1.0` # 3.1.1 (unpublished) -* Introduced `isBoxedObservable(value)`, fixes #804 +* Introduced `isBoxedObservable(value)`, fixes #804 # 3.1.0 @@ -497,8 +491,8 @@ The issues are incoprorated in the above notes. Strict mode has been relaxed a bit in this release. Also computed values can now better handle creating new observables (in an action if needed). The semantics are now as follows: -* In strict mode, it is not allowed to modify state that is already being _observed_ by some reaction. -* It is allowed to create and modify observable values in computed blocks, as long as they are not _observed_ yet. +* In strict mode, it is not allowed to modify state that is already being _observed_ by some reaction. +* It is allowed to create and modify observable values in computed blocks, as long as they are not _observed_ yet. In order words: Observables that are not in use anywhere yet, are not protected by MobX strict mode. This is fine as the main goal of strict mode is to avoid kicking of reactions at undesired places. @@ -506,44 +500,42 @@ Also strict mode enforces batched mutations of observables (through action). However, for unobserved observables this is not relevant; they won't kick of reactions at all. This fixes some uses cases where one now have to jump through hoops like: - -* Creating observables in computed properties was fine already, but threw if this was done with the aid of an action. See issue [#798](https://github.com/mobxjs/mobx/issues/798). -* In strict mode, it was not possible to _update_ observable values without wrapping the code in `runInAction` or `action`. See issue [#563](https://github.com/mobxjs/mobx/issues/563) +* Creating observables in computed properties was fine already, but threw if this was done with the aid of an action. See issue [#798](https://github.com/mobxjs/mobx/issues/798). +* In strict mode, it was not possible to _update_ observable values without wrapping the code in `runInAction` or `action`. See issue [#563](https://github.com/mobxjs/mobx/issues/563) Note that the following constructions are still anti patterns, although MobX won't throw anymore on them: +* Changing unobserved, but not just created observables in a computed value +* Invoke actions in computed values. Use reactions like `autorun` or `reaction` instead. -* Changing unobserved, but not just created observables in a computed value -* Invoke actions in computed values. Use reactions like `autorun` or `reaction` instead. - -Note that observables that are not in use by a reaction, but that have `.observe` listeners attached, do _not_ count towards being observed. +Note that observables that are not in use by a reaction, but that have `.observe` listeners attached, do *not* count towards being observed. Observe and intercept callbacks are concepts that do not relate to strict mode, actions or transactions. ### Other changes -* Reactions and observable values now consider `NaN === NaN`, See #805 by @andykog -* Merged #783: extract error messages to seperate file, so that they can be optimized in production builds (not yet done), by @reisel, #GoodnessSquad -* Improved typings of actions, see #796 by @mattiamanzati +* Reactions and observable values now consider `NaN === NaN`, See #805 by @andykog +* Merged #783: extract error messages to seperate file, so that they can be optimized in production builds (not yet done), by @reisel, #GoodnessSquad +* Improved typings of actions, see #796 by @mattiamanzati # 3.0.2 -* Fixed issue where MobX failed on environments where `Map` is not defined, #779 by @dirtyrolf -* MobX can now be compiled on windows as well! #772 by @madarauchiha #GoodnessSquad -* Added documentation on how Flow typings can be used, #766 by @wietsevenema -* Added support for `Symbol.toPrimitive()` and `valueOf()`, see #773 by @eladnava #GoodnessSquad -* Supressed an exception that was thrown when using the Chrome Developer tools to inspect arrays, see #752 +* Fixed issue where MobX failed on environments where `Map` is not defined, #779 by @dirtyrolf +* MobX can now be compiled on windows as well! #772 by @madarauchiha #GoodnessSquad +* Added documentation on how Flow typings can be used, #766 by @wietsevenema +* Added support for `Symbol.toPrimitive()` and `valueOf()`, see #773 by @eladnava #GoodnessSquad +* Supressed an exception that was thrown when using the Chrome Developer tools to inspect arrays, see #752 Re-introduced _structural comparison_. Seems we couldn't part from it yet :). So the following things have been added: -* `struct` option to `reaction` (alias for `compareStructural`, to get more consistency in naming) -* `observable.struct`, as alias for `observable.deep.struct` -* `observable.deep.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Converts new values automatically to observables (like `observable.deep`) -* `observable.ref.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Doesn't convert the new value into observables. -* `extras.deepEquals`: Check if two data structures are deeply equal. supports observable and non observable data structures. +* `struct` option to `reaction` (alias for `compareStructural`, to get more consistency in naming) +* `observable.struct`, as alias for `observable.deep.struct` +* `observable.deep.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Converts new values automatically to observables (like `observable.deep`) +* `observable.ref.struct`: Only stores a new value and notify observers if the new value is not structurally the same as the previous value. Beware of cycles! Doesn't convert the new value into observables. +* `extras.deepEquals`: Check if two data structures are deeply equal. supports observable and non observable data structures. # 3.0.1 -* `toString()` of observable arrays now behaves like normal arrays (by @capaj, see #759) -* Improved flow types of `toJS`by @jamsea (#758) +* `toString()` of observable arrays now behaves like normal arrays (by @capaj, see #759) +* Improved flow types of `toJS`by @jamsea (#758) # 3.0.0 @@ -557,7 +549,7 @@ Note that no changes to the runtime algorithm where made, almost all changes evo The api to create observables has been redesigned. By default, it keeps the automatic conversion behavior from MobX 2. -However, one can now have more fine grained control on how / which observables are constructed. +However, one can now have more fine grained control on how / which observables are constructed. Modifiers still exists, but they are more regular, and there should be less need for them. ### `observable(plainObject)` will no longer enhance objects, but clone instead @@ -581,11 +573,11 @@ See [#649](https://github.com/mobxjs/mobx/issues/649) There are now explicit methods to create an observable of a specific type. -* `observable.object(props, name?)` creates a new observable object, by cloning the give props and making them observable -* `observable.array(initialValues, name?)`. Take a guess.. -* `observable.map(initialValues, name?)` -* `observable.box(initialValue, name?)`. Creates a [boxed](http://mobxjs.github.io/mobx/refguide/boxed.html) value, which can be read from / written to using `.get()` and `.set(newValue)` -* `observable(value)`, as-is, based on the type of `value`, uses any of the above four functions to create a new observable. +* `observable.object(props, name?)` creates a new observable object, by cloning the give props and making them observable +* `observable.array(initialValues, name?)`. Take a guess.. +* `observable.map(initialValues, name?)` +* `observable.box(initialValue, name?)`. Creates a [boxed](http://mobxjs.github.io/mobx/refguide/boxed.html) value, which can be read from / written to using `.get()` and `.set(newValue)` +* `observable(value)`, as-is, based on the type of `value`, uses any of the above four functions to create a new observable. ### Shallow factories per type @@ -595,10 +587,10 @@ For example when storing objects from external libraries. In MobX 2 you needed to use `asFlat` or `asReference` modifiers for this. In MobX 3, there are factories to directly create non-converting data structures: -* `observable.shallowObject(props, name?)` -* `observable.shallowArray(initialValues, name?)` -* `observable.shallowMap(initialValues, name?)` -* `observable.shallowBox(initialValue, name?)` +* `observable.shallowObject(props, name?)` +* `observable.shallowArray(initialValues, name?)` +* `observable.shallowMap(initialValues, name?)` +* `observable.shallowBox(initialValue, name?)` So for example, `observable.shallowArray([todo1, todo2])` will create an observable array, but it won't try to convert the todos inside the array into observables as well. @@ -622,9 +614,9 @@ Modifiers can be used in combination `@observable`, `extendObservable` and `obse The following modifiers are available: -* `observable.deep`: This is the default modifier, used by any observable. It converts any assigned, non-primitive value into an observable value if it isn't one yet. -* `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. -* `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an collection, which is shallowly observable (instead of deep) +* `observable.deep`: This is the default modifier, used by any observable. It converts any assigned, non-primitive value into an observable value if it isn't one yet. +* `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. +* `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an collection, which is shallowly observable (instead of deep) Modifiers can be used as decorator: @@ -648,25 +640,24 @@ See [modifiers](http://mobxjs.github.io/mobx/refguide/modifiers.html) ### `computed` api has been simplified Using `computed` to create boxed observables has been simplified, and `computed` can now be invoked as follows: - -* `computed(expr)` -* `computed(expr, setter)` -* `computed(expr, options)`, where options is an object that can specify one or more of the following fields: `name`, `setter`, `compareStructural` or `context` (the "this"). +* `computed(expr)` +* `computed(expr, setter)` +* `computed(expr, options)`, where options is an object that can specify one or more of the following fields: `name`, `setter`, `compareStructural` or `context` (the "this"). Computed can also be used as a decorator: -* `@computed` -* `@computed.struct` when you want to compareStructural (previously was `@computed({asStructure: true})`) +* `@computed` +* `@computed.struct` when you want to compareStructural (previously was `@computed({asStructure: true})`) ### `reaction` api has been simplified The signature of `reaction` is now `reaction(dataFunc, effectFunc, options?)`, where the following options are accepted: -* `context`: The `this` to be used in the functions -* `fireImmediately` -* `delay`: Number in milliseconds that can be used to debounce the effect function. -* `compareStructural`: `false` by default. If `true`, the return value of the _data_ function is structurally compared to its previous return value, and the _effect_ function will only be invoked if there is a structural change in the output. -* `name`: String +* `context`: The `this` to be used in the functions +* `fireImmediately` +* `delay`: Number in milliseconds that can be used to debounce the effect function. +* `compareStructural`: `false` by default. If `true`, the return value of the *data* function is structurally compared to its previous return value, and the *effect* function will only be invoked if there is a structural change in the output. +* `name`: String ### Bound actions @@ -675,12 +666,12 @@ This means that now the following is possible: ```javascript class Ticker { - @observable tick = 0 + @observable tick = 0 - @action.bound - increment() { - this.tick++ // 'this' will always be correct - } + @action.bound + increment() { + this.tick++ // 'this' will always be correct + } } const ticker = new Ticker() @@ -692,10 +683,10 @@ setInterval(ticker.increment, 1000) Error handling in MobX has been made more consistent. In MobX 2 there was a best-effort recovery attempt if a derivation throws, but MobX 3 introduced more consistent behavior: -* Computed values that throw, store the exception and throw it to the next consumer(s). They keep tracking their data, so they are able to recover from exceptions in next re-runs. -* Reactions (like `autorun`, `when`, `reaction`, `render()` of `observer` components) will always catch their exceptions, and just log the error. They will keep tracking their data, so they are able to recover in next re-runs. -* The disposer of a reaction exposes an `onError(handler)` method, which makes it possible to attach custom error handling logic to an reaction (that overrides the default logging behavior). -* `extras.onReactionError(handler)` can be used to register a global onError handler for reactions (will fire after spy "error" event). This can be useful in tests etc. +* Computed values that throw, store the exception and throw it to the next consumer(s). They keep tracking their data, so they are able to recover from exceptions in next re-runs. +* Reactions (like `autorun`, `when`, `reaction`, `render()` of `observer` components) will always catch their exceptions, and just log the error. They will keep tracking their data, so they are able to recover in next re-runs. +* The disposer of a reaction exposes an `onError(handler)` method, which makes it possible to attach custom error handling logic to an reaction (that overrides the default logging behavior). +* `extras.onReactionError(handler)` can be used to register a global onError handler for reactions (will fire after spy "error" event). This can be useful in tests etc. See [#731](https://github.com/mobxjs/mobx/issues/731) @@ -716,10 +707,10 @@ Add flow types for methods and interfaces of observable variables: ```js const observableValue: IObservableValue = observable(1) -const observableArray: IObservableArray = observable([1, 2, 3]) +const observableArray: IObservableArray = observable([1,2,3]) const sum: IComputedValue = computed(() => { - return observableArray.reduce((a: number, b: number): number => a + b, 0) + return observableArray.reduce((a: number, b: number): number => a + b, 0) }) ``` @@ -750,27 +741,27 @@ Whether or not this was ever a good idea is debatable, but it stopped working in ### Other changes -* **Breaking change:** The arguments to `observe` listeners for computed and boxed observables have changed and are now consistent with the other apis. Instead of invoking the callback with `(newValue: T, oldValue: T)` they are now invoked with a single change object: `(change: {newValue: T, oldValue: T, object, type: "update"})` -* Using transaction is now deprecated, use `action` or `runInAction` instead. Transactions now will enter an `untracked` block as well, just as actions, which removes the conceptual difference. -* Upgraded to typescript 2 -* It is now possible to pass ES6 Maps to `observable` / observable maps. The map will be converted to an observable map (if keys are string like) -* Made `action` more debug friendly, it should now be easier to step through -* ObservableMap now has an additional method, `.replace(data)`, which is a combination of `clear()` and `merge(data)`. -* Passing a function to `observable` will now create a boxed observable refering to that function -* Fixed #603: exceptions in transaction breaks future reactions -* Fixed #698: createTransformer should support default arguments -* Transactions are no longer reported grouped in spy events. If you want to group events, use actions instead. -* Normalized `spy` events further. Computed values and actions now report `object` instead of `target` for the scope they have been applied to. -* The following deprecated methods have been removed: - * `transaction` - * `autorunUntil` - * `trackTransitions` - * `fastArray` - * `SimpleEventEmitter` - * `ObservableMap.toJs` (use `toJS`) - * `toJSlegacy` - * `toJSON` (use `toJS`) - * invoking `observe` and `inject` with plain javascript objects +* **Breaking change:** The arguments to `observe` listeners for computed and boxed observables have changed and are now consistent with the other apis. Instead of invoking the callback with `(newValue: T, oldValue: T)` they are now invoked with a single change object: `(change: {newValue: T, oldValue: T, object, type: "update"})` +* Using transaction is now deprecated, use `action` or `runInAction` instead. Transactions now will enter an `untracked` block as well, just as actions, which removes the conceptual difference. +* Upgraded to typescript 2 +* It is now possible to pass ES6 Maps to `observable` / observable maps. The map will be converted to an observable map (if keys are string like) +* Made `action` more debug friendly, it should now be easier to step through +* ObservableMap now has an additional method, `.replace(data)`, which is a combination of `clear()` and `merge(data)`. +* Passing a function to `observable` will now create a boxed observable refering to that function +* Fixed #603: exceptions in transaction breaks future reactions +* Fixed #698: createTransformer should support default arguments +* Transactions are no longer reported grouped in spy events. If you want to group events, use actions instead. +* Normalized `spy` events further. Computed values and actions now report `object` instead of `target` for the scope they have been applied to. +* The following deprecated methods have been removed: + * `transaction` + * `autorunUntil` + * `trackTransitions` + * `fastArray` + * `SimpleEventEmitter` + * `ObservableMap.toJs` (use `toJS`) + * `toJSlegacy` + * `toJSON` (use `toJS`) + * invoking `observe` and `inject` with plain javascript objects --- @@ -782,9 +773,9 @@ A deprecation message will now be printed if creating computed properties while ```javascript const x = observable({ - computedProp: function() { - return someComputation - } + computedProp: function() { + return someComputation + } }) // Due to automatic inferrence now available as computed property: @@ -797,9 +788,9 @@ Instead, to create a computed property, use: ```javascript observable({ - get computedProp() { - return someComputation - } + get computedProp() { + return someComputation + } }) ``` @@ -807,14 +798,14 @@ or alternatively: ```javascript observable({ - computedProp: computed(function() { - return someComputation - }) + computedProp: computed(function() { + return someComputation + }) }) ``` This change should avoid confusing experiences when trying to create methods that don't take arguments. -The current behavior will be kept as-is in the MobX 2.\* range, +The current behavior will be kept as-is in the MobX 2.* range, but from MobX 3 onward the argumentless functions will no longer be turned automatically into computed values; they will be treated the same as function with arguments. An observable _reference_ to the function will be made and the function itself will be preserved. @@ -824,10 +815,10 @@ N.B. If you want to introduce actions on an observable that modify its state, us ```javascript observable({ - counter: 0, - increment: action(function() { - this.counter++ - }) + counter: 0, + increment: action(function() { + this.counter++ + }) }) ``` @@ -845,73 +836,74 @@ Note, this only applies when using observable in this way; it doesn't apply when ### Misc -* Fixed #701: `toJS` sometimes failing to convert objects decorated with `@observable` (cause: `isObservable` sometimes returned false on these object) -* Fixed typings for `when` / `autorun` / `reaction`; they all return a disposer function. +* Fixed #701: `toJS` sometimes failing to convert objects decorated with `@observable` (cause: `isObservable` sometimes returned false on these object) +* Fixed typings for `when` / `autorun` / `reaction`; they all return a disposer function. + # 2.6.5 -* Added `move` operation to observable array, see [#697](https://github.com/mobxjs/mobx/pull/697) +* Added `move` operation to observable array, see [#697](https://github.com/mobxjs/mobx/pull/697) # 2.6.4 -* Fixed potential clean up issue if an exception was thrown from an intercept handler -* Improved typings of `asStructure` (by @nidu, see #687) -* Added support for `computed(asStructure(() => expr))` (by @yotambarzilay, see #685) +* Fixed potential clean up issue if an exception was thrown from an intercept handler +* Improved typings of `asStructure` (by @nidu, see #687) +* Added support for `computed(asStructure(() => expr))` (by @yotambarzilay, see #685) # 2.6.3 -* Fixed #603: exceptions in transaction breaks future reactions -* Improved typings of `toJS` -* Introduced `setReactionScheduler`. Internal api used by mobx-react@4 to be notified when reactions will be run +* Fixed #603: exceptions in transaction breaks future reactions +* Improved typings of `toJS` +* Introduced `setReactionScheduler`. Internal api used by mobx-react@4 to be notified when reactions will be run # 2.6.2 -* Changes related to `toJS` as mentioned in version `2.6.0` where not actually shipped. This has been fixed, so see release notes below. +* Changes related to `toJS` as mentioned in version `2.6.0` where not actually shipped. This has been fixed, so see release notes below. # 2.6.1 -* Introduced convenience `isArrayLike`: returns whether the argument is either a JS- or observable array. By @dslmeinte -* Improved readme. By @DavidLGoldberg -* Improved assertion message, by @ncammarate (See [#618](https://github.com/mobxjs/mobx/pull/618)) -* Added HashNode badge, by @sandeeppanda92 +* Introduced convenience `isArrayLike`: returns whether the argument is either a JS- or observable array. By @dslmeinte +* Improved readme. By @DavidLGoldberg +* Improved assertion message, by @ncammarate (See [#618](https://github.com/mobxjs/mobx/pull/618)) +* Added HashNode badge, by @sandeeppanda92 # 2.6.0 _Marked as minor release as the behavior of `toJS` has been changed, which might be interpreted both as bug-fix or as breaking change, depending of how you interpreted the docs_ -* Fixed [#566](https://github.com/mobxjs/mobx/pull/566): Fixed incorrect behavior of `toJS`: `toJS` will now only recurse into observable object, not all objects. The new behavior is now aligned with what is suggested in the docs, but as a result the semantics changed a bit. `toJSlegacy` will be around for a while implementing the old behavior. See [#589](See https://github.com/mobxjs/mobx/pull/589) for more details. -* Fixed [#571](https://github.com/mobxjs/mobx/pull/571): Don't use `instanceof` operator. Should fix issues if MobX is included multiple times in the same bundle. -* Fixed [#576](https://github.com/mobxjs/mobx/pull/576): disallow passing actions directly to `autorun`; as they won't be tracked by @jeffijoe -* Extending observable objects with other observable (objects) is now explicitly forbidden, fixes [#540](https://github.com/mobxjs/mobx/pull/540). +* Fixed [#566](https://github.com/mobxjs/mobx/pull/566): Fixed incorrect behavior of `toJS`: `toJS` will now only recurse into observable object, not all objects. The new behavior is now aligned with what is suggested in the docs, but as a result the semantics changed a bit. `toJSlegacy` will be around for a while implementing the old behavior. See [#589](See https://github.com/mobxjs/mobx/pull/589) for more details. +* Fixed [#571](https://github.com/mobxjs/mobx/pull/571): Don't use `instanceof` operator. Should fix issues if MobX is included multiple times in the same bundle. +* Fixed [#576](https://github.com/mobxjs/mobx/pull/576): disallow passing actions directly to `autorun`; as they won't be tracked by @jeffijoe +* Extending observable objects with other observable (objects) is now explicitly forbidden, fixes [#540](https://github.com/mobxjs/mobx/pull/540). # 2.5.2 -* Introduced `isComputed` -* Observable objects can now have a type: `IObservableObject`, see [#484](https://github.com/mobxjs/mobx/pull/484) by @spiffytech -* Restored 2.4 behavior of boxed observables inside observable objects, see [#558](https://github.com/mobxjs/mobx/issues/558) +* Introduced `isComputed` +* Observable objects can now have a type: `IObservableObject`, see [#484](https://github.com/mobxjs/mobx/pull/484) by @spiffytech +* Restored 2.4 behavior of boxed observables inside observable objects, see [#558](https://github.com/mobxjs/mobx/issues/558) # 2.5.1 -* Computed properties can now be created by using getter / setter functions. This is the idiomatic way to introduce computed properties from now on: +* Computed properties can now be created by using getter / setter functions. This is the idiomatic way to introduce computed properties from now on: ```javascript const box = observable({ - length: 2, - get squared() { - return this.length * this.length - }, - set squared(value) { - this.length = Math.sqrt(value) - } + length: 2, + get squared() { + return this.length * this.length + }, + set squared(value) { + this.length = Math.sqrt(value) + } }) ``` # 2.5.0 -* Core derivation algorithm has received some majore improvements by @asterius1! See below. Pr #452, 489 -* Introduced setters for computed properties, use `computed(expr, setter)` or `@computed get name() { return expr } set name (value) { action }`. `computed` can now be used as modifier in `observable` / `extendObservable`, #421, #463 (see below for example) -* Introduced `isStrictModeEnabled()`, deprecated `useStrict()` without arguments, see #464 -* Fixed #505, accessing an observable property throws before it is initialized +* Core derivation algorithm has received some majore improvements by @asterius1! See below. Pr #452, 489 +* Introduced setters for computed properties, use `computed(expr, setter)` or `@computed get name() { return expr } set name (value) { action }`. `computed` can now be used as modifier in `observable` / `extendObservable`, #421, #463 (see below for example) +* Introduced `isStrictModeEnabled()`, deprecated `useStrict()` without arguments, see #464 +* Fixed #505, accessing an observable property throws before it is initialized MobX is now able track and memoize computed values while an (trans)action is running. Before 2.5, accessing a computed value during a transaction always resulted in a recomputation each time the computed value was accessed, because one of the upstream observables (might) have changed. @@ -920,130 +912,123 @@ This means that computed values are now always memoized for the duration of the In specific cases, this might signficantly speed up actions that extensively make decisions based on computed values. Example: - ```javascript class Square { - @observable length = 2 - @computed - get squared() { - return this.length * this.length - } - // mobx now supports setters for computed values - set squared(surfaceSize) { - this.length = Math.sqrt(surfaceSize) - } - - // core changes make actions more efficient if extensively using computed values: - @action - stuff() { - this.length = 3 - console.log(this.squared) // recomputes in both 2.5 and before - console.log(this.squared) // no longer recomputes - this.length = 4 - console.log(this.squared) // recomputes in both 2.5 and before - // after the action, before 2.5 squared would compute another time (if in use by a reaction), that is no longer the case - } + @observable length = 2 + @computed get squared() { + return this.length * this.length + } + // mobx now supports setters for computed values + set squared(surfaceSize) { + this.length = Math.sqrt(surfaceSize) + } + + // core changes make actions more efficient if extensively using computed values: + @action stuff() { + this.length = 3 + console.log(this.squared) // recomputes in both 2.5 and before + console.log(this.squared) // no longer recomputes + this.length = 4 + console.log(this.squared) // recomputes in both 2.5 and before + // after the action, before 2.5 squared would compute another time (if in use by a reaction), that is no longer the case + } } ``` ES5 example for setters: - ```javascript function Square() { - extendObservable(this, { - length: 2, - squared: computed( - function() { - return this.squared * this.squared - }, - function(surfaceSize) { - this.length = Math.sqrt(surfaceSize) - } - ) - }) + extendObservable(this, { + length: 2, + squared: computed( + function() { + return this.squared * this.squared + }, + function(surfaceSize) { + this.length = Math.sqrt(surfaceSize) + } + ) + }) } ``` # 2.4.4 -* Fixed #503: map.delete returns boolean -* Fix return type of `runInAction`, #499 by @Strate -* Fixed enumerability of observable array methods, see #496. -* Use TypeScript typeguards, #487 by @Strate -* Added overloads to `action` for better type inference, #500 by @Strate -* Fixed #502: `extendObservable` fails on objects created with `Object.create(null)` -* Implemented #480 / #488: better typings for `asMap`, by @Strate +* Fixed #503: map.delete returns boolean +* Fix return type of `runInAction`, #499 by @Strate +* Fixed enumerability of observable array methods, see #496. +* Use TypeScript typeguards, #487 by @Strate +* Added overloads to `action` for better type inference, #500 by @Strate +* Fixed #502: `extendObservable` fails on objects created with `Object.create(null)` +* Implemented #480 / #488: better typings for `asMap`, by @Strate # 2.4.3 -* Objects with a `null` prototype are now considered plain objects as well -* Improved error message for non-converging cyclic reactions -* Fixed potential HMR issue +* Objects with a `null` prototype are now considered plain objects as well +* Improved error message for non-converging cyclic reactions +* Fixed potential HMR issue # 2.4.2 -* Improved error message when wrongly using `@computed`, by @bb (#450) -* `observableArray.slice` now automatically converts observable arrays to plain arrays, fixes #460 -* Improved error message when an uncaught exception is thrown by a MobX tracked function +* Improved error message when wrongly using `@computed`, by @bb (#450) +* `observableArray.slice` now automatically converts observable arrays to plain arrays, fixes #460 +* Improved error message when an uncaught exception is thrown by a MobX tracked function # 2.4.1 -* `@action` decorated methods are now configurable. Fixes #441 -* The `onBecomeObserved` event handler is now triggered when an atom is observed, instead of when it is bound as dependency. Fixes #427 and makes atoms easier to extend. -* if `useStrict()` is invoked without arguments, it now returns the current value of strict mode. -* the current reaction is now always passed as first argument to the callbacks of `autorun`, `autorunAsync`, `when` and `reaction`. This allows reactions to be immediately disposed during the first run. See #438, by @andykog +* `@action` decorated methods are now configurable. Fixes #441 +* The `onBecomeObserved` event handler is now triggered when an atom is observed, instead of when it is bound as dependency. Fixes #427 and makes atoms easier to extend. +* if `useStrict()` is invoked without arguments, it now returns the current value of strict mode. +* the current reaction is now always passed as first argument to the callbacks of `autorun`, `autorunAsync`, `when` and `reaction`. This allows reactions to be immediately disposed during the first run. See #438, by @andykog # 2.4.0 -* _Note: the internal version of MobX has been bumped. This version has no breaking api changes, but if you have MobX loaded multiple times in your project, they all have to be upgraded to `2.4.0`. MobX will report this when starting._ -* Made dependency tracking and binding significant faster. Should result in huge performance improvements when working with large collections. -* Fixed typescript decorator issue, #423, #425? (by @bb) +* _Note: the internal version of MobX has been bumped. This version has no breaking api changes, but if you have MobX loaded multiple times in your project, they all have to be upgraded to `2.4.0`. MobX will report this when starting._ +* Made dependency tracking and binding significant faster. Should result in huge performance improvements when working with large collections. +* Fixed typescript decorator issue, #423, #425? (by @bb) # 2.3.7 -* Fixed issue where computed values were tracked and accidentally kept alive during actions +* Fixed issue where computed values were tracked and accidentally kept alive during actions # 2.3.6 - -* Fixed #406: Observable maps doesn't work with empty initial value in Safari -* Implemented #357, #348: ObservableMap and ObservableArray now support iterators. Use [`@@iterator()` or iterall](https://github.com/leebyron/iterall) in ES5 environments. +* Fixed #406: Observable maps doesn't work with empty initial value in Safari +* Implemented #357, #348: ObservableMap and ObservableArray now support iterators. Use [`@@iterator()` or iterall](https://github.com/leebyron/iterall) in ES5 environments. # 2.3.5 -* Fixed #364: Observable arrays not reacting properly to index assignments under iOS safari (mobile) 9.1.1 By @andykog -* Fixed #387: Typings of boxed values -* Added warning when reading array entries out of bounds. See #381 +* Fixed #364: Observable arrays not reacting properly to index assignments under iOS safari (mobile) 9.1.1 By @andykog +* Fixed #387: Typings of boxed values +* Added warning when reading array entries out of bounds. See #381 # 2.3.4 -* Fixed #360: Removed expensive cycle detection (cycles are still detected, but a bit later) -* Fixed #377: `toJS` serialization of Dates and Regexes preserves the original values -* Fixed #379: `@action` decorated methods can now be inherited / overriden +* Fixed #360: Removed expensive cycle detection (cycles are still detected, but a bit later) +* Fixed #377: `toJS` serialization of Dates and Regexes preserves the original values +* Fixed #379: `@action` decorated methods can now be inherited / overriden # 2.3.3 -* Fixed #186: Log a warning instead of an error if an exception is thrown in a derivation. Fixes issue where React Native would produce unusable error screens (because it shows the first logged error) -* Fixed #333: Fixed some interoperability issues in combination with `Reflect` / `InversifyJS` decorators. @andykog -* Fixed #333: `@observable` class properties are now _owned_ by their instance again, meaning they will show up in `Object.keys()` and `.hasOwnProperty` @andykog +* Fixed #186: Log a warning instead of an error if an exception is thrown in a derivation. Fixes issue where React Native would produce unusable error screens (because it shows the first logged error) +* Fixed #333: Fixed some interoperability issues in combination with `Reflect` / `InversifyJS` decorators. @andykog +* Fixed #333: `@observable` class properties are now _owned_ by their instance again, meaning they will show up in `Object.keys()` and `.hasOwnProperty` @andykog # 2.3.2 -* Fixed #328: Fixed exception when inspecting observable in `onBecomeObserved` -* Fixed #341: `array.find` now returns `undefined` instead of `null` when nothing was found, behavior now matches the docs. (By @hellectronic) +* Fixed #328: Fixed exception when inspecting observable in `onBecomeObserved` +* Fixed #341: `array.find` now returns `undefined` instead of `null` when nothing was found, behavior now matches the docs. (By @hellectronic) # 2.3.1 -* Fixed #327: spy not working with runInAction +* Fixed #327: spy not working with runInAction # 2.3.0 ### Introduced `whyRun`: - Usage: - -* `whyRun()` -* `whyRun(Reaction object / ComputedValue object / disposer function)` -* `whyRun(object, "computed property name")` +* `whyRun()` +* `whyRun(Reaction object / ComputedValue object / disposer function)` +* `whyRun(object, "computed property name")` `whyRun` is a small utility that can be used inside computed value or reaction (`autorun`, `reaction` or the `render` method of an `observer` React component) and prints why the derivation is currently running, and under which circumstances it will run again. @@ -1052,123 +1037,120 @@ This should help to get a deeper understanding when and why MobX runs stuff, and This feature can probably be improved based on your feedback, so feel free to file issues with suggestions! ### Semantic changes: - -* `@observable` is now always defined on the class prototypes and not in the instances. This means that `@observable` properties are enumerable, but won't appear if `Object.keys` or `hasOwnProperty` is used on a class _instance_. -* Updated semantics of `reaction` as discussed in `#278`. The expression now needs to return a value and the side effect won't be triggered if the result didn't change. `asStructure` is supported in these cases. In contrast to MobX 2.2, effects will no longer be run if the output of the expression didn't change. +* `@observable` is now always defined on the class prototypes and not in the instances. This means that `@observable` properties are enumerable, but won't appear if `Object.keys` or `hasOwnProperty` is used on a class _instance_. +* Updated semantics of `reaction` as discussed in `#278`. The expression now needs to return a value and the side effect won't be triggered if the result didn't change. `asStructure` is supported in these cases. In contrast to MobX 2.2, effects will no longer be run if the output of the expression didn't change. ### Enhancements -* Introduces `isAction(fn)` #290 -* If an (argumentless) action is passed to `observable` / `extendObservable`, it will not be converted into a computed property. -* Fixed #285: class instances are now also supported by `toJS`. Also members defined on prototypes which are enumerable are converted. -* Map keys are now always coerced to strings. Fixes #308 -* `when`, `autorun` and `autorunAsync` now accept custom debug names (see #293, by @jamiewinder) -* Fixed #286: autoruns no longer stop working if an action throws an exception -* Implemented `runInAction`, can be used to create on the fly actions (especially useful in combination with `async/await`, see #299 -* Improved performance and reduced mem usage of decorators signficantly (by defining the properties on the prototype if possible), and removed subtle differences between the implementation and behavior in babel and typescript. -* Updated logo as per #244. Tnx @osenvosem! +* Introduces `isAction(fn)` #290 +* If an (argumentless) action is passed to `observable` / `extendObservable`, it will not be converted into a computed property. +* Fixed #285: class instances are now also supported by `toJS`. Also members defined on prototypes which are enumerable are converted. +* Map keys are now always coerced to strings. Fixes #308 +* `when`, `autorun` and `autorunAsync` now accept custom debug names (see #293, by @jamiewinder) +* Fixed #286: autoruns no longer stop working if an action throws an exception +* Implemented `runInAction`, can be used to create on the fly actions (especially useful in combination with `async/await`, see #299 +* Improved performance and reduced mem usage of decorators signficantly (by defining the properties on the prototype if possible), and removed subtle differences between the implementation and behavior in babel and typescript. +* Updated logo as per #244. Tnx @osenvosem! # 2.2.2: -* Fixed issue #267: exception when `useStrict(true)` was invoked in combination with `@observable` attributes when using Babel -* Fixed issue #269: @action in combination with typescript targeting ES6 and reflect.ts -* Improved compatibility with `JSON.stringify`, removed incorrect deprecation message -* Improved some error messages +* Fixed issue #267: exception when `useStrict(true)` was invoked in combination with `@observable` attributes when using Babel +* Fixed issue #269: @action in combination with typescript targeting ES6 and reflect.ts +* Improved compatibility with `JSON.stringify`, removed incorrect deprecation message +* Improved some error messages # 2.2.1 -* Fixed issue where typescript threw a compile error when using `@action` without params on a field -* Fixed issue where context was accidentally shared between class instances when using `@action` on a field +* Fixed issue where typescript threw a compile error when using `@action` without params on a field +* Fixed issue where context was accidentally shared between class instances when using `@action` on a field # 2.2.0 See the [release announcement](https://medium.com/@mweststrate/45cdc73c7c8d) for the full details of this release: Introduced: - -* `action` / `@action` -* `intercept` -* `spy` -* `reaction` -* `useStrict` -* improved debug names -* `toJSON` was renamed to `toJS` -* `observable(asMap())` is the new idiomatic way to create maps -* the effect of `when` is now untracked, similar to `reaction. -* `extras.trackTransations` is deprecated, use `spy` instead -* `untracked` has been undeprecated -* introduced / documented: `getAtom`, `getDebugName`, `isSpyEnabled`, `spyReport`, `spyReportStart`, `spyReportEnd` -* deprecated `extras.SimpleEventEmitter` -* array splice events now also report the `added` collection and `removedCount` +* `action` / `@action` +* `intercept` +* `spy` +* `reaction` +* `useStrict` +* improved debug names +* `toJSON` was renamed to `toJS` +* `observable(asMap())` is the new idiomatic way to create maps +* the effect of `when` is now untracked, similar to `reaction. +* `extras.trackTransations` is deprecated, use `spy` instead +* `untracked` has been undeprecated +* introduced / documented: `getAtom`, `getDebugName`, `isSpyEnabled`, `spyReport`, `spyReportStart`, `spyReportEnd` +* deprecated `extras.SimpleEventEmitter` +* array splice events now also report the `added` collection and `removedCount` # 2.1.7 -* Fixed a false negative in cycle detection, as reported in #236 +* Fixed a false negative in cycle detection, as reported in #236 # 2.1.6 -* Fixed #236, #237 call stack issues when working with large arrays +* Fixed #236, #237 call stack issues when working with large arrays # 2.1.5 -* Fix #222 (by @andykog) run `observe` callback of computed properties in untracked mode. +* Fix #222 (by @andykog) run `observe` callback of computed properties in untracked mode. # 2.1.4 -* Fixed #201 (see also #160), another iOS enumerability issue... By @luosong +* Fixed #201 (see also #160), another iOS enumerability issue... By @luosong # 2.1.3 -* Fixed #191, when using babel, complex field initializers where shared. By @andykog -* Added `lib/mobx.umd.min.js` for minified cdn builds, see #85 +* Fixed #191, when using babel, complex field initializers where shared. By @andykog +* Added `lib/mobx.umd.min.js` for minified cdn builds, see #85 # 2.1.2 -* Improved debug names of objects created using a constructor -* Fixed(?) some issues with iOS7 as reported in #60 by @bstst +* Improved debug names of objects created using a constructor +* Fixed(?) some issues with iOS7 as reported in #60 by @bstst # 2.1.1 -* Fixed issue where `autorun`s created inside `autorun`s were not always kicked off. (`mobx-react`'s `observer` was not affected). Please upgrade if you often use autorun. -* Fixed typings of `mobx.map`, a list of entries is also acceptable. -* (Experimental) Improved error recovery a bit further +* Fixed issue where `autorun`s created inside `autorun`s were not always kicked off. (`mobx-react`'s `observer` was not affected). Please upgrade if you often use autorun. +* Fixed typings of `mobx.map`, a list of entries is also acceptable. +* (Experimental) Improved error recovery a bit further # 2.1.0 -* MobX is now chatty again when an exception occurs inside a autorun / computed value / React.render. Previously this was considered to be the responsibility of the surrounding code. But if exceptions were eaten this would be really tricky to debug. -* (Experimental) MobX will now do a poor attempt to recover from exceptions that occured in autorun / computed value / React.render. +* MobX is now chatty again when an exception occurs inside a autorun / computed value / React.render. Previously this was considered to be the responsibility of the surrounding code. But if exceptions were eaten this would be really tricky to debug. +* (Experimental) MobX will now do a poor attempt to recover from exceptions that occured in autorun / computed value / React.render. # 2.0.6 -* `resetGlobalState` is now part of the `mobx.extras` namespace, as it is useful for test setup, to restore inconsistent state after test failures. -* `resetGlobalState` now also resets the caches of `createTransformer`, see #163. +* `resetGlobalState` is now part of the `mobx.extras` namespace, as it is useful for test setup, to restore inconsistent state after test failures. +* `resetGlobalState` now also resets the caches of `createTransformer`, see #163. # 2.0.5 -* WIP on bower support +* WIP on bower support # 2.0.4 -* `$transformId` property on transformed objects should be non-enumerable. Fixes #170. +* `$transformId` property on transformed objects should be non-enumerable. Fixes #170. # 2.0.3 -* Always peek if inspecting a stale, computed value. Fixes #165. +* Always peek if inspecting a stale, computed value. Fixes #165. # 2.0.2 -* Fixed issue where changing an object property was tracked, which could lead to unending loops in `autorunAsync`. +* Fixed issue where changing an object property was tracked, which could lead to unending loops in `autorunAsync`. # 2.0.1 -* Undeprecated `observable(scalar)` (see 143) -* `expr` no longer prints incorrect deprecated messages (see 143) -* Requires `mobx` twice no longer fails. +* Undeprecated `observable(scalar)` (see 143) +* `expr` no longer prints incorrect deprecated messages (see 143) +* Requires `mobx` twice no longer fails. # 2.0.0 ## A new name... - Welcome to ~Mobservable~ MobX 2! First of all, there is the name change. The new name is shorter and funnier and it has the right emphasis: MobX is about reactive programming. Not about observability of data structures, which is just a technical necessity. @@ -1185,7 +1167,6 @@ Besides that, MobX is just a large collection of minor improvements over Mobserv Make sure to remove your old `mobservable` dependencies when installing the new `mobx` dependencies! ## `autorun`s are now allowed to cause cycles! - `autorun` is now allowed to have cycles. In Mobservable 1 an exception was thrown as soon as an autorun modified a variable which it was reading as well. In MobX 2 these situations are now allowed and the autorun will trigger itself to be fired again immediately after the current execution. This is fine as long as the autorun terminates within a reasonable amount of iterations (100). @@ -1198,11 +1179,10 @@ Creating an observable from a primitive or a reference no longer returns a gette This is less confusing, easier to debug and more efficient. So to read or write from an observable scalar use: - ```javascript -const temperature = observable(27) -temperature.set(15) // previously: temperature(15) -temperature.get() // previously: temperature() +const temperature = observable(27); +temperature.set(15); // previously: temperature(15) +temperature.get(); // previously: temperature() ``` `observable(scalar)` has been deprecated to make the api smaller and the syntax more uniform. In practice having observable objects, arrays and decorators seems to suffice in 99% of the cases. Deprecating this functionality means that people have simply less concepts to learn. Probably creating observable scalars will continue to work for a long time, as it is important to the internals of MobX and very convenient for testing. @@ -1232,90 +1212,90 @@ In MobX 2 it is no longer allowed for a computed function or `autorun` to throw ## Improved build -* MobX is roughly 20% faster -* MobX is smaller: 75KB -> 60KB unminified, and 54KB -> 30KB minified. -* Distributable builds are no longer available in the git repository, use unpkg instead: -* Commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.js -* Minified commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.min.js -* UMD build: https://unpkg.com/mobx@^2.0.0/lib/mobx.umd.js -* To use the minified build, require / import the lib from `"mobx/lib/mobx.min.js"` (or set up an alias in your webpack configuration if applicable) +* MobX is roughly 20% faster +* MobX is smaller: 75KB -> 60KB unminified, and 54KB -> 30KB minified. +* Distributable builds are no longer available in the git repository, use unpkg instead: +* Commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.js +* Minified commonjs build: https://unpkg.com/mobx@^2.0.0/lib/mobx.min.js +* UMD build: https://unpkg.com/mobx@^2.0.0/lib/mobx.umd.js +* To use the minified build, require / import the lib from `"mobx/lib/mobx.min.js"` (or set up an alias in your webpack configuration if applicable) ## Other changes -* Improved debug names of all observables. This is especially visible when using `mobx-react-devtools` or `extras.trackTransitions`. -* Renamed `extras.SimpleEventEmitter` to `SimpleEventEmitter` -* Removed already deprecated methods: `isReactive`, `makeReactive`, `observeUntil`, `observeAsync` -* Removed `extras.getDNode` -* Invoking `ObservableArray.peek` is no longer registered as listener -* Deprecated `untracked`. It wasn't documented and nobody seems to miss it. +* Improved debug names of all observables. This is especially visible when using `mobx-react-devtools` or `extras.trackTransitions`. +* Renamed `extras.SimpleEventEmitter` to `SimpleEventEmitter` +* Removed already deprecated methods: `isReactive`, `makeReactive`, `observeUntil`, `observeAsync` +* Removed `extras.getDNode` +* Invoking `ObservableArray.peek` is no longer registered as listener +* Deprecated `untracked`. It wasn't documented and nobody seems to miss it. # 1.2.5 -* Map no longer throws when `.has`, `.get` or `.delete` is invoked with an invalid key (#116) -* Files are now compiled without sourcemap to avoid issues when loading mobservable in a debugger when `src/` folder is not available. +* Map no longer throws when `.has`, `.get` or `.delete` is invoked with an invalid key (#116) +* Files are now compiled without sourcemap to avoid issues when loading mobservable in a debugger when `src/` folder is not available. # 1.2.4 -* Fixed: observable arrays didn't properly apply modifiers if created using `asFlat([])` or `fastArray([])` -* Don't try to make frozen objects observable (by @andykog) -* `observableArray.reverse` no longer mutates the arry but just returns a sorted copy -* Updated tests to use babel6 +* Fixed: observable arrays didn't properly apply modifiers if created using `asFlat([])` or `fastArray([])` +* Don't try to make frozen objects observable (by @andykog) +* `observableArray.reverse` no longer mutates the arry but just returns a sorted copy +* Updated tests to use babel6 # 1.2.3 -* observableArray.sort no longer mutates the array being sorted but returns a sorted clone instead (#90) -* removed an incorrect internal state assumption (#97) +* observableArray.sort no longer mutates the array being sorted but returns a sorted clone instead (#90) +* removed an incorrect internal state assumption (#97) # 1.2.2 -* Add bower support +* Add bower support # 1.2.1 -* Computed value now yields consistent results when being inspected while in transaction +* Computed value now yields consistent results when being inspected while in transaction # 1.2.0 -* Implemented #67: Reactive graph transformations. See: http://mobxjs.github.io/mobservable/refguide/create-transformer.html +* Implemented #67: Reactive graph transformations. See: http://mobxjs.github.io/mobservable/refguide/create-transformer.html # 1.1.8 -* Implemented #59, `isObservable` and `observe` now support a property name as second param to observe individual values on maps and objects. +* Implemented #59, `isObservable` and `observe` now support a property name as second param to observe individual values on maps and objects. # 1.1.7 -* Fixed #77: package consumers with --noImplicitAny should be able to build +* Fixed #77: package consumers with --noImplicitAny should be able to build # 1.1.6 -* Introduced `mobservable.fastArray(array)`, in addition to `mobservable.observable(array)`. Which is much faster when adding items but doesn't support enumerability (`for (var idx in ar) ..` loops). -* Introduced `observableArray.peek()`, for fast access to the array values. Should be used read-only. +* Introduced `mobservable.fastArray(array)`, in addition to `mobservable.observable(array)`. Which is much faster when adding items but doesn't support enumerability (`for (var idx in ar) ..` loops). +* Introduced `observableArray.peek()`, for fast access to the array values. Should be used read-only. # 1.1.5 -* Fixed 71: transactions should not influence running computations +* Fixed 71: transactions should not influence running computations # 1.1.4 -* Fixed #65; illegal state exception when using a transaction inside a reactive function. Credits: @kmalakoff +* Fixed #65; illegal state exception when using a transaction inside a reactive function. Credits: @kmalakoff # 1.1.3 -* Fixed #61; if autorun was created during a transaction, postpone execution until the end of the transaction +* Fixed #61; if autorun was created during a transaction, postpone execution until the end of the transaction # 1.1.2 -* Fixed exception when autorunUntil finished immediately +* Fixed exception when autorunUntil finished immediately # 1.1.1 -* `toJSON` now serializes object trees with cycles as well. If you know the object tree is acyclic, pass in `false` as second parameter for a performance gain. +* `toJSON` now serializes object trees with cycles as well. If you know the object tree is acyclic, pass in `false` as second parameter for a performance gain. # 1.1.0 -* Exposed `ObservableMap` type -* Introduced `mobservable.untracked(block)` -* Introduced `mobservable.autorunAsync(block, delay)` +* Exposed `ObservableMap` type +* Introduced `mobservable.untracked(block)` +* Introduced `mobservable.autorunAsync(block, delay)` # 1.0.9 @@ -1331,113 +1311,113 @@ Fix incompatibility issue with systemjs bundler (see PR 52) # 1.0.4/5 -* `map.size` is now a property instead of a function -* `map()` now accepts an array as entries to construct the new map -* introduced `isObservableObject`, `isObservableArray` and `isObservableMap` -* introduced `observe`, to observe observable arrays, objects and maps, similarly to Object.observe and Array.observe +* `map.size` is now a property instead of a function +* `map()` now accepts an array as entries to construct the new map +* introduced `isObservableObject`, `isObservableArray` and `isObservableMap` +* introduced `observe`, to observe observable arrays, objects and maps, similarly to Object.observe and Array.observe # 1.0.3 -* `extendObservable` now supports passing in multiple object properties +* `extendObservable` now supports passing in multiple object properties # 1.0.2 -* added `mobservable.map()`, which creates a new map similarly to ES6 maps, yet observable. Until properly documentation, see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). +* added `mobservable.map()`, which creates a new map similarly to ES6 maps, yet observable. Until properly documentation, see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). # 1.0.1 -* Stricter argument checking for several apis. +* Stricter argument checking for several apis. # 1.0 ## Renames -* `isReactive` -> `isObservable` -* `makeReactive` -> `observable` -* `extendReactive` -> `extendObservable` -* `observe` -> `autorun` -* `observeUntil` -> `autorunUntil` -* `observeAsync` -> `autorunAsync` -* `reactiveComponent` -> `observer` (in `mobservable-react` package) +* `isReactive` -> `isObservable` +* `makeReactive` -> `observable` +* `extendReactive` -> `extendObservable` +* `observe` -> `autorun` +* `observeUntil` -> `autorunUntil` +* `observeAsync` -> `autorunAsync` +* `reactiveComponent` -> `observer` (in `mobservable-react` package) ## Breaking changes -* dropped the `strict` and `logLevel` settings of mobservable. View functions are by default run in `strict` mode, `autorun` (formerly: `observe`) functions in `non-strict` mode (strict indicates that it is allowed to change other observable values during the computation of a view funtion). - Use `extras.withStrict(boolean, block)` if you want to deviate from the default behavior. -* `observable` (formerly `makeReactive`) no longer accepts an options object. The modifiers `asReference`, `asStructure` and `asFlat` can be used instead. -* dropped the `default` export of observable -* Removed all earlier deprecated functions +* dropped the `strict` and `logLevel` settings of mobservable. View functions are by default run in `strict` mode, `autorun` (formerly: `observe`) functions in `non-strict` mode (strict indicates that it is allowed to change other observable values during the computation of a view funtion). +Use `extras.withStrict(boolean, block)` if you want to deviate from the default behavior. +* `observable` (formerly `makeReactive`) no longer accepts an options object. The modifiers `asReference`, `asStructure` and `asFlat` can be used instead. +* dropped the `default` export of observable +* Removed all earlier deprecated functions ## Bugfixes / improvements -* `mobservable` now ships with TypeScript 1.6 compliant module typings, no external typings file is required anymore. -* `mobservable-react` supports React Native as well through the import `"mobservable-react/native"`. -* Improved debugger support -* `for (var key in observablearray)` now lists the correct keys -* `@observable` now works correct on classes that are transpiled by either TypeScript or Babel (Not all constructions where supported in Babel earlier) -* Simplified error handling, mobservable will no longer catch errors in views, which makes the stack traces easier to debug. -* Removed the initial 'welcom to mobservable' logline that was printed during start-up. +* `mobservable` now ships with TypeScript 1.6 compliant module typings, no external typings file is required anymore. +* `mobservable-react` supports React Native as well through the import `"mobservable-react/native"`. +* Improved debugger support +* `for (var key in observablearray)` now lists the correct keys +* `@observable` now works correct on classes that are transpiled by either TypeScript or Babel (Not all constructions where supported in Babel earlier) +* Simplified error handling, mobservable will no longer catch errors in views, which makes the stack traces easier to debug. +* Removed the initial 'welcom to mobservable' logline that was printed during start-up. # 0.7.1 -* Backported Babel support for the @observable decorator from the 1.0 branch. The decorator should now behave the same when compiled with either Typescript or Babeljs. +* Backported Babel support for the @observable decorator from the 1.0 branch. The decorator should now behave the same when compiled with either Typescript or Babeljs. # 0.7.0 -* Introduced `strict` mode (see issues [#30](), [#31]()) -* Renamed `sideEffect` to `observe` -* Renamed `when` to `observeUntil` -* Introduced `observeAsync`. -* Fixed issue where changing the `logLevel` was not picked up. -* Improved typings. -* Introduces `asStructure` (see [#8]()) and `asFlat`. -* Assigning a plain object to a reactive structure no longer clones the object, instead, the original object is decorated. (Arrays are still cloned due to Javascript limitations to extend arrays). -* Reintroduced `expr(func)` as shorthand for `makeReactive(func)()`, which is useful to create temporarily views inside views -* Deprecated the options object that could be passed to `makeReactive`. -* Deprecated the options object that could be passed to `makeReactive`: - * A `thisArg` can be passed as second param. - * A name (for debugging) can be passed as second or third param - * The `as` modifier is no longer needed, use `asReference` (instead of `as:'reference'`) or `asFlat` (instead of `recurse:false`). +* Introduced `strict` mode (see issues [#30](), [#31]()) +* Renamed `sideEffect` to `observe` +* Renamed `when` to `observeUntil` +* Introduced `observeAsync`. +* Fixed issue where changing the `logLevel` was not picked up. +* Improved typings. +* Introduces `asStructure` (see [#8]()) and `asFlat`. +* Assigning a plain object to a reactive structure no longer clones the object, instead, the original object is decorated. (Arrays are still cloned due to Javascript limitations to extend arrays). +* Reintroduced `expr(func)` as shorthand for `makeReactive(func)()`, which is useful to create temporarily views inside views +* Deprecated the options object that could be passed to `makeReactive`. +* Deprecated the options object that could be passed to `makeReactive`: + * A `thisArg` can be passed as second param. + * A name (for debugging) can be passed as second or third param + * The `as` modifier is no longer needed, use `asReference` (instead of `as:'reference'`) or `asFlat` (instead of `recurse:false`). # 0.6.10 -* Fixed issue where @observable did not properly create a stand-alone view +* Fixed issue where @observable did not properly create a stand-alone view # 0.6.9 -* Fixed bug where views where sometimes not triggered again if the dependency tree changed to much. +* Fixed bug where views where sometimes not triggered again if the dependency tree changed to much. # 0.6.8 -* Introduced `when`, which, given a reactive predicate, observes it until it returns true. -* Renamed `sideEffect -> observe` +* Introduced `when`, which, given a reactive predicate, observes it until it returns true. +* Renamed `sideEffect -> observe` # 0.6.7: -* Improved logging +* Improved logging # 0.6.6: -* Deprecated observable array `.values()` and `.clone()` -* Deprecated observeUntilInvalid; use sideEffect instead -* Renamed mobservable.toJson to mobservable.toJSON +* Deprecated observable array `.values()` and `.clone()` +* Deprecated observeUntilInvalid; use sideEffect instead +* Renamed mobservable.toJson to mobservable.toJSON # 0.6.5: -* It is no longer possible to create impure views; views that alter other reactive values. -* Update links to the new documentation. +* It is no longer possible to create impure views; views that alter other reactive values. +* Update links to the new documentation. # 0.6.4: -* 2nd argument of sideEffect is now the scope, instead of an options object which hadn't any useful properties +* 2nd argument of sideEffect is now the scope, instead of an options object which hadn't any useful properties # 0.6.3 -* Deprecated: reactiveComponent, reactiveComponent from the separate package mobservable-react should be used instead -* Store the trackingstack globally, so that multiple instances of mobservable can run together +* Deprecated: reactiveComponent, reactiveComponent from the separate package mobservable-react should be used instead +* Store the trackingstack globally, so that multiple instances of mobservable can run together # 0.6.2 -* Deprecated: @observable on functions (use getter functions instead) -* Introduced: `getDependencyTree`, `getObserverTree` and `trackTransitions` -* Minor performance improvements +* Deprecated: @observable on functions (use getter functions instead) +* Introduced: `getDependencyTree`, `getObserverTree` and `trackTransitions` +* Minor performance improvements From 025b5245283c0cf11d9adcdf1002b95f6e4d6608 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 13:21:00 +0100 Subject: [PATCH 0020/1043] Optimized box.equal implementation --- src/api/observable.ts | 2 +- src/types/observablemap.ts | 9 ++------- src/types/observableobject.ts | 4 ++-- src/types/observablevalue.ts | 16 +++++----------- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/src/api/observable.ts b/src/api/observable.ts index 2c3cd740c..501770a77 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -144,7 +144,7 @@ const observableFactories: IObservableFactories = { box(value?: T, options?: CreateObservableOptions): IObservableValue { if (arguments.length > 2) incorrectlyUsedAsDecorator("box") const o = asCreateObservableOptions(options) - return new ObservableValue(value, getEnhancerFromOptions(o), o) + return new ObservableValue(value, getEnhancerFromOptions(o), o.name, true, o.equals) }, array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray { if (arguments.length > 2) incorrectlyUsedAsDecorator("array") diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 727efc11f..534464358 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -174,12 +174,7 @@ export class ObservableMap if (entry) { entry.setNewValue(value) } else { - entry = new ObservableValue( - value, - referenceEnhancer, - { name: `${this.name}.${key}?` }, - false - ) + entry = new ObservableValue(value, referenceEnhancer, `${this.name}.${key}?`, false) this._hasMap.set(key, entry) } return entry @@ -215,7 +210,7 @@ export class ObservableMap const observable = new ObservableValue( newValue, this.enhancer, - { name: `${this.name}.${key}` }, + `${this.name}.${key}`, false ) this._data.set(key, observable) diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 6c8f310a8..2658a770e 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -148,7 +148,7 @@ export class ObservableObjectAdministration entry = new ObservableValue( exists, referenceEnhancer, - { name: `${this.name}.${key.toString()}?` }, + `${this.name}.${key.toString()}?`, false ) map.set(key, entry) @@ -173,7 +173,7 @@ export class ObservableObjectAdministration const observable = new ObservableValue( newValue, enhancer, - { name: `${this.name}.${propName}` }, + `${this.name}.${propName}`, false ) this.values.set(propName, observable) diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 823d75e1c..ff3dbbc0c 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -49,16 +49,13 @@ export class ObservableValue extends Atom changeListeners value dehancer: any - private equals: IEqualsComparer constructor( value: T, public enhancer: IEnhancer, - { - name = "ObservableValue@" + getNextId(), - equals = comparer.default - }: { name?: string; equals?: IEqualsComparer }, - notifySpy = true + public name = "ObservableValue@" + getNextId(), + notifySpy = true, + private equals: IEqualsComparer = comparer.default ) { super(name) this.value = enhancer(value, undefined, name) @@ -66,7 +63,6 @@ export class ObservableValue extends Atom // only notify spy if this is a stand-alone observable spyReport({ type: "create", name: this.name, newValue: "" + this.value }) } - this.equals = equals } private dehanceValue(value: T): T { @@ -77,9 +73,7 @@ export class ObservableValue extends Atom public set(newValue: T) { const oldValue = this.value newValue = this.prepareNewValue(newValue) as any - const changed = !this.equals(oldValue, newValue) - - if (newValue !== globalState.UNCHANGED && changed) { + if (newValue !== globalState.UNCHANGED) { const notifySpy = isSpyEnabled() if (notifySpy && process.env.NODE_ENV !== "production") { spyReportStart({ @@ -107,7 +101,7 @@ export class ObservableValue extends Atom } // apply modifier newValue = this.enhancer(newValue, this.value, this.name) - return this.value !== newValue ? newValue : globalState.UNCHANGED + return this.equals(this.value, newValue) ? globalState.UNCHANGED : newValue } setNewValue(newValue: T) { From bf02e7747758f27447fd75b38b87c76360cac640 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 13:24:38 +0100 Subject: [PATCH 0021/1043] Implemented observable sets (#1853) * implement observable set * WIP * Added some missing bits and pieces --- src/api/become-observed.ts | 17 ++- src/api/intercept-read.ts | 7 +- src/api/intercept.ts | 8 +- src/api/object-api.ts | 24 +++- src/api/observable.ts | 19 ++- src/api/observe.ts | 9 +- src/api/tojs.ts | 21 ++- src/internal.ts | 1 + src/mobx.ts | 5 + src/types/modifiers.ts | 9 +- src/types/observableset.ts | 269 +++++++++++++++++++++++++++++++++++++ src/types/type-utils.ts | 11 +- src/utils/eq.ts | 9 +- src/utils/utils.ts | 4 + test/base/api.js | 2 + test/base/set.js | 268 ++++++++++++++++++++++++++++++++++++ 16 files changed, 666 insertions(+), 17 deletions(-) create mode 100644 src/types/observableset.ts create mode 100644 test/base/set.js diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index c7feca52a..968006fa4 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -5,11 +5,17 @@ import { Lambda, ObservableMap, fail, - getAtom + getAtom, + ObservableSet } from "../internal" export function onBecomeObserved( - value: IObservable | IComputedValue | IObservableArray | ObservableMap, + value: + | IObservable + | IComputedValue + | IObservableArray + | ObservableMap + | ObservableSet, listener: Lambda ): Lambda export function onBecomeObserved( @@ -22,7 +28,12 @@ export function onBecomeObserved(thing, arg2, arg3?): Lambda { } export function onBecomeUnobserved( - value: IObservable | IComputedValue | IObservableArray | ObservableMap, + value: + | IObservable + | IComputedValue + | IObservableArray + | ObservableMap + | ObservableSet, listener: Lambda ): Lambda export function onBecomeUnobserved( diff --git a/src/api/intercept-read.ts b/src/api/intercept-read.ts index d8be9d88f..72c33dee8 100644 --- a/src/api/intercept-read.ts +++ b/src/api/intercept-read.ts @@ -8,7 +8,8 @@ import { isObservableArray, isObservableMap, isObservableObject, - isObservableValue + isObservableValue, + ObservableSet } from "../internal" export type ReadInterceptor = (value: any) => T @@ -23,6 +24,10 @@ export function interceptReads( observableMap: ObservableMap, handler: ReadInterceptor ): Lambda +export function interceptReads( + observableSet: ObservableSet, + handler: ReadInterceptor +): Lambda export function interceptReads( object: Object, property: string, diff --git a/src/api/intercept.ts b/src/api/intercept.ts index b0835785a..8775b4584 100644 --- a/src/api/intercept.ts +++ b/src/api/intercept.ts @@ -9,7 +9,9 @@ import { IValueWillChange, Lambda, ObservableMap, - getAdministration + getAdministration, + ObservableSet, + ISetWillChange } from "../internal" export function intercept( @@ -24,6 +26,10 @@ export function intercept( observableMap: ObservableMap, handler: IInterceptor> ): Lambda +export function intercept( + observableMap: ObservableSet, + handler: IInterceptor> +): Lambda export function intercept( observableMap: ObservableMap, property: K, diff --git a/src/api/object-api.ts b/src/api/object-api.ts index 4c5f7e9f5..6f9c9e75d 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -3,6 +3,7 @@ import { IIsObservableObject, IObservableArray, ObservableMap, + ObservableSet, ObservableObjectAdministration, endBatch, fail, @@ -10,12 +11,14 @@ import { invariant, isObservableArray, isObservableMap, + isObservableSet, isObservableObject, startBatch } from "../internal" export function keys(map: ObservableMap): ReadonlyArray export function keys(ar: IObservableArray): ReadonlyArray +export function keys(set: ObservableSet): ReadonlyArray export function keys(obj: T): ReadonlyArray export function keys(obj: any): any { if (isObservableObject(obj)) { @@ -24,16 +27,20 @@ export function keys(obj: any): any { if (isObservableMap(obj)) { return Array.from(obj.keys()) } + if (isObservableSet(obj)) { + return Array.from(obj.keys()) + } if (isObservableArray(obj)) { return obj.map((_, index) => index) } return fail( process.env.NODE_ENV !== "production" && - "'keys()' can only be used on observable objects, arrays and maps" + "'keys()' can only be used on observable objects, arrays, sets and maps" ) } export function values(map: ObservableMap): ReadonlyArray +export function values(set: ObservableSet): ReadonlyArray export function values(ar: IObservableArray): ReadonlyArray export function values(obj: T): ReadonlyArray export function values(obj: any): string[] { @@ -43,16 +50,20 @@ export function values(obj: any): string[] { if (isObservableMap(obj)) { return keys(obj).map(key => obj.get(key)) } + if (isObservableSet(obj)) { + return Array.from(obj.values()) + } if (isObservableArray(obj)) { return obj.slice() } return fail( process.env.NODE_ENV !== "production" && - "'values()' can only be used on observable objects, arrays and maps" + "'values()' can only be used on observable objects, arrays, sets and maps" ) } export function entries(map: ObservableMap): ReadonlyArray<[K, T]> +export function entries(set: ObservableSet): ReadonlyArray<[T, T]> export function entries(ar: IObservableArray): ReadonlyArray<[number, T]> export function entries(obj: T): ReadonlyArray<[string, any]> export function entries(obj: any): any { @@ -62,6 +73,9 @@ export function entries(obj: any): any { if (isObservableMap(obj)) { return keys(obj).map(key => [key, obj.get(key)]) } + if (isObservableSet(obj)) { + return Array.from(obj.entries()) + } if (isObservableArray(obj)) { return obj.map((key, index) => [index, key]) } @@ -113,6 +127,7 @@ export function set(obj: any, key: any, value?: any): void { } export function remove(obj: ObservableMap, key: K) +export function remove(obj: ObservableSet, key: T) export function remove(obj: IObservableArray, index: number) export function remove(obj: T, key: string) export function remove(obj: any, key: any): void { @@ -120,6 +135,8 @@ export function remove(obj: any, key: any): void { ;((obj as any) as IIsObservableObject)[$mobx].remove(key) } else if (isObservableMap(obj)) { obj.delete(key) + } else if (isObservableSet(obj)) { + obj.delete(key) } else if (isObservableArray(obj)) { if (typeof key !== "number") key = parseInt(key, 10) invariant(key >= 0, `Not a valid index: '${key}'`) @@ -133,6 +150,7 @@ export function remove(obj: any, key: any): void { } export function has(obj: ObservableMap, key: K): boolean +export function has(obj: ObservableSet, key: T): boolean export function has(obj: IObservableArray, index: number): boolean export function has(obj: T, key: string): boolean export function has(obj: any, key: any): boolean { @@ -142,6 +160,8 @@ export function has(obj: any, key: any): boolean { return adm.has(key) } else if (isObservableMap(obj)) { return obj.has(key) + } else if (isObservableSet(obj)) { + return obj.has(key) } else if (isObservableArray(obj)) { return key >= 0 && key < obj.length } else { diff --git a/src/api/observable.ts b/src/api/observable.ts index b59ae12b0..d4fc1737a 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -3,9 +3,11 @@ import { IObservableArray, IObservableDecorator, IObservableMapInitialValues, + IObservableSetInitialValues, IObservableObject, IObservableValue, ObservableMap, + ObservableSet, ObservableValue, createDecoratorForEnhancer, createDynamicObservableObject, @@ -14,6 +16,7 @@ import { extendObservable, fail, isES6Map, + isES6Set, isObservable, isPlainObject, refStructEnhancer, @@ -88,7 +91,9 @@ function createObservable(v: any, arg2?: any, arg3?: any) { ? observable.array(v, arg2) : isES6Map(v) ? observable.map(v, arg2) - : v + : isES6Set(v) + ? observable.set(v, arg2) + : v // this value could be converted to a new observable data structure, return it if (res !== v) return res @@ -116,6 +121,10 @@ export interface IObservableFactory { export interface IObservableFactories { box(value?: T, options?: CreateObservableOptions): IObservableValue array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray + set( + initialValues?: IObservableSetInitialValues, + options?: CreateObservableOptions + ): ObservableSet map( initialValues?: IObservableMapInitialValues, options?: CreateObservableOptions @@ -157,6 +166,14 @@ const observableFactories: IObservableFactories = { const o = asCreateObservableOptions(options) return new ObservableMap(initialValues, getEnhancerFromOptions(o), o.name) }, + set( + initialValues?: IObservableSetInitialValues, + options?: CreateObservableOptions + ): ObservableSet { + if (arguments.length > 2) incorrectlyUsedAsDecorator("set") + const o = asCreateObservableOptions(options) + return new ObservableSet(initialValues, getEnhancerFromOptions(o), o.name) + }, object( props: T, decorators?: { [K in keyof T]: Function }, diff --git a/src/api/observe.ts b/src/api/observe.ts index 4f71cee50..d9e919d4c 100644 --- a/src/api/observe.ts +++ b/src/api/observe.ts @@ -9,7 +9,9 @@ import { IValueDidChange, Lambda, ObservableMap, - getAdministration + getAdministration, + ObservableSet, + ISetDidChange } from "../internal" export function observe( @@ -22,6 +24,11 @@ export function observe( listener: (change: IArrayChange | IArraySplice) => void, fireImmediately?: boolean ): Lambda +export function observe( + observableMap: ObservableSet, + listener: (change: ISetDidChange) => void, + fireImmediately?: boolean +): Lambda export function observe( observableMap: ObservableMap, listener: (change: IMapDidChange) => void, diff --git a/src/api/tojs.ts b/src/api/tojs.ts index 8c13a38de..292c56a51 100644 --- a/src/api/tojs.ts +++ b/src/api/tojs.ts @@ -3,7 +3,8 @@ import { isObservable, isObservableArray, isObservableValue, - isObservableMap + isObservableMap, + isObservableSet } from "../internal" export type ToJSOptions = { @@ -27,7 +28,7 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) if (!options.recurseEverything && !isObservable(source)) return source if (typeof source !== "object") return source - + // Directly return null if source is null if (source === null) return null @@ -53,6 +54,22 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) return res } + if (isObservableSet(source) || Object.getPrototypeOf(source) === Set.prototype) { + if (options.exportMapsAsObjects === false) { + const res = cache(__alreadySeen, source, new Set(), options) + source.forEach(value => { + res.add(toJSHelper(value, options!, __alreadySeen)) + }) + return res + } else { + const res = cache(__alreadySeen, source, [] as any[], options) + source.forEach(value => { + res.push(toJSHelper(value, options!, __alreadySeen)) + }) + return res + } + } + if (isObservableMap(source) || Object.getPrototypeOf(source) === Map.prototype) { if (options.exportMapsAsObjects === false) { const res = cache(__alreadySeen, source, new Map(), options) diff --git a/src/internal.ts b/src/internal.ts index 1d9b12790..0002723fc 100644 --- a/src/internal.ts +++ b/src/internal.ts @@ -45,6 +45,7 @@ export * from "./types/intercept-utils" export * from "./types/listen-utils" export * from "./types/observablearray" export * from "./types/observablemap" +export * from "./types/observableset" export * from "./types/observableobject" export * from "./types/type-utils" export * from "./utils/eq" diff --git a/src/mobx.ts b/src/mobx.ts index 4688f5a6f..f679d7542 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -90,6 +90,11 @@ export { IMapDidChange, isObservableMap, IObservableMapInitialValues, + ObservableSet, + isObservableSet, + ISetDidChange, + ISetWillChange, + IObservableSetInitialValues, transaction, observable, IObservableFactory, diff --git a/src/types/modifiers.ts b/src/types/modifiers.ts index ab57650a7..b5575ea3b 100644 --- a/src/types/modifiers.ts +++ b/src/types/modifiers.ts @@ -2,9 +2,11 @@ import { deepEqual, fail, isES6Map, + isES6Set, isObservable, isObservableArray, isObservableMap, + isObservableSet, isObservableObject, isPlainObject, observable @@ -22,20 +24,23 @@ export function deepEnhancer(v, _, name) { if (Array.isArray(v)) return observable.array(v, { name }) if (isPlainObject(v)) return observable.object(v, undefined, { name }) if (isES6Map(v)) return observable.map(v, { name }) + if (isES6Set(v)) return observable.set(v, { name }) return v } export function shallowEnhancer(v, _, name): any { if (v === undefined || v === null) return v - if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v)) return v + if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v) || isObservableSet(v)) + return v if (Array.isArray(v)) return observable.array(v, { name, deep: false }) if (isPlainObject(v)) return observable.object(v, undefined, { name, deep: false }) if (isES6Map(v)) return observable.map(v, { name, deep: false }) + if (isES6Set(v)) return observable.set(v, { name, deep: false }) return fail( process.env.NODE_ENV !== "production" && - "The shallow modifier / decorator can only used in combination with arrays, objects and maps" + "The shallow modifier / decorator can only used in combination with arrays, objects, maps and sets" ) } diff --git a/src/types/observableset.ts b/src/types/observableset.ts new file mode 100644 index 000000000..959a796f7 --- /dev/null +++ b/src/types/observableset.ts @@ -0,0 +1,269 @@ +import { + $mobx, + createAtom, + deepEnhancer, + getNextId, + IEnhancer, + isSpyEnabled, + hasListeners, + IListenable, + invariant, + registerListener, + Lambda, + fail, + spyReportStart, + notifyListeners, + spyReportEnd, + createInstanceofPredicate, + hasInterceptors, + interceptChange, + IInterceptable, + IInterceptor, + registerInterceptor, + checkIfStateModificationsAreAllowed, + untracked, + makeIterable, + transaction, + isES6Set +} from "../internal" + +const ObservableSetMarker = {} + +export type IObservableSetInitialValues = Set | T[] + +export type ISetDidChange = + | { + object: ObservableSet + type: "add" + newValue: T + } + | { + object: ObservableSet + type: "delete" + oldValue: T + } + +export type ISetWillChange = + | { + type: "delete" + object: ObservableSet + oldValue: T + } + | { + type: "add" + object: ObservableSet + newValue: T + } + +export class ObservableSet implements Set, IInterceptable, IListenable { + [$mobx] = ObservableSetMarker + private _data: Set = new Set() + private _atom = createAtom(this.name) + changeListeners + interceptors + dehancer: any + enhancer: (newV: any, oldV: any | undefined) => any + + constructor( + initialData?: IObservableSetInitialValues, + enhancer: IEnhancer = deepEnhancer, + public name = "ObservableSet@" + getNextId() + ) { + if (typeof Set !== "function") { + throw new Error( + "mobx.set requires Set polyfill for the current browser. Check babel-polyfill or core-js/es6/set.js" + ) + } + + this.enhancer = (newV, oldV) => enhancer(newV, oldV, name) + + if (initialData) { + this.replace(initialData) + } + } + + private dehanceValue(value: X): X { + if (this.dehancer !== undefined) { + return this.dehancer(value) + } + return value + } + + clear() { + transaction(() => { + untracked(() => { + for (const value of this._data.values()) this.delete(value) + }) + }) + } + + forEach(callbackFn: (value: T, value2: T, set: Set) => void, thisArg?: any) { + for (const value of this) { + callbackFn.call(thisArg, value, value, this) + } + } + + get size() { + this._atom.reportObserved() + return this._data.size + } + + add(value: T) { + checkIfStateModificationsAreAllowed(this._atom) + if (hasInterceptors(this)) { + const change = interceptChange>(this, { + type: "add", + object: this, + newValue: value + }) + if (!change) return this + // TODO: ideally, value = change.value would be done here, so that values can be + // changed by interceptor. Same applies for other Set and Map api's. + } + if (!this.has(value)) { + transaction(() => { + this._data.add(this.enhancer(value, undefined)) + this._atom.reportChanged() + }) + const notifySpy = isSpyEnabled() + const notify = hasListeners(this) + const change = + notify || notifySpy + ? >{ + type: "add", + object: this, + newValue: value + } + : null + if (notifySpy && process.env.NODE_ENV !== "production") spyReportStart(change) + if (notify) notifyListeners(this, change) + if (notifySpy && process.env.NODE_ENV !== "production") spyReportEnd() + } + + return this + } + + delete(value: any) { + if (hasInterceptors(this)) { + const change = interceptChange>(this, { + type: "delete", + object: this, + oldValue: value + }) + if (!change) return false + } + if (this.has(value)) { + const notifySpy = isSpyEnabled() + const notify = hasListeners(this) + const change = + notify || notifySpy + ? >{ + type: "delete", + object: this, + oldValue: value + } + : null + + if (notifySpy && process.env.NODE_ENV !== "production") + spyReportStart({ ...change, name: this.name }) + transaction(() => { + this._atom.reportChanged() + this._data.delete(value) + }) + if (notify) notifyListeners(this, change) + if (notifySpy && process.env.NODE_ENV !== "production") spyReportEnd() + return true + } + return false + } + + has(value: any) { + this._atom.reportObserved() + return this._data.has(this.dehanceValue(value)) + } + + entries() { + let nextIndex = 0 + const keys = Array.from(this.keys()) + const values = Array.from(this.values()) + return makeIterable<[T, T]>({ + next() { + const index = nextIndex + nextIndex += 1 + return index < values.length + ? { value: [keys[index], values[index]], done: false } + : { done: true } + } + } as any) + } + + keys(): IterableIterator { + return this.values() + } + + values(): IterableIterator { + this._atom.reportObserved() + const self = this + let nextIndex = 0 + const observableValues = Array.from(this._data.values()) + return makeIterable({ + next() { + return nextIndex < observableValues.length + ? { value: self.dehanceValue(observableValues[nextIndex++]), done: false } + : { done: true } + } + } as any) + } + + replace(other: ObservableSet | IObservableSetInitialValues): ObservableSet { + if (isObservableSet(other)) { + other = other.toJS() + } + + transaction(() => { + if (Array.isArray(other)) { + this.clear() + other.forEach(value => this.add(value)) + } else if (isES6Set(other)) { + this.clear() + other.forEach(value => this.add(value)) + } else if (other !== null && other !== undefined) { + fail("Cannot initialize set from " + other) + } + }) + + return this + } + + observe(listener: (changes: ISetDidChange) => void, fireImmediately?: boolean): Lambda { + // TODO 'fireImmediately' can be true? + process.env.NODE_ENV !== "production" && + invariant( + fireImmediately !== true, + "`observe` doesn't support fireImmediately=true in combination with sets." + ) + return registerListener(this, listener) + } + + intercept(handler: IInterceptor>): Lambda { + return registerInterceptor(this, handler) + } + + toJS(): Set { + return new Set(this) + } + + toString(): string { + return this.name + "[ " + Array.from(this).join(", ") + " ]" + } + + [Symbol.iterator]() { + return this.values() + } + + [Symbol.toStringTag]: "Set" = "Set" +} + +export const isObservableSet = createInstanceofPredicate("ObservableSet", ObservableSet) as ( + thing: any +) => thing is ObservableSet diff --git a/src/types/type-utils.ts b/src/types/type-utils.ts index a843375c4..04bb45a4e 100644 --- a/src/types/type-utils.ts +++ b/src/types/type-utils.ts @@ -8,7 +8,8 @@ import { isObservableArray, isObservableMap, isObservableObject, - isReaction + isReaction, + isObservableSet } from "../internal" export function getAtom(thing: any, property?: string): IDepTreeNode { @@ -21,6 +22,9 @@ export function getAtom(thing: any, property?: string): IDepTreeNode { ) return (thing as any)[$mobx].atom } + if (isObservableSet(thing)) { + return (thing as any)[$mobx] + } if (isObservableMap(thing)) { const anyThing = thing as any if (property === undefined) return anyThing._keysAtom @@ -66,7 +70,7 @@ export function getAdministration(thing: any, property?: string) { if (!thing) fail("Expecting some object") if (property !== undefined) return getAdministration(getAtom(thing, property)) if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) return thing - if (isObservableMap(thing)) return thing + if (isObservableMap(thing) || isObservableSet(thing)) return thing // Initializers run lazily when transpiling to babel, so make sure they are run... initializeInstance(thing) if (thing[$mobx]) return thing[$mobx] @@ -76,7 +80,8 @@ export function getAdministration(thing: any, property?: string) { export function getDebugName(thing: any, property?: string): string { let named if (property !== undefined) named = getAtom(thing, property) - else if (isObservableObject(thing) || isObservableMap(thing)) named = getAdministration(thing) + else if (isObservableObject(thing) || isObservableMap(thing) || isObservableSet(thing)) + named = getAdministration(thing) else named = getAtom(thing) // valid for arrays as well return named.name } diff --git a/src/utils/eq.ts b/src/utils/eq.ts index fa3732ea5..721cf37ae 100644 --- a/src/utils/eq.ts +++ b/src/utils/eq.ts @@ -1,4 +1,10 @@ -import { isES6Map, isObservableArray, isObservableMap } from "../internal" +import { + isES6Map, + isObservableArray, + isObservableMap, + isES6Set, + isObservableSet +} from "../internal" declare var Symbol const toString = Object.prototype.toString @@ -127,6 +133,7 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { function unwrap(a: any) { if (isObservableArray(a)) return a.slice() if (isES6Map(a) || isObservableMap(a)) return Array.from(a.entries()) + if (isES6Set(a) || isObservableSet(a)) return Array.from(a.entries()) return a } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 41e0a9b14..624339ae7 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -146,6 +146,10 @@ export function isES6Map(thing): boolean { return thing instanceof Map } +export function isES6Set(thing): thing is Set { + return thing instanceof Set +} + export function getMapLikeKeys(map: ObservableMap): ReadonlyArray export function getMapLikeKeys(map: IKeyValueMap | any): ReadonlyArray export function getMapLikeKeys(map: any): any { diff --git a/test/base/api.js b/test/base/api.js index f5094bf75..63de65d4a 100644 --- a/test/base/api.js +++ b/test/base/api.js @@ -40,10 +40,12 @@ test("correct api should be exposed", function() { "isObservable", "isObservableArray", "isObservableMap", + "isObservableSet", "isObservableObject", "isObservableProp", "keys", "ObservableMap", + "ObservableSet", "observable", "observe", "onReactionError", diff --git a/test/base/set.js b/test/base/set.js new file mode 100644 index 000000000..e04647ed2 --- /dev/null +++ b/test/base/set.js @@ -0,0 +1,268 @@ +"use strict" + +const mobx = require("../../src/mobx.ts") +const set = mobx.observable.set +const autorun = mobx.autorun +const iterall = require("iterall") + +test("set crud", function() { + const events = [] + const s = set([1]) + + s.observe(changes => { + events.push(changes) + }) + + expect(s.has(1)).toBe(true) + expect(s.has("1")).toBe(false) + expect(s.size).toBe(1) + + s.add("2") + + expect(s.has("2")).toBe(true) + expect(s.size).toBe(2) + expect(mobx.keys(s)).toEqual([1, "2"]) + expect(mobx.values(s)).toEqual([1, "2"]) + expect(mobx.entries(s)).toEqual([[1, 1], ["2", "2"]]) + expect(Array.from(s)).toEqual([1, "2"]) + expect(s.toJS()).toEqual(new Set([1, "2"])) + expect(s.toString()).toBe("ObservableSet@1[ 1, 2 ]") + + s.replace(new Set([3])) + + expect(mobx.keys(s)).toEqual([3]) + expect(mobx.values(s)).toEqual([3]) + expect(s.toJS()).toEqual(new Set([3])) + expect(s.toString()).toEqual("ObservableSet@1[ 3 ]") + expect(s.size).toBe(1) + expect(s.has(1)).toBe(false) + expect(s.has("2")).toBe(false) + expect(s.has(3)).toBe(true) + + s.replace(set([4])) + + expect(mobx.keys(s)).toEqual([4]) + expect(mobx.values(s)).toEqual([4]) + expect(s.toJS()).toEqual(new Set([4])) + expect(s.toString()).toEqual("ObservableSet@1[ 4 ]") + expect(s.size).toBe(1) + expect(s.has(1)).toBe(false) + expect(s.has("2")).toBe(false) + expect(s.has(3)).toBe(false) + expect(s.has(4)).toBe(true) + + expect(() => { + s.replace("") + }).toThrow(/Cannot initialize set from/) + + s.clear() + expect(mobx.keys(s)).toEqual([]) + expect(mobx.values(s)).toEqual([]) + expect(s.toJS()).toEqual(new Set()) + expect(s.toString()).toEqual("ObservableSet@1[ ]") + expect(s.size).toBe(0) + expect(s.has(1)).toBe(false) + expect(s.has("2")).toBe(false) + expect(s.has(3)).toBe(false) + expect(s.has(4)).toBe(false) + + expect(events).toEqual([ + { object: s, newValue: "2", type: "add" }, + { object: s, oldValue: 1, type: "delete" }, + { object: s, oldValue: "2", type: "delete" }, + { object: s, newValue: 3, type: "add" }, + { object: s, oldValue: 3, type: "delete" }, + { object: s, newValue: 4, type: "add" }, + { object: s, oldValue: 4, type: "delete" } + ]) +}) + +test("observe value", function() { + const s = set() + let hasX = false + let hasY = false + + autorun(function() { + hasX = s.has("x") + }) + autorun(function() { + hasY = s.has("y") + }) + + expect(hasX).toBe(false) + + s.add("x") + expect(hasX).toBe(true) + + s.delete("x") + expect(hasX).toBe(false) + + s.replace(["y"]) + expect(hasX).toBe(false) + expect(hasY).toBe(true) + expect(mobx.values(s)).toEqual(["y"]) +}) + +test("observe collections", function() { + const x = set() + let keys, values, entries + + autorun(function() { + keys = mobx.keys(x) + }) + autorun(function() { + values = Array.from(x.values()) + }) + autorun(function() { + entries = Array.from(x.entries()) + }) + + x.add("a") + expect(keys).toEqual(["a"]) + expect(values).toEqual(["a"]) + expect(entries).toEqual([["a", "a"]]) + + x.forEach(value => { + expect(x.has(value)).toBe(true) + }) + + // should not retrigger: + keys = null + values = null + entries = null + x.add("a") + expect(keys).toEqual(null) + expect(values).toEqual(null) + expect(entries).toEqual(null) + + x.add("b") + expect(keys).toEqual(["a", "b"]) + expect(values).toEqual(["a", "b"]) + expect(entries).toEqual([["a", "a"], ["b", "b"]]) + + x.delete("a") + expect(keys).toEqual(["b"]) + expect(values).toEqual(["b"]) + expect(entries).toEqual([["b", "b"]]) +}) + +test("set modifier", () => { + const x = set([{ a: 1 }]) + const y = mobx.observable({ a: x }) + + expect(mobx.isObservableSet(x)).toBe(true) + expect(mobx.isObservableObject(y)).toBe(true) + expect(mobx.isObservableObject(y.a)).toBe(false) + expect(mobx.isObservableSet(y.a)).toBe(true) +}) + +test("cleanup", function() { + const s = set(["a"]) + + let hasA + + const disposer = autorun(function() { + hasA = s.has("a") + }) + + expect(hasA).toBe(true) + expect(s.delete("a")).toBe(true) + expect(s.delete("not-existing")).toBe(false) + expect(hasA).toBe(false) +}) + +test("set should support iterall / iterable ", () => { + var a = set([1, 2]) + + function leech(iter) { + var values = [] + do { + var v = iter.next() + if (!v.done) values.push(v.value) + } while (!v.done) + return values + } + + expect(iterall.isIterable(a)).toBe(true) + + expect(leech(iterall.getIterator(a))).toEqual([1, 2]) + + expect(leech(a.entries())).toEqual([[1, 1], [2, 2]]) + + expect(leech(a.keys())).toEqual([1, 2]) + expect(leech(a.values())).toEqual([1, 2]) +}) + +test("support for ES6 Set", () => { + var x = new Set() + x.add(1) + x.add(2) + + var s = mobx.observable(x) + expect(mobx.isObservableSet(s)).toBe(true) + expect(Array.from(s)).toEqual([1, 2]) +}) + +test("deepEqual set", () => { + var x = new Set() + x.add(1) + x.add({ z: 1 }) + + var x2 = mobx.observable.set() + x2.add(1) + x2.add({ z: 2 }) + + expect(mobx.comparer.structural(x, x2)).toBe(false) + x2.replace([1, { z: 1 }]) + expect(mobx.comparer.structural(x, x2)).toBe(true) +}) + +test("set.clear should not be tracked", () => { + var x = set([1]) + var c = 0 + var d = mobx.autorun(() => { + c++ + x.clear() + }) + + expect(c).toBe(1) + x.add(2) + expect(c).toBe(1) + + d() +}) + +test("toStringTag", () => { + const x = set() + expect(x[Symbol.toStringTag]).toBe("Set") + expect(Object.prototype.toString.call(x)).toBe("[object Set]") +}) + +test("getAtom", () => { + var x = set([1]) + expect(mobx.getAtom(x)).toBeTruthy() + + expect(mobx.isObservableSet(x)).toBeTruthy() + expect(mobx.isObservable(x)).toBeTruthy() +}) + +test("observe", () => { + const vals = [] + var x = set([1]) + mobx.observe(x, v => { + vals.push(v) + }) + x.add(2) + x.add(1) + expect(vals).toEqual([{ newValue: 2, object: x, type: "add" }]) +}) + +test("toJS", () => { + const x = mobx.observable({ x: 1 }) + const y = set([x, 1]) + + const z = mobx.toJS(y) + expect(z).toEqual([{ x: 1 }, 1]) + expect(z.x).not.toBe(x) + expect(mobx.isObservable(z.x)).toBeFalsy() +}) From 7295409a200ed464953cb7809d27652025ebe029 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 14:39:05 +0100 Subject: [PATCH 0022/1043] Updated changelog --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12258884b..76dcf89c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# 5.9.0 / 4.9.0 + +**Features** + +* Introduced support for observable sets! Through [#1592](https://github.com/mobxjs/mobx/pull/1592) by [@newraina](https://github.com/newraina) +* `observable.box` now accepts an `equals` option, to be able to pass a custom comparision function. Through [#1862](https://github.com/mobxjs/mobx/pull/1862), [#1874](https://github.com/mobxjs/mobx/pull/1874) by [@fi3ework](https://github.com/fi3ework). Fixes [#1580](https://github.com/mobxjs/mobx/issues/1580) +* Improved logging of reactions; if an action throws an exception, errors in reactions that react to that are only logged as warnings. Fixes [#1836](https://github.com/mobxjs/mobx/issues/1836) + +**Fixes** + +* Improved typings for `flow`, see [#1827](https://github.com/mobxjs/mobx/pull/1827) by [@xaviergonz](https://github.com/xaviergonz) +* Don't allow subclassing map, fixes [#1858](https://github.com/mobxjs/mobx/issues/1858) +* Fixed `trace(true)` not being able to handle multi-line comments in traced function. Fixes [#1850](https://github.com/mobxjs/mobx/issues/1850) +* `@computed` now introduces non-configurable properties, to fail fast on incorrect inheritance or property deletion. Fixes [#1867](https://github.com/mobxjs/mobx/issues/1867) +* The options `enforceActions` and `isolateGlobalState` now work correctly when used together. Fixes [#1869](https://github.com/mobxjs/mobx/issues/1869) + # 5.8.0 / 4.8.0 * MobX now requires TypeScript 3 (this was already the case in 5.7.0, but in this version the difference is actually noticeable in the typings). From a79452de01b9242c1fd9c970fe654de03dab66fd Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 16:04:25 +0100 Subject: [PATCH 0023/1043] made publish executable again --- scripts/publish.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/publish.js diff --git a/scripts/publish.js b/scripts/publish.js old mode 100644 new mode 100755 From c60e7b420b5ab08db0700393d02c5773b964bde2 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 21 Jan 2019 16:05:39 +0100 Subject: [PATCH 0024/1043] Published version 5.9.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 108af70d6..fc87b5ef4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.8.0", + "version": "5.9.0", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", From 22c9b16cd780d0452b4a7ab5ffdaf32eba554529 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 22 Jan 2019 09:43:24 +0100 Subject: [PATCH 0025/1043] Updated sponsors list --- README.md | 17 +++++++++++------ docs/auctionfrontier.jpeg | Bin 0 -> 2725 bytes docs/mantro.png | Bin 0 -> 478 bytes docs/talentplot.png | Bin 0 -> 40248 bytes 4 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 docs/auctionfrontier.jpeg create mode 100644 docs/mantro.png create mode 100644 docs/talentplot.png diff --git a/README.md b/README.md index e4109427d..33ad79325 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,17 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded and many [individual sponsors](#backers) - -Mendix Coinbase Facebook Open Source -Canva -Algolia -Guilded +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded and many [individual sponsors](#backers). + +Mendix +Coinbase +Facebook Open Source +Canva +Algolia +Guilded +Auction Frontier +mantro GmbH +talentplot # Installation diff --git a/docs/auctionfrontier.jpeg b/docs/auctionfrontier.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..236e77505c2f3c20b63ba97ce8ed03ba49dbceb3 GIT binary patch literal 2725 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 U!761IIRF3v07*qoM6N<$g4YH#YybcN literal 0 HcmV?d00001 From ec4d66b9a91930d4c230f92e9c02afc4d017bf56 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 22 Jan 2019 10:19:55 +0100 Subject: [PATCH 0026/1043] Updated changelog for 4.9.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76dcf89c3..77447797c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 4.9.1 + +* Fixed regression in `toJS`: observable maps were not properly serialized. Fixes [#1875](https://github.com/mobxjs/mobx/issues/1875) + # 5.9.0 / 4.9.0 **Features** From b9dac9a66ecbb187150cb903c0c73931d6d53226 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 22 Jan 2019 10:27:11 +0100 Subject: [PATCH 0027/1043] Updated sponsors list --- sponsors.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sponsors.md b/sponsors.md index 1c0fe0cf8..9eba5b687 100644 --- a/sponsors.md +++ b/sponsors.md @@ -10,11 +10,15 @@ Want to sponser MobX as well? https://mobxjs.github.io/mobx/donate.html * Bayu Fitri Andrianto * Benjamin Gruenbaum * Chance Snow +* Chris Richard * Code Hat Programming Inc. +* Constantine Genchevsky * Dane Hitchcox * Daniel Nakov * Dardo Kukovec +* Derek Knox * Dominik Nowik +* GumoIsland * Graham Kaemmer * Greg Zapp * James Athanassakis @@ -22,9 +26,11 @@ Want to sponser MobX as well? https://mobxjs.github.io/mobx/donate.html * Jeff Hansen * Joinbox * Jorge Luis Acosta +* Juwan Wheatley * Karolis Astrauka * Kevin Samuel * Konrad Mazanowski +* Marcel Ryser * Matt Ruby * Matthieu Dumont * Mattia Manzati @@ -43,6 +49,7 @@ Want to sponser MobX as well? https://mobxjs.github.io/mobx/donate.html * Rob Searle * Steven Pérez * Surafel D +* Tanguy Krotoff * Taylor Goolsby * Thibault Maekelbergh * Timor Zhiyentayev @@ -52,6 +59,7 @@ Want to sponser MobX as well? https://mobxjs.github.io/mobx/donate.html * Wilson Lee * Yousuf Nejati * Zheng Renzhe +* Zhenqing Peng Or... Become my personal Patreon! https://www.patreon.com/mweststrate From aa1bf2099a1cbe5b593df12acb3d4a5c9957eac2 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 22 Jan 2019 10:50:27 +0100 Subject: [PATCH 0028/1043] Textual improvements --- README.md | 2 +- sponsors.md | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33ad79325..d37bea518 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded and many [individual sponsors](#backers). +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). Mendix Coinbase diff --git a/sponsors.md b/sponsors.md index 9eba5b687..f57ee9efa 100644 --- a/sponsors.md +++ b/sponsors.md @@ -1,7 +1,12 @@ MobX Sponsors =========== -Want to sponser MobX as well? https://mobxjs.github.io/mobx/donate.html +This is the list of individual or one time contributions! + +Our montly donors can be found on open collective https://opencollective.com/mobx#contributors! +Montly donations can be done through https://opencollective.com/mobx. + +Want to make a one-time contribution? https://mobxjs.github.io/mobx/donate.html * Anders Sjöberg * Andrei Zvonimir Crnković From d6f2b549ad19db5e40a9332bb307c7fef1e0469b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 25 Jan 2019 10:44:47 +0100 Subject: [PATCH 0029/1043] Updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77447797c..7bfb175f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 4.9.2 + +* Fixed regression [#1878](https://github.com/mobxjs/mobx/issues/1878), accidental use of `Symbol` breaking Internet Explorer / React Native compatibility. + # 4.9.1 * Fixed regression in `toJS`: observable maps were not properly serialized. Fixes [#1875](https://github.com/mobxjs/mobx/issues/1875) From e5178f2fc3ab0a83048b71633601484922bd1c7b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 4 Feb 2019 14:12:51 +0100 Subject: [PATCH 0030/1043] Added codefirst to the sponsors list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d37bea518..96b746318 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo Auction Frontier mantro GmbH talentplot +CodeFirst # Installation From f2e6cbe810a20edb4384319dc5d0597460233f9f Mon Sep 17 00:00:00 2001 From: Wee Date: Sat, 9 Feb 2019 17:24:22 +0800 Subject: [PATCH 0031/1043] fix: type error of TypeScript --- src/api/flow.ts | 9 ++++++--- src/types/observablemap.ts | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/api/flow.ts b/src/api/flow.ts index f76213972..cb538c623 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -38,7 +38,10 @@ export function flow( const ctx = this const args = arguments const runId = ++generatorId - const gen = action(`${name} - runid: ${runId} - init`, generator).apply(ctx, args) + const gen = action(`${name} - runid: ${runId} - init`, generator).apply( + ctx, + (args as any) as Args + ) let rejector: (error: any) => void let pendingPromise: CancellablePromise | undefined = undefined @@ -65,7 +68,7 @@ export function flow( pendingPromise = undefined let ret try { - ret = action(`${name} - runid: ${runId} - yield ${stepId++}`, gen.throw).call( + ret = action(`${name} - runid: ${runId} - yield ${stepId++}`, gen.throw!).call( gen, err ) @@ -93,7 +96,7 @@ export function flow( try { if (pendingPromise) cancelPromise(pendingPromise) // Finally block can return (or yield) stuff.. - const res = gen.return() + const res = gen.return!() // eat anything that promise would do, it's cancelled! const yieldedPromise = Promise.resolve(res.value) yieldedPromise.then(noop, noop) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 534464358..66e0124de 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -306,6 +306,7 @@ export class ObservableMap other.forEach((value, key) => this.set(key, value)) } else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other) + return }) return this } From 136d17b4f5e957aae23febcc1dbd900e248cffb5 Mon Sep 17 00:00:00 2001 From: Wee Date: Sat, 9 Feb 2019 21:44:33 +0800 Subject: [PATCH 0032/1043] fix: remove all code paths with return from transaction --- src/types/observablemap.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 66e0124de..ee67c7856 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -302,11 +302,10 @@ export class ObservableMap else if (Array.isArray(other)) other.forEach(([key, value]) => this.set(key, value)) else if (isES6Map(other)) { if (other.constructor !== Map) - return fail("Cannot initialize from classes that inherit from Map: " + other.constructor.name) // prettier-ignore + fail("Cannot initialize from classes that inherit from Map: " + other.constructor.name) // prettier-ignore other.forEach((value, key) => this.set(key, value)) } else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other) - return }) return this } From 3ae4a131eb0c2fa31ec2baa00e6944ec1a89d3dc Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 9 Feb 2019 14:47:58 +0100 Subject: [PATCH 0033/1043] Slightly improved error message --- src/mobx.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mobx.ts b/src/mobx.ts index f679d7542..5804ca6a9 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -18,7 +18,7 @@ if (typeof Proxy === "undefined" || typeof Symbol === "undefined") { throw new Error( - "[mobx] MobX 5+ requires Proxy and Symbol objects. If your environment doesn't support Proxy objects, please downgrade to MobX 4. For React Native Android, consider upgrading JSCore." + "[mobx] MobX 5+ requires Proxy and Symbol objects. If your environment doesn't support Symbol or Proxy objects, please downgrade to MobX 4. For React Native Android, consider upgrading JSCore." ) } @@ -155,7 +155,7 @@ export { // Devtools support import { spy, getDebugName, $mobx } from "./internal" -declare var __MOBX_DEVTOOLS_GLOBAL_HOOK__: { injectMobx: ((any) => void) } +declare var __MOBX_DEVTOOLS_GLOBAL_HOOK__: { injectMobx: (any) => void } if (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "object") { // See: https://github.com/andykog/mobx-devtools/ __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({ From 6cf558f13c5a5068818f5923cf8ab577e4e3fe02 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 9 Feb 2019 16:13:58 +0100 Subject: [PATCH 0034/1043] Setup es-lint --- .eslintrc.js | 30 +++ .travis.yml | 2 +- .vscode/settings.json | 8 +- package.json | 9 +- tslint.json | 36 ---- yarn.lock | 489 ++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 518 insertions(+), 56 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 tslint.json diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..dd55d9649 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,30 @@ +module.exports = { + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint"], + extends: "eslint:recommended", + env: { + es6: true + }, + parserOptions: { + ecmaVersion: 6, + sourceType: "module" + }, + rules: { + "no-fallthrough": "off", + "no-constant-condition": "off", + "getter-return": "off", + "no-console": "off", + "no-var": "error", + // Things that don't play nicely with TS: + "no-unused-vars": "off", + "no-extra-semi": "off" + }, + globals: { + process: "readable", + global: "readable", + console: "readable", + setTimeout: "readable", + clearTimeout: "readable", + module: "writable" + } +} diff --git a/.travis.yml b/.travis.yml index 3e971df61..1973dbecd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js install: - - yarn install + - yarn install --frozen-lockfile script: CI=true yarn test:travis after_success: - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 3297ba797..b481cfe7b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,12 @@ "prettier.useTabs": false, "prettier.printWidth": 100, "prettier.singleQuote": false, - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", // "javascript.validate.enable": false // enable for flow + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ] } \ No newline at end of file diff --git a/package.json b/package.json index fc87b5ef4..390d0d104 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test": "jest", "watch": "jest --watch", "test:mixed-versions": "jest --testRegex mixed-versions", - "test:all": "yarn small-build && yarn jest -i && yarn test:flow && yarn test:mixed-versions", + "test:all": "yarn lint && yarn small-build && yarn jest -i && yarn test:flow && yarn test:mixed-versions", "test:webpack": "node scripts/webpack-regression-tests.js", "test:flow": "node_modules/.bin/flow check", "test:performance": "npm run small-build && PERSIST=true time node --expose-gc test/perf/index.js", @@ -26,7 +26,7 @@ "_prepublish": "npm run small-build", "quick-build": "tsc --pretty", "small-build": "node scripts/build.js", - "lint": "tslint -c tslint.json src/*.ts src/types/*.ts src/api/*.ts src/core/*.ts src/utils/*.ts", + "lint": "eslint src/*.ts src/types/*.ts src/api/*.ts src/core/*.ts src/utils/*.ts", "size": "size-limit --babili 20KB lib/mobx.js", "precommit": "lint-staged", "publish-script": "node scripts/publish.js" @@ -52,12 +52,14 @@ "@babel/preset-env": "^7.1.0", "@types/jest": "^21.1.9", "@types/node": "^7.0.22", + "@typescript-eslint/eslint-plugin": "^1.3.0", "babel-core": "^7.0.0-bridge.0", "babel-jest": "^23.6.0", "browserify": "^12.0.1", "chalk": "^1.1.3", "coveralls": "^2.11.4", "envify": "^4.1.0", + "eslint": "^5.13.0", "flow-bin": "^0.59.0", "fs-extra": "^3.0.1", "husky": "^0.14.3", @@ -77,7 +79,6 @@ "tape": "^4.2.2", "ts-jest": "^22.0.0", "tslib": "^1.7.1", - "tslint-config-prettier": "^1.17.0", "typescript": "^3.2.1", "uglify-es": "^3.3.9" }, @@ -123,4 +124,4 @@ "/node_modules/" ] } -} \ No newline at end of file +} diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 3085dbecb..000000000 --- a/tslint.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "extends": ["tslint-config-prettier"], - "rules": { - "class-name": true, - "comment-format": [true, "check-space"], - "curly": false, - "interface-name": false, - "jsdoc-format": true, - "no-consecutive-blank-lines": true, - "no-debugger": true, - "no-duplicate-key": true, - "no-duplicate-variable": true, - "no-eval": true, - "no-internal-module": true, - "no-shadowed-variable": true, - "no-switch-case-fall-through": true, - "no-unreachable": true, - "no-unused-expression": true, - "no_unused-variable": [true], - "no-use-before-declare": false, - "no-var-keyword": true, - "one-line": [true, "check-open-brace", "check-whitespace", "check-catch"], - "triple-equals": [true, "allow-null-check"], - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - } - ], - "variable-name": [true, "ban-keywords"] - } -} diff --git a/yarn.lock b/yarn.lock index c1d15e58e..14d07957c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -572,6 +572,32 @@ version "7.0.65" resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.65.tgz#c160979ff66c4842adc76cc181a11b5e8722d13d" +"@typescript-eslint/eslint-plugin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.3.0.tgz#e64c859a3eec10d96731eb5f72b5f48796a2f9ad" + integrity sha512-s+vjO9+PvYS2A6FnQC/imyEDOkrEKIzSpPf2OEGnkKqa5+1d0cuXgCi/oROtuBht2/u/iK22nrYcO/Ei4R8F/g== + dependencies: + "@typescript-eslint/parser" "1.3.0" + requireindex "^1.2.0" + tsutils "^3.7.0" + +"@typescript-eslint/parser@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.3.0.tgz#e61e795aa050351b7312a757e0864b6d90b84078" + integrity sha512-Q5cz9nyEQyRrtItRElvQXdNs0Xja1xvOdphDQR7N6MqUdi4juWVNxHKypdHQCx9OcEBev6pWHOda8lwg/2W9/g== + dependencies: + "@typescript-eslint/typescript-estree" "1.3.0" + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + +"@typescript-eslint/typescript-estree@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.3.0.tgz#1d1f36680e5c32c3af38c1180153f018152f65f9" + integrity sha512-h6UxHSmBUopFcxHg/eryrA+GwHMbh7PxotMbkq9p2f3nX60CKm5Zc0VN8krBD3IS5KqsK0iOz24VpEWrP+JZ2Q== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + JSONStream@^1.0.3: version "1.3.2" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" @@ -606,6 +632,11 @@ acorn-globals@^4.1.0: dependencies: acorn "^5.0.0" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" @@ -622,6 +653,11 @@ acorn@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" +acorn@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818" + integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw== + ajv-keywords@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" @@ -644,6 +680,16 @@ ajv@^5.1.5: json-schema-traverse "^0.3.0" json-stable-stringify "^1.0.1" +ajv@^6.5.3, ajv@^6.6.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.8.1.tgz#0890b93742985ebf8973cd365c5b23920ce3cb20" + integrity sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -670,6 +716,11 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -678,6 +729,11 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1512,6 +1568,11 @@ callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -1567,6 +1628,20 @@ chalk@^2.0.0, chalk@^2.0.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + chokidar@^1.4.3, chokidar@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1596,6 +1671,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: dependencies: inherits "^2.0.1" +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1615,6 +1695,13 @@ cli-cursor@^1.0.2: dependencies: restore-cursor "^1.0.1" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + cli-spinners@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" @@ -1626,6 +1713,11 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -1848,6 +1940,17 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1941,6 +2044,13 @@ debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2068,6 +2178,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + domain-browser@^1.1.1, domain-browser@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -2256,6 +2373,75 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^5.13.0: + version "5.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.13.0.tgz#ce71cc529c450eed9504530939aa97527861ede9" + integrity sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.0.2" + text-table "^0.2.0" + +espree@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" + integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2268,6 +2454,13 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" @@ -2275,7 +2468,7 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2426,6 +2619,15 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -2461,6 +2663,11 @@ fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -2482,6 +2689,21 @@ figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -2549,6 +2771,16 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +flat-cache@^1.2.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + flow-bin@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.59.0.tgz#8c151ee7f09f1deed9bf0b9d1f2e8ab9d470f1bb" @@ -2644,6 +2876,11 @@ function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -2714,9 +2951,10 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0: +glob@^7.0.0, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2740,6 +2978,11 @@ globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" +globals@^11.7.0: + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" + integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -2935,6 +3178,13 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -2951,6 +3201,19 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -3001,6 +3264,25 @@ inline-source-map@~0.6.0: dependencies: source-map "~0.5.3" +inquirer@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + insert-module-globals@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" @@ -3802,6 +4084,14 @@ js-yaml@3.6.1, js-yaml@^3.4.3: argparse "^1.0.7" esprima "^2.6.0" +js-yaml@^3.12.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.7.0: version "3.11.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" @@ -3864,10 +4154,20 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -3975,7 +4275,7 @@ leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" -levn@~0.3.0: +levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: @@ -4138,10 +4438,20 @@ lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.4: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash@^4.17.11, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + log-driver@1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" @@ -4378,6 +4688,16 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -4419,6 +4739,11 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -4621,6 +4946,13 @@ onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + opener@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" @@ -4632,9 +4964,10 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -4678,9 +5011,10 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= osenv@^0.1.4: version "0.1.5" @@ -4717,6 +5051,13 @@ pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +parent-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== + dependencies: + callsites "^3.0.0" + parents@^1.0.0, parents@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" @@ -4778,9 +5119,15 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-key@^2.0.0: +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.5: version "1.0.5" @@ -4892,6 +5239,11 @@ process@^0.11.0, process@~0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + prompts@^0.1.9: version "0.1.14" resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" @@ -5125,6 +5477,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + regexpu-core@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.1.3.tgz#fb81616dbbc2a917a7419b33f8379144f51eb8d0" @@ -5261,6 +5618,11 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -5271,6 +5633,11 @@ resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -5304,6 +5671,14 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" @@ -5326,6 +5701,13 @@ rimraf@^2.5.4, rimraf@^2.6.1: dependencies: glob "^7.0.5" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" @@ -5361,12 +5743,26 @@ rsvp@^3.3.3: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + rxjs@^5.0.0-beta.11: version "5.4.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7" dependencies: symbol-observable "^1.0.1" +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -5408,7 +5804,7 @@ sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.3.0, semver@^5.4.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -5416,6 +5812,11 @@ semver@^5.5.0: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" +semver@^5.5.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + send@0.15.3: version "0.15.3" resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" @@ -5561,6 +5962,15 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -5775,7 +6185,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -5822,6 +6232,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + dependencies: + ansi-regex "^4.0.0" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5840,9 +6257,10 @@ strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= subarg@^1.0.0: version "1.0.0" @@ -5880,6 +6298,16 @@ syntax-error@^1.1.1: dependencies: acorn "^4.0.3" +table@^5.0.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.2.tgz#61d474c9e4d8f4f7062c98c7504acb3c08aa738f" + integrity sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ== + dependencies: + ajv "^6.6.1" + lodash "^4.17.11" + slice-ansi "^2.0.0" + string-width "^2.1.1" + tapable@^0.2.5, tapable@~0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" @@ -5930,6 +6358,11 @@ test-exclude@^4.2.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -5941,7 +6374,7 @@ through2@^2.0.0: readable-stream "^2.1.5" xtend "~4.0.1" -"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.8: +"through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5957,6 +6390,13 @@ timers-browserify@^2.0.2: dependencies: setimmediate "^1.0.4" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -6031,10 +6471,17 @@ tslib@^1.7.1: version "1.9.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7" -tslint-config-prettier@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz#946ed6117f98f3659a65848279156d87628c33dc" - integrity sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw== +tslib@^1.8.1, tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tsutils@^3.7.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5" + integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA== + dependencies: + tslib "^1.8.1" tty-browserify@0.0.0, tty-browserify@~0.0.0: version "0.0.0" @@ -6174,6 +6621,13 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -6407,6 +6861,13 @@ write-file-atomic@^2.1.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + ws@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80" From c4131f1f008330ecd1fc3d9c5f1603b52760a82e Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 9 Feb 2019 16:26:40 +0100 Subject: [PATCH 0035/1043] Fix linting errors --- src/api/action.ts | 2 +- src/api/computed.ts | 2 +- src/core/globalstate.ts | 2 +- src/mobx.ts | 4 ++-- src/types/observablemap.ts | 2 +- src/types/observablevalue.ts | 2 +- src/utils/eq.ts | 16 ++++++++-------- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/api/action.ts b/src/api/action.ts index 7d2c5c932..218a68a7a 100644 --- a/src/api/action.ts +++ b/src/api/action.ts @@ -53,7 +53,7 @@ export interface IActionFactory { bound(target: Object, propertyKey: string | symbol, descriptor?: PropertyDescriptor): void } -export var action: IActionFactory = function action(arg1, arg2?, arg3?, arg4?): any { +export const action: IActionFactory = function action(arg1, arg2?, arg3?, arg4?): any { // action(fn() {}) if (arguments.length === 1 && typeof arg1 === "function") return createAction(arg1.name || "", arg1) diff --git a/src/api/computed.ts b/src/api/computed.ts index 7b450449f..b80de0e44 100644 --- a/src/api/computed.ts +++ b/src/api/computed.ts @@ -45,7 +45,7 @@ const computedStructDecorator = computedDecorator({ equals: comparer.structural * Decorator for class properties: @computed get value() { return expr; }. * For legacy purposes also invokable as ES5 observable created: `computed(() => expr)`; */ -export var computed: IComputed = function computed(arg1, arg2, arg3) { +export const computed: IComputed = function computed(arg1, arg2, arg3) { if (typeof arg2 === "string") { // @computed return computedDecorator.apply(null, arguments) diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index e93facd80..a0cb6e445 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -172,7 +172,7 @@ export function resetGlobalState() { globalState.allowStateChanges = !globalState.enforceActions } -declare var window: any +declare const window: any export function getGlobal() { return typeof window !== "undefined" ? window : global diff --git a/src/mobx.ts b/src/mobx.ts index 5804ca6a9..41963f11f 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -22,7 +22,7 @@ if (typeof Proxy === "undefined" || typeof Symbol === "undefined") { ) } -declare var window: any +declare const window: any try { // define process.env if needed // if this is not a production build in the first place @@ -155,7 +155,7 @@ export { // Devtools support import { spy, getDebugName, $mobx } from "./internal" -declare var __MOBX_DEVTOOLS_GLOBAL_HOOK__: { injectMobx: (any) => void } +declare const __MOBX_DEVTOOLS_GLOBAL_HOOK__: { injectMobx: (any) => void } if (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "object") { // See: https://github.com/andykog/mobx-devtools/ __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({ diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 534464358..e71a01794 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -396,6 +396,6 @@ export class ObservableMap } /* 'var' fixes small-build issue */ -export var isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap) as ( +export const isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap) as ( thing: any ) => thing is ObservableMap diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index ff3dbbc0c..62593a3d8 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -158,6 +158,6 @@ export class ObservableValue extends Atom } } -export var isObservableValue = createInstanceofPredicate("ObservableValue", ObservableValue) as ( +export const isObservableValue = createInstanceofPredicate("ObservableValue", ObservableValue) as ( x: any ) => x is IObservableValue diff --git a/src/utils/eq.ts b/src/utils/eq.ts index 721cf37ae..5c820d705 100644 --- a/src/utils/eq.ts +++ b/src/utils/eq.ts @@ -6,7 +6,7 @@ import { isObservableSet } from "../internal" -declare var Symbol +declare const Symbol const toString = Object.prototype.toString export function deepEqual(a: any, b: any): boolean { @@ -24,7 +24,7 @@ function eq(a: any, b: any, aStack?: any[], bStack?: any[]) { // `NaN`s are equivalent, but non-reflexive. if (a !== a) return b !== b // Exhaust primitive checks - var type = typeof a + const type = typeof a if (type !== "function" && type !== "object" && typeof b != "object") return false return deepEq(a, b, aStack, bStack) } @@ -35,7 +35,7 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { a = unwrap(a) b = unwrap(b) // Compare `[[Class]]` names. - var className = toString.call(a) + const className = toString.call(a) if (className !== toString.call(b)) return false switch (className) { // Strings, numbers, regular expressions, dates, and booleans are compared by value. @@ -63,13 +63,13 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { ) } - var areArrays = className === "[object Array]" + const areArrays = className === "[object Array]" if (!areArrays) { if (typeof a != "object" || typeof b != "object") return false // Objects with different constructors are not equivalent, but `Object`s or `Array`s // from different frames are. - var aCtor = a.constructor, + const aCtor = a.constructor, bCtor = b.constructor if ( aCtor !== bCtor && @@ -91,7 +91,7 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { // It's done here since we only need them for objects and arrays comparison. aStack = aStack || [] bStack = bStack || [] - var length = aStack.length + let length = aStack.length while (length--) { // Linear search. Performance is inversely proportional to the number of // unique nested structures. @@ -113,8 +113,8 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { } } else { // Deep compare objects. - var keys = Object.keys(a), - key + const keys = Object.keys(a) + let key length = keys.length // Ensure that both objects contain the same number of properties before comparing deep equality. if (Object.keys(b).length !== length) return false From 2385fc39ca86177e89de4f2621e92c68b61cd7dc Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 9 Feb 2019 16:35:54 +0100 Subject: [PATCH 0036/1043] Compatible node version on travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1973dbecd..83525188d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ script: CI=true yarn test:travis after_success: - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js node_js: - - 9.3 + - 9.10 addons: apt: packages: From 21f749a0e4116f366b39a50bad92f2d342ee64ea Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 9 Feb 2019 16:41:08 +0100 Subject: [PATCH 0037/1043] Travis fix attempt `Integer.max` --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 83525188d..442970337 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ script: CI=true yarn test:travis after_success: - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js node_js: - - 9.10 + - 10 addons: apt: packages: From 2fff3269e0062f3b8753984d739471964af30684 Mon Sep 17 00:00:00 2001 From: Itamar Sharify Date: Thu, 14 Feb 2019 10:45:45 +0200 Subject: [PATCH 0038/1043] [README] - Beautify and update contributing section --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 96b746318..e2e2396d5 100644 --- a/README.md +++ b/README.md @@ -322,7 +322,9 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Contributing * Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -* Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. +* Use `yarn test` to run the basic test suite. +* Use `yarn test:travis` for the test suite with coverage. +* and `yarn test:performance` for the performance tests. * Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. # MobX 4 vs MobX 5 From 91051816de40dfc832b28d2d9f8395bee1887f26 Mon Sep 17 00:00:00 2001 From: Itamar Sharify Date: Sat, 16 Feb 2019 00:32:28 +0200 Subject: [PATCH 0039/1043] [action/createAction] - Keep observable reference. fix issure #1887 --- src/api/action.ts | 2 +- src/core/action.ts | 4 ++-- test/base/__snapshots__/spy.js.snap | 34 +++++++++++++++++++++++++++++ test/base/spy.js | 14 +++++++++--- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/api/action.ts b/src/api/action.ts index 7d2c5c932..779637d73 100644 --- a/src/api/action.ts +++ b/src/api/action.ts @@ -66,7 +66,7 @@ export var action: IActionFactory = function action(arg1, arg2?, arg3?, arg4?): // @action fn() {} if (arg4 === true) { // apply to instance immediately - addHiddenProp(arg1, arg2, createAction(arg1.name || arg2, arg3.value)) + addHiddenProp(arg1, arg2, createAction(arg1.name || arg2, arg3.value, this)) } else { return namedActionDecorator(arg2).apply(null, arguments as any) } diff --git a/src/core/action.ts b/src/core/action.ts index 18ad5a02a..94ecf03b2 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -16,14 +16,14 @@ export interface IAction { isMobxAction: boolean } -export function createAction(actionName: string, fn: Function): Function & IAction { +export function createAction(actionName: string, fn: Function, ref?: Object): Function & IAction { if (process.env.NODE_ENV !== "production") { invariant(typeof fn === "function", "`action` can only be invoked on functions") if (typeof actionName !== "string" || !actionName) fail(`actions should have valid names, got: '${actionName}'`) } const res = function() { - return executeAction(actionName, fn, this, arguments) + return executeAction(actionName, fn, ref || this, arguments) } ;(res as any).isMobxAction = true return res as any diff --git a/test/base/__snapshots__/spy.js.snap b/test/base/__snapshots__/spy.js.snap index 52446be64..f61975e5b 100644 --- a/test/base/__snapshots__/spy.js.snap +++ b/test/base/__snapshots__/spy.js.snap @@ -43,6 +43,40 @@ Array [ Object { "spyReportEnd": true, }, + Object { + "arguments": Array [ + 4, + ], + "name": "setX", + "spyReportStart": true, + "type": "action", + }, + Object { + "key": "x", + "name": "ObservableObject@1", + "newValue": 4, + "oldValue": 3, + "spyReportStart": true, + "type": "update", + }, + Object { + "spyReportEnd": true, + }, + Object { + "name": "ObservableObject@1.y", + "type": "compute", + }, + Object { + "name": "autorun", + "spyReportStart": true, + "type": "reaction", + }, + Object { + "spyReportEnd": true, + }, + Object { + "spyReportEnd": true, + }, ] `; diff --git a/test/base/spy.js b/test/base/spy.js index 00f2dfde1..102dfe8e7 100644 --- a/test/base/spy.js +++ b/test/base/spy.js @@ -73,7 +73,10 @@ test("spy error", () => { get y() { if (this.x === 3) throw "Oops" return this.x * 2 - } + }, + setX: mobx.action(function setX(x) { + this.x = x + }) }) var events = [] @@ -82,13 +85,18 @@ test("spy error", () => { var d = mobx.autorun(() => a.y, { name: "autorun" }) a.x = 3 - + a.setX(4) + const actionEvents = events.filter(event => event.type === "action") + const isActionsTypeofObservable = actionEvents.reduce( + (ret, action) => ret && action.object === a, + true + ) events.forEach(x => { delete x.fn delete x.object delete x.time }) - + expect(isActionsTypeofObservable).toBe(true) expect(events).toMatchSnapshot() d() From d7620c2dab8e3f1b40f92a5ba511e4bf737acff1 Mon Sep 17 00:00:00 2001 From: Vojtech Novak Date: Fri, 1 Mar 2019 10:14:32 +0100 Subject: [PATCH 0040/1043] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7bfb175f3..555bba1e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -158,6 +158,7 @@ _Note June 7th, 2018:_ Both issues are already in Jest master and should be rele * Don't `slice()` arrays when passing them to external libraries. (Note you still shouldn't pass observable data structures to non-`observer` React components, which is an orthogonal concept) * You could replace observable maps with observable objects if you are only using string-based keys. * Don't call the `reverse` or `sort` operations directly on observableArray's anymore, as it's behavior slightly differed from the built-in implementations of those methods. Instead use `observableArray.slice().sort()` to perform the sort on a copy. This gives no additional performance overhead compared to MobX 4. (The reason behind this is that built-in `sort` updates the array in place, but the observable array implementation always performed the sort on a defensive copy, and this change makes that explicit). +* you may remove usages of `isArrayLike()` since `Array.isArray()` will now return true for observable arrays ### API's that have been dropped From bcc00eec91098df0909f0999fff28851a6667ed0 Mon Sep 17 00:00:00 2001 From: Vojtech Novak Date: Fri, 1 Mar 2019 13:10:13 +0100 Subject: [PATCH 0041/1043] fix flow types --- flow-typed/mobx.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index d4f8116dc..1528b3f94 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -311,7 +311,7 @@ declare export function reaction( expression: (r: IReactionPublic) => T, effect: (arg: T, r: IReactionPublic) => void, opts?: IReactionOptions -): () => mixed +): () => void export interface IWhenOptions { name?: string, @@ -323,7 +323,7 @@ declare export function when( cond: () => boolean, effect: Lambda, options?: IWhenOptions -): () => mixed +): () => void declare export function when(cond: () => boolean, options?: IWhenOptions): Promise declare export function computed( From 09ad5db61eccb3caa32e26df89186feb79422154 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 17 Feb 2019 16:35:27 +0100 Subject: [PATCH 0042/1043] Added invariant: disposed reactions sould not attempt to track --- src/core/reaction.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/reaction.ts b/src/core/reaction.ts index 749cd9f72..7aa4f7e8e 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -1,5 +1,6 @@ import { $mobx, + fail, IDerivation, IDerivationState, IObservable, @@ -118,6 +119,9 @@ export class Reaction implements IDerivation, IReactionPublic { } track(fn: () => void) { + if (this.isDisposed) { + fail("Reaction already disposed") + } startBatch() const notify = isSpyEnabled() let startTime From 6a0a16f3fee928d21a20fe38a1c6bdba5884a58b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 14 Mar 2019 10:03:08 +0100 Subject: [PATCH 0043/1043] updated sponsors --- sponsors.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sponsors.md b/sponsors.md index f57ee9efa..4397529b7 100644 --- a/sponsors.md +++ b/sponsors.md @@ -23,6 +23,8 @@ Want to make a one-time contribution? https://mobxjs.github.io/mobx/donate.html * Dardo Kukovec * Derek Knox * Dominik Nowik +* Dong Woo Gim +* Dushko Jordanovski * GumoIsland * Graham Kaemmer * Greg Zapp From 4451340e2d26d3a2d91044ffa1ff7f949a62daec Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 14 Mar 2019 10:08:42 +0100 Subject: [PATCH 0044/1043] Updated changelog for `4.9.3` --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 555bba1e7..dd0957acd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 4.9.3 + +* Fixed `observable.set` compatibility with IE 11, see [#1917](https://github.com/mobxjs/mobx/pull/1917) by [kalmi](https://github.com/kalmi) + # 4.9.2 * Fixed regression [#1878](https://github.com/mobxjs/mobx/issues/1878), accidental use of `Symbol` breaking Internet Explorer / React Native compatibility. From 9f12565a4da322d4fdb9522c57a25d82dab99ad2 Mon Sep 17 00:00:00 2001 From: Tim Perry Date: Thu, 14 Mar 2019 16:59:46 +0100 Subject: [PATCH 0045/1043] Allow Symbol keys in observable maps (fixes #1925) --- CHANGELOG.md | 4 ++++ src/types/observablemap.ts | 19 +++++++++++++++---- test/base/map.js | 27 +++++++++++++++++++-------- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd0957acd..f441fd313 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Unreleased + +* Allow symbol keys in `ObservableMap`, see [#1930](https://github.com/mobxjs/mobx/pull/1930) by [pimterry](https://github.com/pimterry) + # 4.9.3 * Fixed `observable.set` compatibility with IE 11, see [#1917](https://github.com/mobxjs/mobx/pull/1917) by [kalmi](https://github.com/kalmi) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 6e9b0ca23..31850daf5 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -174,7 +174,12 @@ export class ObservableMap if (entry) { entry.setNewValue(value) } else { - entry = new ObservableValue(value, referenceEnhancer, `${this.name}.${key}?`, false) + entry = new ObservableValue( + value, + referenceEnhancer, + `${this.name}.${stringifyKey(key)}?`, + false + ) this._hasMap.set(key, entry) } return entry @@ -210,7 +215,7 @@ export class ObservableMap const observable = new ObservableValue( newValue, this.enhancer, - `${this.name}.${key}`, + `${this.name}.${stringifyKey(key)}`, false ) this._data.set(key, observable) @@ -345,7 +350,8 @@ export class ObservableMap toPOJO(): IKeyValueMap { const res: IKeyValueMap = {} for (const [key, value] of this) { - res["" + key] = value + // We lie about symbol key types due to https://github.com/Microsoft/TypeScript/issues/1863 + res[typeof key === "symbol" ? key : stringifyKey(key)] = value } return res } @@ -368,7 +374,7 @@ export class ObservableMap this.name + "[{ " + Array.from(this.keys()) - .map(key => `${key}: ${"" + this.get(key)}`) + .map(key => `${stringifyKey(key)}: ${"" + this.get(key)}`) .join(", ") + " }]" ) @@ -395,6 +401,11 @@ export class ObservableMap } } +function stringifyKey(key: any): string { + if (key && key.toString) return key.toString() + else return new String(key).toString() +} + /* 'var' fixes small-build issue */ export const isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap) as ( thing: any diff --git a/test/base/map.js b/test/base/map.js index f73a9ec9c..61ebbba66 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -31,14 +31,23 @@ test("map crud", function() { expect(m.has(k)).toBe(true) expect(m.get(k)).toBe("arrVal") - expect(mobx.keys(m)).toEqual(["1", 1, k]) - expect(mobx.values(m)).toEqual(["aa", "b", "arrVal"]) - expect(Array.from(m)).toEqual([["1", "aa"], [1, "b"], [k, "arrVal"]]) - expect(m.toJS()).toEqual(new Map([["1", "aa"], [1, "b"], [k, "arrVal"]])) - expect(m.toPOJO()).toEqual({ "1": "b", arr: "arrVal" }) + var s = Symbol("test") + expect(m.has(s)).toBe(false) + expect(m.get(s)).toBe(undefined) + m.set(s, "symbol-value") + expect(m.get(s)).toBe("symbol-value") + expect(m.get(s.toString())).toBe(undefined) + + expect(mobx.keys(m)).toEqual(["1", 1, k, s]) + expect(mobx.values(m)).toEqual(["aa", "b", "arrVal", "symbol-value"]) + expect(Array.from(m)).toEqual([["1", "aa"], [1, "b"], [k, "arrVal"], [s, "symbol-value"]]) + expect(m.toJS()).toEqual(new Map([["1", "aa"], [1, "b"], [k, "arrVal"], [s, "symbol-value"]])) + expect(m.toPOJO()).toEqual({ "1": "b", arr: "arrVal", [s]: "symbol-value" }) expect(JSON.stringify(m)).toEqual('{"1":"b","arr":"arrVal"}') - expect(m.toString()).toBe("ObservableMap@1[{ 1: aa, 1: b, arr: arrVal }]") - expect(m.size).toBe(3) + expect(m.toString()).toBe( + "ObservableMap@1[{ 1: aa, 1: b, arr: arrVal, Symbol(test): symbol-value }]" + ) + expect(m.size).toBe(4) m.clear() expect(mobx.keys(m)).toEqual([]) @@ -56,9 +65,11 @@ test("map crud", function() { { object: m, name: "1", newValue: "aa", oldValue: "a", type: "update" }, { object: m, name: 1, newValue: "b", type: "add" }, { object: m, name: ["arr"], newValue: "arrVal", type: "add" }, + { object: m, name: s, newValue: "symbol-value", type: "add" }, { object: m, name: "1", oldValue: "aa", type: "delete" }, { object: m, name: 1, oldValue: "b", type: "delete" }, - { object: m, name: ["arr"], oldValue: "arrVal", type: "delete" } + { object: m, name: ["arr"], oldValue: "arrVal", type: "delete" }, + { object: m, name: s, oldValue: "symbol-value", type: "delete" } ]) }) From ad6002d7636d34d2d7b5bc6d855bca897f5a00da Mon Sep 17 00:00:00 2001 From: Ashutosh Das Date: Mon, 18 Mar 2019 16:51:00 +0600 Subject: [PATCH 0046/1043] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2e2396d5..96e1548dc 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | 4.* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.* | No | Any ES5 compliant browser | No active branch | -* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). _Warning: since upgrading JSC is non-trivial, and decorators can be [troublesome](https://github.com/mobxjs/mobx/issues/1777) as well in React Native, for now it is recommended to stick to MobX 4.x for for React Native Android development_. +* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). _Warning: since upgrading JSC is non-trivial, and decorators can be [troublesome](https://github.com/mobxjs/mobx/issues/1777) as well in React Native, for now it is recommended to stick to MobX 4.x for React Native Android development_. * MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). From 77abcdbf6359d115be53a97f2e115bfa849939d8 Mon Sep 17 00:00:00 2001 From: Coriou Date: Wed, 27 Mar 2019 21:02:28 +0100 Subject: [PATCH 0047/1043] Update README - Google's crawler Google's crawler doesn't support Proxy and thus JS will throw when it crawls an app running MobX 5+. This leads to poor or non-existant indexation, disturbances in the Google Developer Console (can't crawl as Google, or use features that really on a successful crawl). I think it's worth mentioning here because it can be a bigger problem than just not supporting IE11 and old Node versions for some people. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2e2396d5..3e84b0063 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | MobX version | Actively supported | Supported browsers | GitHub branch | | ----- | ----- | --- | --- | -| 5.* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower | `master` | +| 5.* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower, Google's crawler bot | `master` | | 4.* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.* | No | Any ES5 compliant browser | No active branch | From 805c02d685ba2993b55f0fa5d27573b0dfdfeba1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 30 Mar 2019 10:43:43 +0100 Subject: [PATCH 0048/1043] Published version 5.9.4 --- CHANGELOG.md | 3 ++- package.json | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f441fd313..a56fa1bff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ -# Unreleased +# 5.9.4 / 4.9.4 * Allow symbol keys in `ObservableMap`, see [#1930](https://github.com/mobxjs/mobx/pull/1930) by [pimterry](https://github.com/pimterry) +* Fixed type definitions of `toStringTag` for Maps and Sets, see [#1929](https://github.com/mobxjs/mobx/pull/1929) by [lennerd](https://github.com/mobxjs/mobx/pull/1929) # 4.9.3 diff --git a/package.json b/package.json index 390d0d104..4cf933ed3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.9.0", + "version": "5.9.4", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", @@ -124,4 +124,4 @@ "/node_modules/" ] } -} +} \ No newline at end of file From 9153d971a1a2ad91d97903107a688f76094cf86b Mon Sep 17 00:00:00 2001 From: Rick Conrad Date: Tue, 2 Apr 2019 10:38:45 +0100 Subject: [PATCH 0049/1043] Update README to remove warning about decorators on React Native since that issue was resolved. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71d26e71e..3c2711309 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | 4.* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.* | No | Any ES5 compliant browser | No active branch | -* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). _Warning: since upgrading JSC is non-trivial, and decorators can be [troublesome](https://github.com/mobxjs/mobx/issues/1777) as well in React Native, for now it is recommended to stick to MobX 4.x for React Native Android development_. +* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). * MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). From 9890e1eca28e600bd9d6b3be55def9d601ace48f Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Fri, 12 Apr 2019 19:48:56 +0200 Subject: [PATCH 0050/1043] add set for observable sets --- src/api/object-api.ts | 3 +++ test/base/object-api.js | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/api/object-api.ts b/src/api/object-api.ts index 6f9c9e75d..e696ff786 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -87,6 +87,7 @@ export function entries(obj: any): any { export function set(obj: ObservableMap, values: { [key: string]: V }) export function set(obj: ObservableMap, key: K, value: V) +export function set(obj: ObservableSet, key: T) export function set(obj: IObservableArray, index: number, value: T) export function set(obj: T, values: { [key: string]: any }) export function set(obj: T, key: string, value: any) @@ -111,6 +112,8 @@ export function set(obj: any, key: any, value?: any): void { } } else if (isObservableMap(obj)) { obj.set(key, value) + } else if (isObservableSet(obj)) { + obj.add(key) } else if (isObservableArray(obj)) { if (typeof key !== "number") key = parseInt(key, 10) invariant(key >= 0, `Not a valid index: '${key}'`) diff --git a/test/base/object-api.js b/test/base/object-api.js index 6144665b1..4b28465db 100644 --- a/test/base/object-api.js +++ b/test/base/object-api.js @@ -352,3 +352,18 @@ test("#1739 - delete and undelete should work", () => { set(x, "a", 3) expect(events).toEqual([false, true, false, true, false, true]) }) + +test("set - set, remove, keys are reactive", () => { + const todos = observable.set([1]) + const snapshots = [] + + reaction(() => keys(todos), keys => snapshots.push(keys)) + + set(todos, 2) + remove(todos, 2) + set(todos, 3) + set(todos, 4) + remove(todos, 3) + + expect(snapshots).toEqual([[1, 2], [1], [1, 3], [1, 3, 4], [1, 4]]) +}) From 4b13f4788391badae9d583e13f65f3044bf4671b Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Fri, 12 Apr 2019 19:52:25 +0200 Subject: [PATCH 0051/1043] update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a56fa1bff..1e0d70d64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ +* Added `set` support for `observable.set` see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) + # 5.9.4 / 4.9.4 * Allow symbol keys in `ObservableMap`, see [#1930](https://github.com/mobxjs/mobx/pull/1930) by [pimterry](https://github.com/pimterry) -* Fixed type definitions of `toStringTag` for Maps and Sets, see [#1929](https://github.com/mobxjs/mobx/pull/1929) by [lennerd](https://github.com/mobxjs/mobx/pull/1929) +* Fixed type definitions of `toStringTag` for Maps and Sets, see [#1929](https://github.com/mobxjs/mobx/pull/1929) by [lennerd](https://github.com/lennerd) # 4.9.3 From 08094fa88b4d15304ef423dbda76c457c7711b6a Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Fri, 12 Apr 2019 20:07:58 +0200 Subject: [PATCH 0052/1043] fix keys not being reactive --- CHANGELOG.md | 2 +- src/types/observableset.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e0d70d64..274b7fdd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -* Added `set` support for `observable.set` see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) +* Added `set` support for `observable.set`, fixed keys not being reactive, see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) # 5.9.4 / 4.9.4 diff --git a/src/types/observableset.ts b/src/types/observableset.ts index 959a796f7..bd51a9b07 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -198,6 +198,7 @@ export class ObservableSet implements Set, IInterceptable { + this._atom.reportObserved() return this.values() } From 7cd3e778c53285d4ac3f8377808643f7bad76cca Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Fri, 12 Apr 2019 20:29:49 +0200 Subject: [PATCH 0053/1043] fix --- src/api/object-api.ts | 4 ++-- src/types/observableset.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api/object-api.ts b/src/api/object-api.ts index e696ff786..d284892b8 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -87,12 +87,12 @@ export function entries(obj: any): any { export function set(obj: ObservableMap, values: { [key: string]: V }) export function set(obj: ObservableMap, key: K, value: V) -export function set(obj: ObservableSet, key: T) +export function set(obj: ObservableSet, value: T) export function set(obj: IObservableArray, index: number, value: T) export function set(obj: T, values: { [key: string]: any }) export function set(obj: T, key: string, value: any) export function set(obj: any, key: any, value?: any): void { - if (arguments.length === 2) { + if (arguments.length === 2 && !isObservableSet(obj)) { startBatch() const values = key try { diff --git a/src/types/observableset.ts b/src/types/observableset.ts index bd51a9b07..959a796f7 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -198,7 +198,6 @@ export class ObservableSet implements Set, IInterceptable { - this._atom.reportObserved() return this.values() } From 8e40450d9ad6f6bb0eae18208b6427dbef218260 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Mon, 15 Apr 2019 16:14:20 +0200 Subject: [PATCH 0054/1043] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 274b7fdd8..81b70481d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -* Added `set` support for `observable.set`, fixed keys not being reactive, see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) +* Added `set` support for `observable.set`, see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) # 5.9.4 / 4.9.4 From 086d0d18a7d7b44b1c417d9a45ec8cf35d503758 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 May 2019 21:27:33 +0200 Subject: [PATCH 0055/1043] updated sponsor --- README.md | 169 +++++++++++++++++++++++++++--------------------------- 1 file changed, 85 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 71d26e71e..72a4d0589 100644 --- a/README.md +++ b/README.md @@ -24,49 +24,48 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo mantro GmbH talentplot CodeFirst +Blokt +Faire # Installation -* Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. -* CDN: - * https://unpkg.com/mobx/lib/mobx.umd.js - * https://cdnjs.com/libraries/mobx - +* Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. +* CDN: + * https://unpkg.com/mobx/lib/mobx.umd.js + * https://cdnjs.com/libraries/mobx _Tip: Consider using the faster and smaller ES6 build if targetting a modern environment: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ # Browser support -| MobX version | Actively supported | Supported browsers | GitHub branch | -| ----- | ----- | --- | --- | -| 5.* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower, Google's crawler bot | `master` | -| 4.* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | -| 1-3.* | No | Any ES5 compliant browser | No active branch | - -* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). _Warning: since upgrading JSC is non-trivial, and decorators can be [troublesome](https://github.com/mobxjs/mobx/issues/1777) as well in React Native, for now it is recommended to stick to MobX 4.x for React Native Android development_. -* MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). +| MobX version | Actively supported | Supported browsers | GitHub branch | +| ------------ | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| 5.\* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower, Google's crawler bot | `master` | +| 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | +| 1-3.\* | No | Any ES5 compliant browser | No active branch | +* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). _Warning: since upgrading JSC is non-trivial, and decorators can be [troublesome](https://github.com/mobxjs/mobx/issues/1777) as well in React Native, for now it is recommended to stick to MobX 4.x for React Native Android development_. +* MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). ## Translations -* [中文](http://cn.mobx.js.org) +* [中文](http://cn.mobx.js.org) ## Getting started -* Egghead.io course -* [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) -* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) -* [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -* [How to (not) use decorators](https://mobx.js.org/best/decorators.html) -* Videos: - * [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - * [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - * LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - * [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - * [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -* [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) -* More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - +* Egghead.io course +* [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) +* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +* [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +* [How to (not) use decorators](https://mobx.js.org/best/decorators.html) +* Videos: + * [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + * [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + * LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + * [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + * [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +* [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) +* More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) ## Introduction @@ -94,12 +93,12 @@ MobX adds observable capabilities to existing data structures like objects, arra This can simply be done by annotating your class properties with the [@observable](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) decorator (ES.Next). ```javascript -import { observable } from 'mobx'; +import { observable } from "mobx" class Todo { - id = Math.random(); - @observable title = ''; - @observable finished = false; + id = Math.random() + @observable title = "" + @observable finished = false } ``` @@ -112,12 +111,12 @@ Or you can skip them altoghether, as MobX can be used fine without decorator _sy Many MobX users prefer the slightly more concise decorator syntax, but the following snippet achieves the same: ```javascript -import { decorate, observable } from 'mobx'; +import { decorate, observable } from "mobx" class Todo { - id = Math.random(); - title = ''; - finished = false; + id = Math.random() + title = "" + finished = false } decorate(Todo, { title: observable, @@ -134,9 +133,10 @@ By using the [`@computed`](http://mobxjs.github.io/mobx/refguide/computed-decora ```javascript class TodoList { - @observable todos = []; - @computed get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length; + @observable todos = [] + @computed + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length } } ``` @@ -158,36 +158,37 @@ In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_pro If you are using React, you can turn your (stateless function) components into reactive components by simply adding the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function / decorator from the `mobx-react` package onto them. ```javascript -import React, {Component} from 'react'; -import ReactDOM from 'react-dom'; -import {observer} from 'mobx-react'; +import React, { Component } from "react" +import ReactDOM from "react-dom" +import { observer } from "mobx-react" @observer class TodoListView extends Component { render() { - return
    -
      - {this.props.todoList.todos.map(todo => - - )} -
    - Tasks left: {this.props.todoList.unfinishedTodoCount} -
    + return ( +
    +
      + {this.props.todoList.todos.map(todo => )} +
    + Tasks left: {this.props.todoList.unfinishedTodoCount} +
    + ) } } -const TodoView = observer(({todo}) => +const TodoView = observer(({ todo }) => (
  • todo.finished = !todo.finished} - />{todo.title} + onClick={() => (todo.finished = !todo.finished)} + /> + {todo.title}
  • -) +)) -const store = new TodoList(); -ReactDOM.render(, document.getElementById('mount')); +const store = new TodoList() +ReactDOM.render(, document.getElementById("mount")) ``` `observer` turns React (function) components into derivations of the data they render. @@ -196,6 +197,7 @@ All components render smartly but are defined in a dumb manner. MobX will simply However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). #### Custom reactions + Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), [`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. @@ -203,7 +205,7 @@ For example the following `autorun` prints a log message each time the amount of ```javascript autorun(() => { - console.log(`Tasks left: ${ todos.unfinishedTodoCount }`) + console.log(`Tasks left: ${todos.unfinishedTodoCount}`) }) ``` @@ -221,9 +223,9 @@ For an in-depth explanation about how MobX determines to which observables needs Unlike many flux frameworks, MobX is unopinionated about how user events should be handled. -* This can be done in a Flux like manner. -* Or by processing events using RxJS. -* Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. +* This can be done in a Flux like manner. +* Or by processing events using RxJS. +* Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. In the end it all boils down to: somehow the state should be updated. @@ -232,11 +234,8 @@ After updating the state `MobX` will take care of the rest in an efficient, glit There is no technical need for firing events, calling a dispatcher, etc. A React component in the end is nothing more than a fancy representation of your state, i.e. a derivation that will be managed by MobX. ```javascript -store.todos.push( - new Todo('Get Coffee'), - new Todo('Write simpler code') -); -store.todos[0].finished = true; +store.todos.push(new Todo("Get Coffee"), new Todo("Write simpler code")) +store.todos[0].finished = true ``` Nonetheless, MobX has an optional built-in concept of [`actions`](https://mobxjs.github.io/mobx/refguide/action.html). @@ -295,13 +294,12 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Further resources and documentation -* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) -* [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) -* [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -* [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) -* [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) -* [Related projects](http://mobxjs.github.io/mobx/faq/related.html) - +* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +* [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) +* [API overview](http://mobxjs.github.io/mobx/refguide/api.html) +* [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) +* [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) +* [Related projects](http://mobxjs.github.io/mobx/faq/related.html) ## What others are saying... @@ -317,34 +315,36 @@ And finally, kudos to all the people that believed in, tried, validated and even > The #mobx is the way I always want things to be! It's really surprising simple and fast! Totally awesome! Don't miss it! -> I've been using MobX for over 2 years now, and it *still* feels like cheating! 😎 +> I've been using MobX for over 2 years now, and it _still_ feels like cheating! 😎 ## Contributing -* Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -* Use `yarn test` to run the basic test suite. -* Use `yarn test:travis` for the test suite with coverage. -* and `yarn test:performance` for the performance tests. -* Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. +* Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. +* Use `yarn test` to run the basic test suite. +* Use `yarn test:travis` for the test suite with coverage. +* and `yarn test:performance` for the performance tests. +* Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. # MobX 4 vs MobX 5 The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do property tracking. As a consequence, MobX 5 runs only on Proxy supporting browsers, in contrast to MobX 4 that runs on any ES 5 environment. The most noteable limitations of MobX 4: - * Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. - * Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. + +* Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. +* Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). ## Flow support + MobX ships with [flow typings](flow-typed/mobx.js). Flow will automatically include them when you import MobX modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. To use the [flow typings](flow-typed/mobx.js) shipped with MobX: -* In `.flowconfig`, you **cannot** ignore `node_modules`. -* In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -* You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). +* In `.flowconfig`, you **cannot** ignore `node_modules`. +* In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. +* You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). ## Donating @@ -352,6 +352,7 @@ Was MobX key in making your project a success? Join our [open collective](https://opencollective.com/mobx#) or use the [donate button](https://mobxjs.github.io/mobx/donate.html)! ### Backers + Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mobx#backer)] From daaabda62518269a680acf21f0d372890e29c932 Mon Sep 17 00:00:00 2001 From: bluepeter Date: Thu, 9 May 2019 16:25:45 -0700 Subject: [PATCH 0056/1043] Update README -- Googlebot now runs Chrome 74! https://webmasters.googleblog.com/2019/05/the-new-evergreen-googlebot.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+blogspot%2FamDG+%28Official+Google+Webmaster+Central+Blog%29 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a97ba6b94..79d310e10 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | MobX version | Actively supported | Supported browsers | GitHub branch | | ------------ | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| 5.\* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower, Google's crawler bot | `master` | +| 5.\* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower | `master` | | 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.\* | No | Any ES5 compliant browser | No active branch | From 96d583b336b0bdb1d4deeae4bf58feb293a10ecd Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sat, 11 May 2019 22:44:33 +0200 Subject: [PATCH 0057/1043] fix update array event using this as object instead of proxy --- src/types/observablearray.ts | 326 +++++++++++++++++------------------ 1 file changed, 163 insertions(+), 163 deletions(-) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index e04835f88..4acf62f93 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -305,175 +305,175 @@ class ObservableArrayAdministration } const arrayExtensions = { - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { - return this[$mobx].intercept(handler) - }, - - observe( - listener: (changeData: IArrayChange | IArraySplice) => void, - fireImmediately = false - ): Lambda { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.observe(listener, fireImmediately) - }, - - clear(): any[] { - return this.splice(0) - }, - - replace(newItems: any[]) { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(0, adm.values.length, newItems) - }, - - /** - * Converts this array back to a (shallow) javascript structure. - * For a deep clone use mobx.toJS - */ - toJS(): any[] { - return (this as any).slice() - }, - - toJSON(): any[] { - // Used by JSON.stringify - return this.toJS() - }, - - /* - * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) - * since these functions alter the inner structure of the array, the have side effects. - * Because the have side effects, they should not be used in computed function, - * and for that reason the do not call dependencyState.notifyObserved - */ - splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - switch (arguments.length) { - case 0: - return [] - case 1: - return adm.spliceWithArray(index) - case 2: - return adm.spliceWithArray(index, deleteCount) - } - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - push(...items: any[]): number { - const adm: ObservableArrayAdministration = this[$mobx] - adm.spliceWithArray(adm.values.length, 0, items) - return adm.values.length - }, - - pop() { - return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] - }, - - shift() { - return this.splice(0, 1)[0] - }, - - unshift(...items: any[]): number { - const adm = this[$mobx] - adm.spliceWithArray(0, 0, items) - return adm.values.length - }, - - reverse(): any[] { - // reverse by default mutates in place before returning the result - // which makes it both a 'derivation' and a 'mutation'. - // so we deviate from the default and just make it an dervitation - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" - ) - } - const clone = (this).slice() - return clone.reverse.apply(clone, arguments) - }, - - sort(compareFn?: (a: any, b: any) => number): any[] { - // sort by default mutates in place before returning the result - // which goes against all good practices. Let's not change the array in place! - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" - ) - } - const clone = (this).slice() - return clone.sort.apply(clone, arguments) - }, - - remove(value: any): boolean { - const adm: ObservableArrayAdministration = this[$mobx] - const idx = adm.dehanceValues(adm.values).indexOf(value) - if (idx > -1) { - this.splice(idx, 1) - return true - } - return false - }, - - get(index: number): any | undefined { - const adm: ObservableArrayAdministration = this[$mobx] - if (adm) { - if (index < adm.values.length) { - adm.atom.reportObserved() - return adm.dehanceValue(adm.values[index]) + intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { + return this[$mobx].intercept(handler) + }, + + observe( + listener: (changeData: IArrayChange | IArraySplice) => void, + fireImmediately = false + ): Lambda { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.observe(listener, fireImmediately) + }, + + clear(): any[] { + return this.splice(0) + }, + + replace(newItems: any[]) { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(0, adm.values.length, newItems) + }, + + /** + * Converts this array back to a (shallow) javascript structure. + * For a deep clone use mobx.toJS + */ + toJS(): any[] { + return (this as any).slice() + }, + + toJSON(): any[] { + // Used by JSON.stringify + return this.toJS() + }, + + /* + * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) + * since these functions alter the inner structure of the array, the have side effects. + * Because the have side effects, they should not be used in computed function, + * and for that reason the do not call dependencyState.notifyObserved + */ + splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + switch (arguments.length) { + case 0: + return [] + case 1: + return adm.spliceWithArray(index) + case 2: + return adm.spliceWithArray(index, deleteCount) } - console.warn( - `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ - adm.values.length - }). Please check length first. Out of bound indices will not be tracked by MobX` - ) - } - return undefined - }, - - set(index: number, newValue: any) { - const adm: ObservableArrayAdministration = this[$mobx] - const values = adm.values - if (index < values.length) { - // update at index in range - checkIfStateModificationsAreAllowed(adm.atom) - const oldValue = values[index] - if (hasInterceptors(adm)) { - const change = interceptChange>(adm as any, { - type: "update", - object: this as any, - index, - newValue - }) - if (!change) return - newValue = change.newValue + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + push(...items: any[]): number { + const adm: ObservableArrayAdministration = this[$mobx] + adm.spliceWithArray(adm.values.length, 0, items) + return adm.values.length + }, + + pop() { + return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] + }, + + shift() { + return this.splice(0, 1)[0] + }, + + unshift(...items: any[]): number { + const adm = this[$mobx] + adm.spliceWithArray(0, 0, items) + return adm.values.length + }, + + reverse(): any[] { + // reverse by default mutates in place before returning the result + // which makes it both a 'derivation' and a 'mutation'. + // so we deviate from the default and just make it an dervitation + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" + ) } - newValue = adm.enhancer(newValue, oldValue) - const changed = newValue !== oldValue - if (changed) { - values[index] = newValue - adm.notifyArrayChildUpdate(index, newValue, oldValue) + const clone = (this).slice() + return clone.reverse.apply(clone, arguments) + }, + + sort(compareFn?: (a: any, b: any) => number): any[] { + // sort by default mutates in place before returning the result + // which goes against all good practices. Let's not change the array in place! + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" + ) + } + const clone = (this).slice() + return clone.sort.apply(clone, arguments) + }, + + remove(value: any): boolean { + const adm: ObservableArrayAdministration = this[$mobx] + const idx = adm.dehanceValues(adm.values).indexOf(value) + if (idx > -1) { + this.splice(idx, 1) + return true + } + return false + }, + + get(index: number): any | undefined { + const adm: ObservableArrayAdministration = this[$mobx] + if (adm) { + if (index < adm.values.length) { + adm.atom.reportObserved() + return adm.dehanceValue(adm.values[index]) + } + console.warn( + `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ + adm.values.length + }). Please check length first. Out of bound indices will not be tracked by MobX` + ) + } + return undefined + }, + + set(index: number, newValue: any) { + const adm: ObservableArrayAdministration = this[$mobx] + const values = adm.values + if (index < values.length) { + // update at index in range + checkIfStateModificationsAreAllowed(adm.atom) + const oldValue = values[index] + if (hasInterceptors(adm)) { + const change = interceptChange>(adm as any, { + type: "update", + object: this.proxy, + index, + newValue + }) + if (!change) return + newValue = change.newValue + } + newValue = adm.enhancer(newValue, oldValue) + const changed = newValue !== oldValue + if (changed) { + values[index] = newValue + adm.notifyArrayChildUpdate(index, newValue, oldValue) + } + } else if (index === values.length) { + // add a new item + adm.spliceWithArray(index, 0, [newValue]) + } else { + // out of bounds + throw new Error( + `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` + ) } - } else if (index === values.length) { - // add a new item - adm.spliceWithArray(index, 0, [newValue]) - } else { - // out of bounds - throw new Error( - `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` - ) } } -} -/** - * Wrap function from prototype - * Without this, everything works as well, but this works - * faster as everything works on unproxied values - */ + /** + * Wrap function from prototype + * Without this, everything works as well, but this works + * faster as everything works on unproxied values + */ ;[ "concat", "every", From d9f389475f06c728eef63fd715af9878a88c4a55 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sat, 11 May 2019 22:47:43 +0200 Subject: [PATCH 0058/1043] save without formatting --- src/types/observablearray.ts | 326 +++++++++++++++++------------------ 1 file changed, 163 insertions(+), 163 deletions(-) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 4acf62f93..5759f7298 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -305,175 +305,175 @@ class ObservableArrayAdministration } const arrayExtensions = { - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { - return this[$mobx].intercept(handler) - }, - - observe( - listener: (changeData: IArrayChange | IArraySplice) => void, - fireImmediately = false - ): Lambda { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.observe(listener, fireImmediately) - }, - - clear(): any[] { - return this.splice(0) - }, - - replace(newItems: any[]) { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(0, adm.values.length, newItems) - }, - - /** - * Converts this array back to a (shallow) javascript structure. - * For a deep clone use mobx.toJS - */ - toJS(): any[] { - return (this as any).slice() - }, - - toJSON(): any[] { - // Used by JSON.stringify - return this.toJS() - }, - - /* - * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) - * since these functions alter the inner structure of the array, the have side effects. - * Because the have side effects, they should not be used in computed function, - * and for that reason the do not call dependencyState.notifyObserved - */ - splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - switch (arguments.length) { - case 0: - return [] - case 1: - return adm.spliceWithArray(index) - case 2: - return adm.spliceWithArray(index, deleteCount) - } - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - push(...items: any[]): number { - const adm: ObservableArrayAdministration = this[$mobx] - adm.spliceWithArray(adm.values.length, 0, items) - return adm.values.length - }, - - pop() { - return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] - }, - - shift() { - return this.splice(0, 1)[0] - }, - - unshift(...items: any[]): number { - const adm = this[$mobx] - adm.spliceWithArray(0, 0, items) - return adm.values.length - }, - - reverse(): any[] { - // reverse by default mutates in place before returning the result - // which makes it both a 'derivation' and a 'mutation'. - // so we deviate from the default and just make it an dervitation - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" - ) - } - const clone = (this).slice() - return clone.reverse.apply(clone, arguments) - }, - - sort(compareFn?: (a: any, b: any) => number): any[] { - // sort by default mutates in place before returning the result - // which goes against all good practices. Let's not change the array in place! - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" - ) - } - const clone = (this).slice() - return clone.sort.apply(clone, arguments) - }, - - remove(value: any): boolean { - const adm: ObservableArrayAdministration = this[$mobx] - const idx = adm.dehanceValues(adm.values).indexOf(value) - if (idx > -1) { - this.splice(idx, 1) - return true + intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { + return this[$mobx].intercept(handler) + }, + + observe( + listener: (changeData: IArrayChange | IArraySplice) => void, + fireImmediately = false + ): Lambda { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.observe(listener, fireImmediately) + }, + + clear(): any[] { + return this.splice(0) + }, + + replace(newItems: any[]) { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(0, adm.values.length, newItems) + }, + + /** + * Converts this array back to a (shallow) javascript structure. + * For a deep clone use mobx.toJS + */ + toJS(): any[] { + return (this as any).slice() + }, + + toJSON(): any[] { + // Used by JSON.stringify + return this.toJS() + }, + + /* + * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) + * since these functions alter the inner structure of the array, the have side effects. + * Because the have side effects, they should not be used in computed function, + * and for that reason the do not call dependencyState.notifyObserved + */ + splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + switch (arguments.length) { + case 0: + return [] + case 1: + return adm.spliceWithArray(index) + case 2: + return adm.spliceWithArray(index, deleteCount) + } + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + push(...items: any[]): number { + const adm: ObservableArrayAdministration = this[$mobx] + adm.spliceWithArray(adm.values.length, 0, items) + return adm.values.length + }, + + pop() { + return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] + }, + + shift() { + return this.splice(0, 1)[0] + }, + + unshift(...items: any[]): number { + const adm = this[$mobx] + adm.spliceWithArray(0, 0, items) + return adm.values.length + }, + + reverse(): any[] { + // reverse by default mutates in place before returning the result + // which makes it both a 'derivation' and a 'mutation'. + // so we deviate from the default and just make it an dervitation + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" + ) + } + const clone = (this).slice() + return clone.reverse.apply(clone, arguments) + }, + + sort(compareFn?: (a: any, b: any) => number): any[] { + // sort by default mutates in place before returning the result + // which goes against all good practices. Let's not change the array in place! + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" + ) + } + const clone = (this).slice() + return clone.sort.apply(clone, arguments) + }, + + remove(value: any): boolean { + const adm: ObservableArrayAdministration = this[$mobx] + const idx = adm.dehanceValues(adm.values).indexOf(value) + if (idx > -1) { + this.splice(idx, 1) + return true + } + return false + }, + + get(index: number): any | undefined { + const adm: ObservableArrayAdministration = this[$mobx] + if (adm) { + if (index < adm.values.length) { + adm.atom.reportObserved() + return adm.dehanceValue(adm.values[index]) } - return false - }, - - get(index: number): any | undefined { - const adm: ObservableArrayAdministration = this[$mobx] - if (adm) { - if (index < adm.values.length) { - adm.atom.reportObserved() - return adm.dehanceValue(adm.values[index]) - } - console.warn( - `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ - adm.values.length - }). Please check length first. Out of bound indices will not be tracked by MobX` - ) + console.warn( + `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ + adm.values.length + }). Please check length first. Out of bound indices will not be tracked by MobX` + ) + } + return undefined + }, + + set(index: number, newValue: any) { + const adm: ObservableArrayAdministration = this[$mobx] + const values = adm.values + if (index < values.length) { + // update at index in range + checkIfStateModificationsAreAllowed(adm.atom) + const oldValue = values[index] + if (hasInterceptors(adm)) { + const change = interceptChange>(adm as any, { + type: "update", + object: this.proxy, + index, + newValue + }) + if (!change) return + newValue = change.newValue } - return undefined - }, - - set(index: number, newValue: any) { - const adm: ObservableArrayAdministration = this[$mobx] - const values = adm.values - if (index < values.length) { - // update at index in range - checkIfStateModificationsAreAllowed(adm.atom) - const oldValue = values[index] - if (hasInterceptors(adm)) { - const change = interceptChange>(adm as any, { - type: "update", - object: this.proxy, - index, - newValue - }) - if (!change) return - newValue = change.newValue - } - newValue = adm.enhancer(newValue, oldValue) - const changed = newValue !== oldValue - if (changed) { - values[index] = newValue - adm.notifyArrayChildUpdate(index, newValue, oldValue) - } - } else if (index === values.length) { - // add a new item - adm.spliceWithArray(index, 0, [newValue]) - } else { - // out of bounds - throw new Error( - `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` - ) + newValue = adm.enhancer(newValue, oldValue) + const changed = newValue !== oldValue + if (changed) { + values[index] = newValue + adm.notifyArrayChildUpdate(index, newValue, oldValue) } + } else if (index === values.length) { + // add a new item + adm.spliceWithArray(index, 0, [newValue]) + } else { + // out of bounds + throw new Error( + `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` + ) } } +} - /** - * Wrap function from prototype - * Without this, everything works as well, but this works - * faster as everything works on unproxied values - */ +/** + * Wrap function from prototype + * Without this, everything works as well, but this works + * faster as everything works on unproxied values + */ ;[ "concat", "every", From e76827a718874b6b21914eef2c31b3b325f15ef0 Mon Sep 17 00:00:00 2001 From: Andrey Boldyrev Date: Tue, 14 May 2019 19:42:14 +0300 Subject: [PATCH 0059/1043] fix uglifyjs preamble --- scripts/build.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/build.js b/scripts/build.js index 40ec02869..0fc186c22 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -61,6 +61,8 @@ function runTypeScriptBuild(outDir, target, declarations) { const rollupPlugins = [require("rollup-plugin-node-resolve")(), require("rollup-plugin-filesize")()] +const licensePreamble = "/** MobX - (c) Michel Weststrate 2015 - 2019 - MIT Licensed */" + function generateBundledModule(inputFile, outputFile, format) { console.log(`Generating ${outputFile} bundle.`) @@ -73,7 +75,7 @@ function generateBundledModule(inputFile, outputFile, format) { bundle.write({ dest: outputFile, format, - banner: "/** MobX - (c) Michel Weststrate 2015 - 2018 - MIT Licensed */", + banner: licensePreamble, exports: "named" }) ) @@ -95,7 +97,7 @@ function generateMinified() { exec( `${getCmd( "uglifyjs" - )} --toplevel -m -c warnings=false --preamble "/** MobX - (c) Michel Weststrate 2015 - 2018 - MIT Licensed */" --source-map -o lib/mobx.min.js lib/mobx.prod.js` + )} --toplevel -m -c warnings=false -b beautify=false,preamble='"${licensePreamble}"' --source-map -o lib/mobx.min.js lib/mobx.prod.js` ) exec(`${getCmd(`envify`)} lib/mobx.umd.js > lib/mobx.prod.umd.js`, { env: prodEnv @@ -103,7 +105,7 @@ function generateMinified() { exec( `${getCmd( `uglifyjs` - )} --toplevel -m -c warnings=false --preamble "/** MobX - (c) Michel Weststrate 2015 - 2018 - MIT Licensed */" --source-map -o lib/mobx.umd.min.js lib/mobx.prod.umd.js` + )} --toplevel -m -c warnings=false -b beautify=false,preamble='"${licensePreamble}"' --source-map -o lib/mobx.umd.min.js lib/mobx.prod.umd.js` ) shell.rm("lib/mobx.prod.js", "lib/mobx.prod.umd.js") } From 05e56b330675caf2a1148069e85ecb9812e5fec3 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 23 May 2019 22:19:22 +0200 Subject: [PATCH 0060/1043] added funding.yml (test) --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..95d7eb203 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: mobx From d0faeec8d19b7a02b9cc87430ef384d80b7b41bc Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Wed, 29 May 2019 21:56:15 +0200 Subject: [PATCH 0061/1043] fix observable set ts typing --- src/api/observable.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/api/observable.ts b/src/api/observable.ts index bac5b3159..1bf55bff1 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -112,6 +112,7 @@ export interface IObservableFactory { (value: number | string | null | undefined | boolean): never // Nope, not supported, use box (target: Object, key: string | symbol, baseDescriptor?: PropertyDescriptor): any // decorator (value: T[], options?: CreateObservableOptions): IObservableArray + (value: Set, options?: CreateObservableOptions): ObservableSet (value: Map, options?: CreateObservableOptions): ObservableMap ( value: T, From 5bea697decd669ccee5c195aaa54fb4509892e05 Mon Sep 17 00:00:00 2001 From: Jason Cooke Date: Fri, 31 May 2019 09:42:28 +1200 Subject: [PATCH 0062/1043] docs: fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79d310e10..3e09f763f 100644 --- a/README.md +++ b/README.md @@ -329,7 +329,7 @@ And finally, kudos to all the people that believed in, tried, validated and even The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do property tracking. As a consequence, MobX 5 runs only on Proxy supporting browsers, in contrast to MobX 4 that runs on any ES 5 environment. -The most noteable limitations of MobX 4: +The most notable limitations of MobX 4: * Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. * Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. From 421e793ed8c3bd7d5749d9206aafd3b27718c6d6 Mon Sep 17 00:00:00 2001 From: Lochlan Bunn Date: Thu, 4 Apr 2019 03:57:57 +1100 Subject: [PATCH 0063/1043] Support Symbol named observable properties * Add tests for using symbol keys and getting them from toJS --- src/api/computed.ts | 2 +- src/api/extendobservable.ts | 26 +++++-- src/api/object-api.ts | 6 +- src/api/observabledecorator.ts | 9 ++- src/api/tojs.ts | 16 ++++- src/types/dynamicobject.ts | 14 ++-- src/types/observablemap.ts | 9 +-- src/types/observableobject.ts | 52 ++++++++------ src/utils/decorators.ts | 2 +- src/utils/utils.ts | 21 ++++++ test/base/object-api.js | 128 +++++++++++++++++++++++++++++++++ test/base/tojs.js | 19 ++++- 12 files changed, 255 insertions(+), 49 deletions(-) diff --git a/src/api/computed.ts b/src/api/computed.ts index b80de0e44..9a47094c3 100644 --- a/src/api/computed.ts +++ b/src/api/computed.ts @@ -20,7 +20,7 @@ export const computedDecorator = createPropDecorator( false, ( instance: any, - propertyName: string, + propertyName: PropertyKey, descriptor: any, decoratorTarget: any, decoratorArgs: any[] diff --git a/src/api/extendobservable.ts b/src/api/extendobservable.ts index 8df6ddc6e..b1ca91cef 100644 --- a/src/api/extendobservable.ts +++ b/src/api/extendobservable.ts @@ -6,12 +6,14 @@ import { deepDecorator, endBatch, fail, + getPlainObjectKeys, invariant, isComputed, isObservable, isObservableMap, refDecorator, startBatch, + stringifyKey, initializeInstance } from "../internal" import { IObservableDecorator } from "./observabledecorator" @@ -63,19 +65,31 @@ export function extendObservableObjectWithProperties( !isObservable(properties), "Extending an object with another observable (object) is not supported. Please construct an explicit propertymap, using `toJS` if need. See issue #540" ) - if (decorators) - for (let key in decorators) + if (decorators) { + const keys = getPlainObjectKeys(decorators) + for (let i in keys) { + const key = keys[i] if (!(key in properties!)) - fail(`Trying to declare a decorator for unspecified property '${key}'`) + fail( + `Trying to declare a decorator for unspecified property '${stringifyKey( + key + )}'` + ) + } + } } startBatch() try { - for (let key in properties) { + const keys = getPlainObjectKeys(properties) + for (let i in keys) { + const key = keys[i] const descriptor = Object.getOwnPropertyDescriptor(properties, key)! if (process.env.NODE_ENV !== "production") { if (Object.getOwnPropertyDescriptor(target, key)) fail( - `'extendObservable' can only be used to introduce new properties. Use 'set' or 'decorate' instead. The property '${key}' already exists on '${target}'` + `'extendObservable' can only be used to introduce new properties. Use 'set' or 'decorate' instead. The property '${stringifyKey( + key + )}' already exists on '${target}'` ) if (isComputed(descriptor.value)) fail( @@ -89,7 +103,7 @@ export function extendObservableObjectWithProperties( ? computedDecorator : defaultDecorator if (process.env.NODE_ENV !== "production" && typeof decorator !== "function") - fail(`Not a valid decorator for '${key}', got: ${decorator}`) + fail(`Not a valid decorator for '${stringifyKey(key)}', got: ${decorator}`) const resultDescriptor = decorator!(target, key, descriptor, true) if ( diff --git a/src/api/object-api.ts b/src/api/object-api.ts index d284892b8..a38081fd3 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -19,7 +19,7 @@ import { export function keys(map: ObservableMap): ReadonlyArray export function keys(ar: IObservableArray): ReadonlyArray export function keys(set: ObservableSet): ReadonlyArray -export function keys(obj: T): ReadonlyArray +export function keys(obj: T): ReadonlyArray export function keys(obj: any): any { if (isObservableObject(obj)) { return ((obj as any) as IIsObservableObject)[$mobx].getKeys() @@ -85,12 +85,12 @@ export function entries(obj: any): any { ) } -export function set(obj: ObservableMap, values: { [key: string]: V }) +export function set(obj: ObservableMap, values: { [key: string]: V }) export function set(obj: ObservableMap, key: K, value: V) export function set(obj: ObservableSet, value: T) export function set(obj: IObservableArray, index: number, value: T) export function set(obj: T, values: { [key: string]: any }) -export function set(obj: T, key: string, value: any) +export function set(obj: T, key: PropertyKey, value: any) export function set(obj: any, key: any, value?: any): void { if (arguments.length === 2 && !isObservableSet(obj)) { startBatch() diff --git a/src/api/observabledecorator.ts b/src/api/observabledecorator.ts index beb059c7d..63de2f36f 100644 --- a/src/api/observabledecorator.ts +++ b/src/api/observabledecorator.ts @@ -4,7 +4,8 @@ import { asObservableObject, createPropDecorator, fail, - invariant + invariant, + stringifyKey } from "../internal" export type IObservableDecorator = { @@ -18,7 +19,7 @@ export function createDecoratorForEnhancer(enhancer: IEnhancer): IObservabl true, ( target: any, - propertyName: string, + propertyName: PropertyKey, descriptor: BabelDescriptor | undefined, _decoratorTarget, decoratorArgs: any[] @@ -26,7 +27,9 @@ export function createDecoratorForEnhancer(enhancer: IEnhancer): IObservabl if (process.env.NODE_ENV !== "production") { invariant( !descriptor || !descriptor.get, - `@observable cannot be used on getter (property "${propertyName}"), use @computed instead.` + `@observable cannot be used on getter (property "${stringifyKey( + propertyName + )}"), use @computed instead.` ) } const initialValue = descriptor diff --git a/src/api/tojs.ts b/src/api/tojs.ts index 292c56a51..f70a55fc4 100644 --- a/src/api/tojs.ts +++ b/src/api/tojs.ts @@ -1,10 +1,14 @@ import { + $mobx, keys, isObservable, isObservableArray, isObservableValue, isObservableMap, - isObservableSet + isObservableSet, + getPlainObjectKeys, + mobxDidRunLazyInitializersSymbol, + mobxPendingDecorators } from "../internal" export type ToJSOptions = { @@ -88,7 +92,15 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) // Fallback to the situation that source is an ObservableObject or a plain object const res = cache(__alreadySeen, source, {}, options) - for (let key in source) { + const objKeys = getPlainObjectKeys(source) + for (let i in objKeys) { + const key = objKeys[i] + if ( + key === $mobx || + key === mobxDidRunLazyInitializersSymbol || + key === mobxPendingDecorators + ) + continue res[key] = toJSHelper(source[key], options!, __alreadySeen) } diff --git a/src/types/dynamicobject.ts b/src/types/dynamicobject.ts index 2569d7806..c6749d898 100644 --- a/src/types/dynamicobject.ts +++ b/src/types/dynamicobject.ts @@ -12,6 +12,10 @@ function getAdm(target): ObservableObjectAdministration { return target[$mobx] } +function isPropertyKey(val) { + return typeof val === "string" || typeof val === "number" || typeof val === "symbol" +} + // Optimization: we don't need the intermediate objects and could have a completely custom administration for DynamicObjects, // and skip either the internal values map, or the base object with its property descriptors! const objectProxyTraps: ProxyHandler = { @@ -22,14 +26,14 @@ const objectProxyTraps: ProxyHandler = { // MWE: should `in` operator be reactive? If not, below code path will be faster / more memory efficient // TODO: check performance stats! // if (adm.values.get(name as string)) return true - if (typeof name === "string") return adm.has(name) + if (isPropertyKey(name)) return adm.has(name) return (name as any) in target }, get(target: IIsObservableObject, name: PropertyKey) { if (name === $mobx || name === "constructor" || name === mobxDidRunLazyInitializersSymbol) return target[name] const adm = getAdm(target) - const observable = adm.values.get(name as string) + const observable = adm.values.get(name) if (observable instanceof Atom) { const result = (observable as any).get() if (result === undefined) { @@ -42,16 +46,16 @@ const objectProxyTraps: ProxyHandler = { } // make sure we start listening to future keys // note that we only do this here for optimization - if (typeof name === "string") adm.has(name) + if (isPropertyKey(name)) adm.has(name) return target[name] }, set(target: IIsObservableObject, name: PropertyKey, value: any) { - if (typeof name !== "string") return false + if (!isPropertyKey(name)) return false set(target, name, value) return true }, deleteProperty(target: IIsObservableObject, name: PropertyKey) { - if (typeof name !== "string") return false + if (!isPropertyKey(name)) return false const adm = getAdm(target) adm.remove(name) return true diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 31850daf5..07aed5d36 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -13,6 +13,7 @@ import { fail, getMapLikeKeys, getNextId, + getPlainObjectKeys, hasInterceptors, hasListeners, interceptChange, @@ -27,6 +28,7 @@ import { registerListener, spyReportEnd, spyReportStart, + stringifyKey, transaction, untracked, globalState @@ -303,7 +305,7 @@ export class ObservableMap } transaction(() => { if (isPlainObject(other)) - Object.keys(other).forEach(key => this.set((key as any) as K, other[key])) + getPlainObjectKeys(other).forEach(key => this.set((key as any) as K, other[key])) else if (Array.isArray(other)) other.forEach(([key, value]) => this.set(key, value)) else if (isES6Map(other)) { if (other.constructor !== Map) @@ -401,11 +403,6 @@ export class ObservableMap } } -function stringifyKey(key: any): string { - if (key && key.toString) return key.toString() - else return new String(key).toString() -} - /* 'var' fixes small-build issue */ export const isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap) as ( thing: any diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 2658a770e..594a9e0d7 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -31,6 +31,7 @@ import { spyReportEnd, spyReportStart, startBatch, + stringifyKey, globalState } from "../internal" @@ -40,20 +41,20 @@ export interface IObservableObject { export type IObjectDidChange = | { - name: string + name: PropertyKey object: any type: "add" newValue: any } | { - name: string + name: PropertyKey object: any type: "update" oldValue: any newValue: any } | { - name: string + name: PropertyKey object: any type: "remove" oldValue: any @@ -63,13 +64,13 @@ export type IObjectWillChange = | { object: any type: "update" | "add" - name: string + name: PropertyKey newValue: any } | { object: any type: "remove" - name: string + name: PropertyKey } export class ObservableObjectAdministration @@ -78,22 +79,22 @@ export class ObservableObjectAdministration changeListeners interceptors private proxy: any - private pendingKeys: undefined | Map> + private pendingKeys: undefined | Map> constructor( public target: any, - public values = new Map | ComputedValue>(), + public values = new Map | ComputedValue>(), public name: string, public defaultEnhancer: IEnhancer ) { this.keysAtom = new Atom(name + ".keys") } - read(key: string) { + read(key: PropertyKey) { return this.values.get(key)!.get() } - write(key: string, newValue) { + write(key: PropertyKey, newValue) { const instance = this.target const observable = this.values.get(key) if (observable instanceof ComputedValue) { @@ -137,7 +138,7 @@ export class ObservableObjectAdministration } } - has(key: string) { + has(key: PropertyKey) { const map = this.pendingKeys || (this.pendingKeys = new Map()) let entry = map.get(key) if (entry) return entry.get() @@ -148,7 +149,7 @@ export class ObservableObjectAdministration entry = new ObservableValue( exists, referenceEnhancer, - `${this.name}.${key.toString()}?`, + `${this.name}.${stringifyKey(key)}?`, false ) map.set(key, entry) @@ -156,7 +157,11 @@ export class ObservableObjectAdministration } } - addObservableProp(propName: string, newValue, enhancer: IEnhancer = this.defaultEnhancer) { + addObservableProp( + propName: PropertyKey, + newValue, + enhancer: IEnhancer = this.defaultEnhancer + ) { const { target } = this assertPropertyConfigurable(target, propName) @@ -173,7 +178,7 @@ export class ObservableObjectAdministration const observable = new ObservableValue( newValue, enhancer, - `${this.name}.${propName}`, + `${this.name}.${stringifyKey(propName)}`, false ) this.values.set(propName, observable) @@ -185,17 +190,17 @@ export class ObservableObjectAdministration addComputedProp( propertyOwner: any, // where is the property declared? - propName: string, + propName: PropertyKey, options: IComputedValueOptions ) { const { target } = this - options.name = options.name || `${this.name}.${propName}` + options.name = options.name || `${this.name}.${stringifyKey(propName)}` this.values.set(propName, new ComputedValue(options)) if (propertyOwner === target || isPropertyConfigurable(propertyOwner, propName)) Object.defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)) } - remove(key: string) { + remove(key: PropertyKey) { if (!this.values.has(key)) return const { target } = this if (hasInterceptors(this)) { @@ -283,7 +288,7 @@ export class ObservableObjectAdministration return registerInterceptor(this, handler) } - notifyPropertyAddition(key: string, newValue) { + notifyPropertyAddition(key: PropertyKey, newValue) { const notify = hasListeners(this) const notifySpy = isSpyEnabled() const change = @@ -307,10 +312,10 @@ export class ObservableObjectAdministration this.keysAtom.reportChanged() } - getKeys(): string[] { + getKeys(): PropertyKey[] { this.keysAtom.reportObserved() // return Reflect.ownKeys(this.values) as any - const res: string[] = [] + const res: PropertyKey[] = [] for (const [key, value] of this.values) if (value instanceof ObservableValue) res.push(key) return res } @@ -322,7 +327,7 @@ export interface IIsObservableObject { export function asObservableObject( target: any, - name: string = "", + name: PropertyKey = "", defaultEnhancer: IEnhancer = deepEnhancer ): ObservableObjectAdministration { if (Object.prototype.hasOwnProperty.call(target, $mobx)) return target[$mobx] @@ -336,7 +341,12 @@ export function asObservableObject( name = (target.constructor.name || "ObservableObject") + "@" + getNextId() if (!name) name = "ObservableObject@" + getNextId() - const adm = new ObservableObjectAdministration(target, new Map(), name, defaultEnhancer) + const adm = new ObservableObjectAdministration( + target, + new Map(), + stringifyKey(name), + defaultEnhancer + ) addHiddenProp(target, $mobx, adm) return adm } diff --git a/src/utils/decorators.ts b/src/utils/decorators.ts index 669bab987..04c17b49e 100644 --- a/src/utils/decorators.ts +++ b/src/utils/decorators.ts @@ -12,7 +12,7 @@ export type BabelDescriptor = PropertyDescriptor & { initializer?: () => any } export type PropertyCreator = ( instance: any, - propertyName: string, + propertyName: PropertyKey, descriptor: BabelDescriptor | undefined, decoratorTarget: any, decoratorArgs: any[] diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 624339ae7..c0c76ec8d 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -150,6 +150,27 @@ export function isES6Set(thing): thing is Set { return thing instanceof Set } +/** + * Returns the following: own keys, prototype keys & own symbol keys. + */ +export function getPlainObjectKeys(object) { + return unique( + ([] as PropertyKey[]).concat.apply( + [], + [ + Object.keys(object), + Object.keys(Object.getPrototypeOf(object)), + Object.getOwnPropertySymbols(object) + ] + ) + ) +} + +export function stringifyKey(key: any): string { + if (key && key.toString) return key.toString() + else return new String(key).toString() +} + export function getMapLikeKeys(map: ObservableMap): ReadonlyArray export function getMapLikeKeys(map: IKeyValueMap | any): ReadonlyArray export function getMapLikeKeys(map: any): any { diff --git a/test/base/object-api.js b/test/base/object-api.js index 4b28465db..626825210 100644 --- a/test/base/object-api.js +++ b/test/base/object-api.js @@ -80,6 +80,28 @@ test("object - set, remove, values are reactive", () => { expect(snapshots).toEqual([[3], [3, 4], [5, 4], [5]]) }) +test("object with symbol keys - set, remove, values are reactive", () => { + const todos = observable({}) + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + + reaction(() => values(todos), values => snapshots.push(values)) + + expect(has(todos, x)).toBe(false) + expect(get(todos, x)).toBe(undefined) + set(todos, x, 3) + expect(has(todos, x)).toBe(true) + expect(get(todos, x)).toBe(3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + + expect(snapshots).toEqual([[3], [3, 4], [5, 4], [5]]) +}) + test("object - set, remove, entries are reactive", () => { const todos = observable({}) const snapshots = [] @@ -99,6 +121,28 @@ test("object - set, remove, entries are reactive", () => { expect(snapshots).toEqual([[["x", 3]], [["x", 3], ["z", 4]], [["x", 5], ["z", 4]], [["x", 5]]]) }) +test("object with symbols - set, remove, entries are reactive", () => { + const todos = observable({}) + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + + reaction(() => entries(todos), entries => snapshots.push(entries)) + + expect(has(todos, x)).toBe(false) + expect(get(todos, x)).toBe(undefined) + set(todos, x, 3) + expect(has(todos, x)).toBe(true) + expect(get(todos, x)).toBe(3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + + expect(snapshots).toEqual([[[x, 3]], [[x, 3], [z, 4]], [[x, 5], [z, 4]], [[x, 5]]]) +}) + test("object - set, remove, keys are reactive", () => { const todos = observable({ a: 3 }) const snapshots = [] @@ -115,6 +159,26 @@ test("object - set, remove, keys are reactive", () => { expect(snapshots).toEqual([["a", "x"], ["a", "x", "z"], ["a", "x"], ["x"]]) }) +test("object with symbol keys - set, remove, keys are reactive", () => { + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + const a = Symbol() + const todos = observable({ [a]: 3 }) + + reaction(() => keys(todos), keys => snapshots.push(keys)) + + set(todos, x, 3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + remove(todos, a) + + expect(snapshots).toEqual([[a, x], [a, x, z], [a, x], [x]]) +}) + test("map - set, remove, values are reactive", () => { const todos = observable.map({}) const snapshots = [] @@ -134,6 +198,28 @@ test("map - set, remove, values are reactive", () => { expect(snapshots).toEqual([[3], [3, 4], [5, 4], [5]]) }) +test("map with symbol keys - set, remove, values are reactive", () => { + const todos = observable.map({}) + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + + reaction(() => values(todos), values => snapshots.push(values)) + + expect(has(todos, x)).toBe(false) + expect(get(todos, x)).toBe(undefined) + set(todos, x, 3) + expect(has(todos, x)).toBe(true) + expect(get(todos, x)).toBe(3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + + expect(snapshots).toEqual([[3], [3, 4], [5, 4], [5]]) +}) + test("map - set, remove, entries are reactive", () => { const todos = observable.map({}) const snapshots = [] @@ -153,6 +239,28 @@ test("map - set, remove, entries are reactive", () => { expect(snapshots).toEqual([[["x", 3]], [["x", 3], ["z", 4]], [["x", 5], ["z", 4]], [["x", 5]]]) }) +test("map with symbol keys - set, remove, entries are reactive", () => { + const todos = observable.map({}) + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + + reaction(() => entries(todos), entries => snapshots.push(entries)) + + expect(has(todos, x)).toBe(false) + expect(get(todos, x)).toBe(undefined) + set(todos, x, 3) + expect(has(todos, x)).toBe(true) + expect(get(todos, x)).toBe(3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + + expect(snapshots).toEqual([[[x, 3]], [[x, 3], [z, 4]], [[x, 5], [z, 4]], [[x, 5]]]) +}) + test("map - set, remove, keys are reactive", () => { const todos = observable.map({ a: 3 }) const snapshots = [] @@ -169,6 +277,26 @@ test("map - set, remove, keys are reactive", () => { expect(snapshots).toEqual([["a", "x"], ["a", "x", "z"], ["a", "x"], ["x"]]) }) +test("map with symbol keys - set, remove, keys are reactive", () => { + const snapshots = [] + const x = Symbol() + const y = Symbol() + const z = Symbol("z") + const a = Symbol() + const todos = observable.map({ [a]: 3 }) + + reaction(() => keys(todos), keys => snapshots.push(keys)) + + set(todos, x, 3) + remove(todos, y) + set(todos, z, 4) + set(todos, x, 5) + remove(todos, z) + remove(todos, a) + + expect(snapshots).toEqual([[a, x], [a, x, z], [a, x], [x]]) +}) + test("array - set, remove, values are reactive", () => { const todos = observable.array() const snapshots = [] diff --git a/test/base/tojs.js b/test/base/tojs.js index 9f324a525..c56c7bd00 100644 --- a/test/base/tojs.js +++ b/test/base/tojs.js @@ -221,6 +221,23 @@ test("toJS handles dates", () => { expect(a.d === b.d).toBe(true) }) +test("toJS handles symbol keys in objects and maps", () => { + var key = Symbol("key") + var a = observable({ + [key]: 42 + }) + + var b = mobx.toJS(a) + expect(b[key]).toBe(42) + + var x = observable.map({ + [key]: 43 + }) + + var y = mobx.toJS(x) + expect(y[key]).toBe(43) +}) + test("json cycles", function() { var a = observable({ b: 1, @@ -403,7 +420,7 @@ describe("recurseEverything set to true", function() { const convertedObj = mobx.toJS({ key: cycledObj }, { recurseEverything: true }) expect(convertedObj.key).toBe(convertedObj.key.cycle) }) - + test("should return null if source is null", function() { expect(mobx.toJS(null)).toBeNull() expect(mobx.toJS(null, { recurseEverything: true })).toBeNull() From 39dd64e4fee301d8760510bbe2b8331e887c91b9 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Tue, 4 Jun 2019 10:42:25 +0200 Subject: [PATCH 0064/1043] update tooling (rollup, etc) (ignore red x, it is coveralls) (#1931) * update tooling * remove some now unused dev deps * actually use terser * tiny tweak to build script * merge master --- .eslintrc.js | 14 +- .travis.yml | 8 +- .vscode/settings.json | 33 +- package.json | 80 +- scripts/build.js | 137 +- src/api/flow.ts | 12 +- src/mobx.ts | 5 +- test/.babelrc | 12 +- test/base/action.js | 116 +- test/base/api.js | 2 +- test/base/array.js | 113 +- test/base/autorun.js | 34 +- test/base/autorunAsync.js | 56 +- test/base/babel-tests.js | 43 +- test/base/cycles.js | 35 +- test/base/decorate.js | 18 +- test/base/errorhandling.js | 129 +- test/base/extras.js | 100 +- test/base/flow.js | 59 +- test/base/intercept.js | 36 +- test/base/makereactive.js | 116 +- test/base/map.js | 114 +- test/base/modifiers2.js | 5 - test/base/nested.js | 1 - test/base/object-api-proxy.js | 16 +- test/base/object-api.js | 16 +- test/base/observables.js | 427 +- test/base/observe.js | 22 +- test/base/proxies.js | 10 +- test/base/reaction.js | 81 +- test/base/set.js | 27 +- test/base/spy.js | 32 +- test/base/strict-mode.js | 58 +- test/base/tojs.js | 45 +- test/base/trace.js | 4 +- test/base/typescript-tests.ts | 76 +- test/base/untracked.js | 14 +- test/mixed-versions/state-sharing.js | 24 +- test/perf/index.js | 6 +- test/perf/perf.js | 253 +- test/tsconfig.json | 12 - tsconfig.json | 10 +- tsconfig.test.json | 8 + yarn.lock | 8627 +++++++++++++++----------- 44 files changed, 6095 insertions(+), 4951 deletions(-) delete mode 100644 test/base/modifiers2.js delete mode 100644 test/tsconfig.json create mode 100644 tsconfig.test.json diff --git a/.eslintrc.js b/.eslintrc.js index dd55d9649..46887a928 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,9 +15,8 @@ module.exports = { "getter-return": "off", "no-console": "off", "no-var": "error", - // Things that don't play nicely with TS: - "no-unused-vars": "off", - "no-extra-semi": "off" + "no-undef": "off", + "no-extra-semi": "off" // doesn't get along well with prettier }, globals: { process: "readable", @@ -26,5 +25,14 @@ module.exports = { setTimeout: "readable", clearTimeout: "readable", module: "writable" + }, + overrides: { + files: ["**/*.ts"], + rules: { + // Things that don't play nicely with TS: + "require-yield": "off", + "no-unused-vars": "off", + "no-extra-semi": "off" + } } } diff --git a/.travis.yml b/.travis.yml index 442970337..9e2b5a608 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,11 @@ language: node_js install: - yarn install --frozen-lockfile -script: CI=true yarn test:travis -after_success: - - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js +script: + - CI=true yarn test:travis + - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js node_js: - - 10 + - 10 addons: apt: packages: diff --git a/.vscode/settings.json b/.vscode/settings.json index b481cfe7b..7baa2f150 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,24 +1,13 @@ { - "[typescript]": { - "editor.formatOnSave": true, - "editor.formatOnPaste": false - }, - "[javascript]": { - "editor.formatOnSave": true, - "editor.formatOnPaste": false - }, - // Note, these settings should match lint-staged settings! - "prettier.semi": false, - "prettier.tabWidth": 4, - "prettier.useTabs": false, - "prettier.printWidth": 100, - "prettier.singleQuote": false, + "[typescript]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": false + }, + "[javascript]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": false + }, "typescript.tsdk": "node_modules/typescript/lib", - // "javascript.validate.enable": false // enable for flow - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact" - ] -} \ No newline at end of file + // "javascript.validate.enable": false // enable for flow + "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"] +} diff --git a/package.json b/package.json index 4cf933ed3..0ef6ec03d 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,12 @@ "test:flow": "node_modules/.bin/flow check", "test:performance": "npm run small-build && PERSIST=true time node --expose-gc test/perf/index.js", "test:travis": "yarn test:all && yarn test:performance && yarn test -i --coverage && yarn test:webpack && yarn size", - "prettier": "prettier --write --print-width 100 --tab-width 4 --no-semi \"**/*.js\" \"**/*.jsx\" \"**/*.tsx\" \"**/*.ts\"", + "prettier": "prettier \"**/*.js\" \"**/*.jsx\" \"**/*.tsx\" \"**/*.ts\"", "_prepublish": "npm run small-build", "quick-build": "tsc --pretty", "small-build": "node scripts/build.js", - "lint": "eslint src/*.ts src/types/*.ts src/api/*.ts src/core/*.ts src/utils/*.ts", + "lint": "eslint src/**/*.ts", "size": "size-limit --babili 20KB lib/mobx.js", - "precommit": "lint-staged", "publish-script": "node scripts/publish.js" }, "repository": { @@ -46,41 +45,38 @@ ], "homepage": "https://mobx.js.org/", "devDependencies": { - "@babel/core": "^7.1.0", - "@babel/plugin-proposal-class-properties": "^7.1.0", - "@babel/plugin-proposal-decorators": "^7.1.0", - "@babel/preset-env": "^7.1.0", - "@types/jest": "^21.1.9", - "@types/node": "^7.0.22", - "@typescript-eslint/eslint-plugin": "^1.3.0", - "babel-core": "^7.0.0-bridge.0", - "babel-jest": "^23.6.0", - "browserify": "^12.0.1", + "@babel/core": "^7.3.4", + "@babel/plugin-proposal-class-properties": "^7.3.4", + "@babel/plugin-proposal-decorators": "^7.3.0", + "@babel/plugin-transform-runtime": "^7.3.4", + "@babel/preset-env": "^7.3.4", + "@babel/runtime": "^7.3.4", + "@types/jest": "^24.0.11", + "@types/node": "^11.11.3", + "@typescript-eslint/eslint-plugin": "^1.4.2", + "babel-jest": "^24.5.0", "chalk": "^1.1.3", - "coveralls": "^2.11.4", - "envify": "^4.1.0", - "eslint": "^5.13.0", + "coveralls": "^3.0.3", + "eslint": "^5.15.2", "flow-bin": "^0.59.0", - "fs-extra": "^3.0.1", - "husky": "^0.14.3", - "iterall": "^1.0.2", - "jest": "^23.6.0", - "lint-staged": "^3.6.1", - "lodash.intersection": "^3.2.0", - "ncp": "^2.0.0", - "prettier": "^1.4.4", - "regenerator-runtime": "^0.11.1", - "rollup": "^0.41.6", - "rollup-plugin-filesize": "^1.3.2", - "rollup-plugin-node-resolve": "^3.0.0", - "serializr": "^1.3.0", - "shelljs": "^0.8.2", - "size-limit": "^0.2.0", - "tape": "^4.2.2", - "ts-jest": "^22.0.0", - "tslib": "^1.7.1", - "typescript": "^3.2.1", - "uglify-es": "^3.3.9" + "fs-extra": "^7.0.1", + "husky": "^1.3.1", + "iterall": "^1.2.2", + "jest": "^24.5.0", + "lint-staged": "^8.1.5", + "prettier": "^1.16.4", + "rollup": "^1.6.0", + "rollup-plugin-filesize": "^6.0.1", + "rollup-plugin-node-resolve": "^4.0.1", + "rollup-plugin-replace": "^2.1.0", + "rollup-plugin-terser": "^4.0.4", + "serializr": "^1.5.1", + "shelljs": "^0.8.3", + "size-limit": "^1.0.0", + "tape": "^4.10.1", + "ts-jest": "^24.0.0", + "tslib": "^1.9.3", + "typescript": "^3.3.3333" }, "dependencies": {}, "keywords": [ @@ -99,11 +95,16 @@ ], "lint-staged": { "*.{ts,tsx,js,jsx}": [ - "prettier --write --print-width 100 --tab-width 4 --no-semi", + "prettier --write", "git add" ] }, "jest": { + "globals": { + "ts-jest": { + "tsConfig": "tsconfig.test.json" + } + }, "transform": { "^.+\\.tsx?$": "ts-jest", "^.+\\.jsx?$": "babel-jest" @@ -123,5 +124,10 @@ "watchPathIgnorePatterns": [ "/node_modules/" ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } } } \ No newline at end of file diff --git a/scripts/build.js b/scripts/build.js index 0fc186c22..99cc50321 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,28 +1,19 @@ -const rollup = require("rollup") +const { rollup } = require("rollup") +const resolvePlugin = require("rollup-plugin-node-resolve") +const filesizePlugin = require("rollup-plugin-filesize") +const replacePlugin = require("rollup-plugin-replace") +const terserPlugin = require("rollup-plugin-terser").terser + const fs = require("fs-extra") const path = require("path") const ts = require("typescript") -const shell = require("shelljs") -const exec = shell.exec - -// exit upon first error -shell.set("-e") - -const binFolder = path.resolve("node_modules/.bin/") - -function getCmd(cmd) { - if (process.platform === "win32") { - return path.join(binFolder, cmd + ".cmd") - } - return cmd -} // make sure we're in the right folder process.chdir(path.resolve(__dirname, "..")) fs.removeSync("lib") -fs.removeSync(".build.cjs") -fs.removeSync(".build.es") +fs.removeSync(".build.es5") +fs.removeSync(".build.es6") function runTypeScriptBuild(outDir, target, declarations) { console.log(`Running typescript build (target: ${ts.ScriptTarget[target]}) in ${outDir}/`) @@ -59,88 +50,62 @@ function runTypeScriptBuild(outDir, target, declarations) { } } -const rollupPlugins = [require("rollup-plugin-node-resolve")(), require("rollup-plugin-filesize")()] - -const licensePreamble = "/** MobX - (c) Michel Weststrate 2015 - 2019 - MIT Licensed */" - -function generateBundledModule(inputFile, outputFile, format) { +async function generateBundledModule(inputFile, outputFile, format, production) { console.log(`Generating ${outputFile} bundle.`) - return rollup - .rollup({ - entry: inputFile, - plugins: rollupPlugins - }) - .then(bundle => - bundle.write({ - dest: outputFile, - format, - banner: licensePreamble, - exports: "named" - }) - ) -} - -function generateUmd() { - console.log("Generating mobx.umd.js") - exec("browserify -s mobx -e lib/mobx.js -o lib/mobx.umd.js") -} - -function generateMinified() { - const prodEnv = { - ...process.env, - NODE_ENV: "production" + let plugins + if (production) { + plugins = [ + resolvePlugin(), + replacePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }), + terserPlugin(), + filesizePlugin() + ] + } else { + plugins = [resolvePlugin(), filesizePlugin()] } - console.log("Generating mobx.min.js and mobx.umd.min.js") - exec(`${getCmd(`envify`)} lib/mobx.js > lib/mobx.prod.js`, { env: prodEnv }) - exec( - `${getCmd( - "uglifyjs" - )} --toplevel -m -c warnings=false -b beautify=false,preamble='"${licensePreamble}"' --source-map -o lib/mobx.min.js lib/mobx.prod.js` - ) - exec(`${getCmd(`envify`)} lib/mobx.umd.js > lib/mobx.prod.umd.js`, { - env: prodEnv + const bundle = await rollup({ + input: inputFile, + plugins + }) + + await bundle.write({ + file: outputFile, + format, + banner: "/** MobX - (c) Michel Weststrate 2015 - 2019 - MIT Licensed */", + exports: "named", + name: format === "umd" ? "mobx" : undefined }) - exec( - `${getCmd( - `uglifyjs` - )} --toplevel -m -c warnings=false -b beautify=false,preamble='"${licensePreamble}"' --source-map -o lib/mobx.umd.min.js lib/mobx.prod.umd.js` - ) - shell.rm("lib/mobx.prod.js", "lib/mobx.prod.umd.js") + + console.log(`Generation of ${outputFile} bundle finished.`) } function copyFlowDefinitions() { console.log("Copying flowtype definitions") - exec(`${getCmd(`ncp`)} flow-typed/mobx.js lib/mobx.js.flow`) + fs.copyFileSync("flow-typed/mobx.js", "lib/mobx.js.flow") + console.log("Copying of flowtype definitions done") } -function build() { +async function build() { runTypeScriptBuild(".build.es5", ts.ScriptTarget.ES5, true) runTypeScriptBuild(".build.es6", ts.ScriptTarget.ES2015, false) - return Promise.all([ - generateBundledModule( - path.resolve(".build.es5", "mobx.js"), - path.resolve("lib", "mobx.js"), - "cjs" - ), - - generateBundledModule( - path.resolve(".build.es5", "mobx.js"), - path.resolve("lib", "mobx.module.js"), - "es" - ), - - generateBundledModule( - path.resolve(".build.es6", "mobx.js"), - path.resolve("lib", "mobx.es6.js"), - "es" - ) - ]).then(() => { - generateUmd() - generateMinified() - copyFlowDefinitions() - }) + + const es5Build = path.join(".build.es5", "mobx.js") + const es6Build = path.join(".build.es6", "mobx.js") + + await Promise.all([ + generateBundledModule(es5Build, path.join("lib", "mobx.js"), "cjs", false), + generateBundledModule(es5Build, path.join("lib", "mobx.min.js"), "cjs", true), + + generateBundledModule(es5Build, path.join("lib", "mobx.module.js"), "es", false), + + generateBundledModule(es6Build, path.join("lib", "mobx.es6.js"), "es", false), + + generateBundledModule(es5Build, path.join("lib", "mobx.umd.js"), "umd", false), + generateBundledModule(es5Build, path.join("lib", "mobx.umd.min.js"), "umd", true) + ]) + copyFlowDefinitions() } build().catch(e => { diff --git a/src/api/flow.ts b/src/api/flow.ts index cb538c623..a5fcd9d87 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -17,8 +17,12 @@ export interface FlowReturn { // we skip promises that are the result of yielding promises (except if they use flowReturn) export type FlowReturnType = IfAllAreFlowYieldThenVoid< R extends FlowReturn - ? FR extends Promise ? FRP : FR - : R extends Promise ? FlowYield : R + ? FR extends Promise + ? FRP + : FR + : R extends Promise + ? FlowYield + : R > // we extract yielded promises from the return type @@ -30,7 +34,9 @@ export function flow( generator: (...args: Args) => IterableIterator ): (...args: Args) => CancellablePromise> { if (arguments.length !== 1) - fail(process.env.NODE_ENV && `Flow expects one 1 argument and cannot be used as decorator`) + fail( + !!process.env.NODE_ENV && `Flow expects one 1 argument and cannot be used as decorator` + ) const name = generator.name || "" // Implementation based on https://github.com/tj/co/blob/master/index.js diff --git a/src/mobx.ts b/src/mobx.ts index 41963f11f..a9fa7a063 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -41,9 +41,10 @@ try { process.env.NODE_ENV !== "production" && process.env.IGNORE_MOBX_MINIFY_WARNING !== "true" ) { + // trick so it doesn't get replaced + const varName = ["process", "env", "NODE_ENV"].join(".") console.warn( - // Template literal(backtick) is used for fix issue with rollup-plugin-commonjs https://github.com/rollup/rollup-plugin-commonjs/issues/344 - `[mobx] you are running a minified build, but 'process.env.NODE_ENV' was not set to 'production' in your bundler. This results in an unnecessarily large and slow bundle` + `[mobx] you are running a minified build, but '${varName}' was not set to 'production' in your bundler. This results in an unnecessarily large and slow bundle` ) } })() diff --git a/test/.babelrc b/test/.babelrc index 6c10c5cfa..909a34609 100644 --- a/test/.babelrc +++ b/test/.babelrc @@ -1,7 +1,13 @@ { "presets": ["@babel/preset-env"], "plugins": [ - ["@babel/plugin-proposal-decorators", { "legacy": true}], - ["@babel/plugin-proposal-class-properties", { "loose": true}] + [ + "@babel/plugin-transform-runtime", + { + "regenerator": true + } + ], + ["@babel/plugin-proposal-decorators", { "legacy": true }], + ["@babel/plugin-proposal-class-properties", { "loose": true }] ] -} \ No newline at end of file +} diff --git a/test/base/action.js b/test/base/action.js index 7117bacce..de4330e91 100644 --- a/test/base/action.js +++ b/test/base/action.js @@ -1,15 +1,15 @@ "use strict" -var mobx = require("../../src/mobx.ts") -var utils = require("../utils/test-utils") +const mobx = require("../../src/mobx.ts") +const utils = require("../utils/test-utils") test("action should wrap in transaction", () => { - var values = [] + const values = [] - var observable = mobx.observable.box(0) - var d = mobx.autorun(() => values.push(observable.get())) + const observable = mobx.observable.box(0) + mobx.autorun(() => values.push(observable.get())) - var increment = mobx.action("increment", amount => { + const increment = mobx.action("increment", amount => { observable.set(observable.get() + amount * 2) observable.set(observable.get() - amount) // oops }) @@ -23,9 +23,9 @@ test("action should wrap in transaction", () => { }) test("action modifications should be picked up 1", () => { - var a = mobx.observable.box(1) - var i = 3 - var b = 0 + const a = mobx.observable.box(1) + let i = 3 + let b = 0 mobx.autorun(() => { b = a.get() * 2 @@ -33,7 +33,7 @@ test("action modifications should be picked up 1", () => { expect(b).toBe(2) - var action = mobx.action(() => { + const action = mobx.action(() => { a.set(++i) }) @@ -45,8 +45,8 @@ test("action modifications should be picked up 1", () => { }) test("action modifications should be picked up 1", () => { - var a = mobx.observable.box(1) - var b = 0 + const a = mobx.observable.box(1) + let b = 0 mobx.autorun(() => { b = a.get() * 2 @@ -54,7 +54,7 @@ test("action modifications should be picked up 1", () => { expect(b).toBe(2) - var action = mobx.action(() => { + const action = mobx.action(() => { a.set(a.get() + 1) // ha, no loop! }) @@ -66,10 +66,10 @@ test("action modifications should be picked up 1", () => { }) test("action modifications should be picked up 3", () => { - var a = mobx.observable.box(1) - var b = 0 + const a = mobx.observable.box(1) + let b = 0 - var doubler = mobx.computed(() => a.get() * 2) + const doubler = mobx.computed(() => a.get() * 2) doubler.observe(() => { b = doubler.get() @@ -77,7 +77,7 @@ test("action modifications should be picked up 3", () => { expect(b).toBe(2) - var action = mobx.action(() => { + const action = mobx.action(() => { a.set(a.get() + 1) // ha, no loop! }) @@ -89,19 +89,19 @@ test("action modifications should be picked up 3", () => { }) test("test action should be untracked", () => { - var a = mobx.observable.box(3) - var b = mobx.observable.box(4) - var latest = 0 - var runs = 0 + const a = mobx.observable.box(3) + const b = mobx.observable.box(4) + let latest = 0 + let runs = 0 - var action = mobx.action(baseValue => { + const action = mobx.action(baseValue => { b.set(baseValue * 2) latest = b.get() // without action this would trigger loop }) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { runs++ - var current = a.get() + const current = a.get() action(current) }) @@ -131,18 +131,18 @@ test("test action should be untracked", () => { }) test("should be possible to create autorun in action", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] - var adder = mobx.action(inc => { + const adder = mobx.action(inc => { return mobx.autorun(() => { values.push(a.get() + inc) }) }) - var d1 = adder(2) + const d1 = adder(2) a.set(3) - var d2 = adder(17) + const d2 = adder(17) a.set(24) d1() a.set(11) @@ -153,13 +153,13 @@ test("should be possible to create autorun in action", () => { }) test("should be possible to change unobserved state in an action called from computed", () => { - var a = mobx.observable.box(2) + const a = mobx.observable.box(2) - var testAction = mobx.action(() => { + const testAction = mobx.action(() => { a.set(3) }) - var c = mobx.computed(() => { + const c = mobx.computed(() => { testAction() }) @@ -212,16 +212,16 @@ test("should be possible to change observed state in an action called from compu }) test("should not be possible to change observed state in an action called from computed", () => { - var a = mobx.observable.box(2) - var d = mobx.autorun(() => { + const a = mobx.observable.box(2) + const d = mobx.autorun(() => { a.get() }) - var testAction = mobx.action(() => { + const testAction = mobx.action(() => { a.set(3) }) - var c = mobx.computed(() => { + const c = mobx.computed(() => { testAction() return a.get() }) @@ -237,13 +237,13 @@ test("should not be possible to change observed state in an action called from c }) test("action in autorun should be untracked", () => { - var a = mobx.observable.box(2) - var b = mobx.observable.box(3) + const a = mobx.observable.box(2) + const b = mobx.observable.box(3) - var data = [] - var multiplier = mobx.action(val => val * b.get()) + const data = [] + const multiplier = mobx.action(val => val * b.get()) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { data.push(multiplier(a.get())) }) @@ -259,7 +259,7 @@ test("action in autorun should be untracked", () => { }) test("action should not be converted to computed when using (extend)observable", () => { - var a = mobx.observable({ + const a = mobx.observable({ a: 1, b: mobx.action(function() { this.a++ @@ -282,7 +282,7 @@ test("action should not be converted to computed when using (extend)observable", }) test("#286 exceptions in actions should not affect global state", () => { - var autorunTimes = 0 + let autorunTimes = 0 function Todos() { mobx.extendObservable(this, { count: 0, @@ -312,9 +312,9 @@ test("#286 exceptions in actions should not affect global state", () => { test("runInAction", () => { mobx.configure({ enforceActions: "observed" }) - var values = [] - var events = [] - var spyDisposer = mobx.spy(ev => { + const values = [] + const events = [] + const spyDisposer = mobx.spy(ev => { if (ev.type === "action") events.push({ name: ev.name, @@ -322,10 +322,10 @@ test("runInAction", () => { }) }) - var observable = mobx.observable.box(0) - var d = mobx.autorun(() => values.push(observable.get())) + const observable = mobx.observable.box(0) + const d = mobx.autorun(() => values.push(observable.get())) - var res = mobx.runInAction("increment", () => { + let res = mobx.runInAction("increment", () => { observable.set(observable.get() + 6 * 2) observable.set(observable.get() - 3) // oops return 2 @@ -432,9 +432,9 @@ test("extendObservable respects action decorators", () => { expect(mobx.isAction(x.a2)).toBe(true) expect(mobx.isAction(x.a3)).toBe(false) - const global = (function() { - return this - })() + // const global = (function() { + // return this + // })() const { a1, a2, a3 } = x expect(a1.call(x)).toBe(x) @@ -458,8 +458,8 @@ test("expect warning superfluos decorator", () => { }) test("bound actions bind", () => { - var called = 0 - var x = mobx.observable( + let called = 0 + const x = mobx.observable( { y: 0, z: function(v) { @@ -476,13 +476,13 @@ test("bound actions bind", () => { } ) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { x.yValue }) - var events = [] - var d2 = mobx.spy(e => events.push(e)) + const events = [] + const d2 = mobx.spy(e => events.push(e)) - var runner = x.z + const runner = x.z runner(3) expect(x.yValue).toBe(6) expect(called).toBe(2) diff --git a/test/base/api.js b/test/base/api.js index 63de65d4a..e95e48b94 100644 --- a/test/base/api.js +++ b/test/base/api.js @@ -1,5 +1,5 @@ import * as fs from "fs" -var mobx = require("../../src/mobx.ts") +const mobx = require("../../src/mobx.ts") test("correct api should be exposed", function() { expect( diff --git a/test/base/array.js b/test/base/array.js index ceaee689a..c6f1b083d 100644 --- a/test/base/array.js +++ b/test/base/array.js @@ -1,22 +1,11 @@ "use strict" -var mobx = require("../../src/mobx.ts") -const { observable, $mobx, when, _getAdministration } = mobx -var iterall = require("iterall") - -function buffer() { - var b = [] - var res = function(newValue) { - b.push(newValue) - } - res.toArray = function() { - return b - } - return res -} +const mobx = require("../../src/mobx.ts") +const { observable, when, _getAdministration } = mobx +const iterall = require("iterall") test("test1", function() { - var a = observable.array([]) + const a = observable.array([]) expect(a.length).toBe(0) expect(Object.keys(a)).toEqual([]) expect(a.slice()).toEqual([]) @@ -29,7 +18,7 @@ test("test1", function() { expect(a.length).toBe(2) expect(a.slice()).toEqual([1, 2]) - var sum = mobx.computed(function() { + const sum = mobx.computed(function() { return ( -1 + a.reduce(function(a, b) { @@ -97,17 +86,17 @@ test("test1", function() { }) test("array should support iterall / iterable ", () => { - var a = observable([1, 2, 3]) + const a = observable([1, 2, 3]) expect(iterall.isIterable(a)).toBe(true) expect(iterall.isArrayLike(a)).toBe(true) - var values = [] + const values = [] iterall.forEach(a, v => values.push(v)) expect(values).toEqual([1, 2, 3]) - var iter = iterall.getIterator(a) + let iter = iterall.getIterator(a) expect(iter.next()).toEqual({ value: 1, done: false }) expect(iter.next()).toEqual({ value: 2, done: false }) expect(iter.next()).toEqual({ value: 3, done: false }) @@ -119,8 +108,8 @@ test("array should support iterall / iterable ", () => { }) test("find(findIndex) and remove", function() { - var a = mobx.observable([10, 20, 20]) - var idx = -1 + const a = mobx.observable([10, 20, 20]) + let idx = -1 function predicate(item, index) { if (item === 20) { idx = index @@ -147,15 +136,15 @@ test("find(findIndex) and remove", function() { }) test("concat should automatically slice observable arrays, #260", () => { - var a1 = mobx.observable([1, 2]) - var a2 = mobx.observable([3, 4]) + const a1 = mobx.observable([1, 2]) + const a2 = mobx.observable([3, 4]) expect(a1.concat(a2)).toEqual([1, 2, 3, 4]) }) test("observe", function() { - var ar = mobx.observable([1, 4]) - var buf = [] - var disposer = ar.observe(function(changes) { + const ar = mobx.observable([1, 4]) + const buf = [] + const disposer = ar.observe(function(changes) { buf.push(changes) }, true) @@ -177,7 +166,7 @@ test("observe", function() { delete change.object }) - var result = [ + const result = [ { type: "splice", index: 0, addedCount: 2, removed: [], added: [1, 4], removedCount: 0 }, { type: "update", index: 1, oldValue: 4, newValue: 3 }, { type: "splice", index: 2, addedCount: 1, removed: [], added: [0], removedCount: 0 }, @@ -210,15 +199,15 @@ test("observe", function() { }) test("array modification1", function() { - var a = mobx.observable([1, 2, 3]) - var r = a.splice(-10, 5, 4, 5, 6) + const a = mobx.observable([1, 2, 3]) + const r = a.splice(-10, 5, 4, 5, 6) expect(a.slice()).toEqual([4, 5, 6]) expect(r).toEqual([1, 2, 3]) }) test("serialize", function() { - var a = [1, 2, 3] - var m = mobx.observable(a) + let a = [1, 2, 3] + const m = mobx.observable(a) expect(JSON.stringify(m)).toEqual(JSON.stringify(a)) @@ -231,14 +220,14 @@ test("serialize", function() { }) test("array modification functions", function() { - var ars = [[], [1, 2, 3]] - var funcs = ["push", "pop", "shift", "unshift"] + const ars = [[], [1, 2, 3]] + const funcs = ["push", "pop", "shift", "unshift"] funcs.forEach(function(f) { ars.forEach(function(ar) { - var a = ar.slice() - var b = mobx.observable(a) - var res1 = a[f](4) - var res2 = b[f](4) + const a = ar.slice() + const b = mobx.observable(a) + const res1 = a[f](4) + const res2 = b[f](4) expect(res1).toEqual(res2) expect(a).toEqual(b.slice()) }) @@ -246,9 +235,9 @@ test("array modification functions", function() { }) test("array modifications", function() { - var a2 = mobx.observable([]) - var inputs = [undefined, -10, -4, -3, -1, 0, 1, 3, 4, 10] - var arrays = [ + const a2 = mobx.observable([]) + const inputs = [undefined, -10, -4, -3, -1, 0, 1, 3, 4, 10] + const arrays = [ [], [1], [1, 2, 3, 4], @@ -256,11 +245,11 @@ test("array modifications", function() { [1, undefined], [undefined] ] - for (var i = 0; i < inputs.length; i++) - for (var j = 0; j < inputs.length; j++) - for (var k = 0; k < arrays.length; k++) - for (var l = 0; l < arrays.length; l++) { - var msg = [ + for (let i = 0; i < inputs.length; i++) + for (let j = 0; j < inputs.length; j++) + for (let k = 0; k < arrays.length; k++) + for (let l = 0; l < arrays.length; l++) { + ;[ "array mod: [", arrays[k].toString(), "] i: ", @@ -271,10 +260,10 @@ test("array modifications", function() { arrays[l].toString(), "]" ].join(" ") - var a1 = arrays[k].slice() + const a1 = arrays[k].slice() a2.replace(a1) - var res1 = a1.splice.apply(a1, [inputs[i], inputs[j]].concat(arrays[l])) - var res2 = a2.splice.apply(a2, [inputs[i], inputs[j]].concat(arrays[l])) + const res1 = a1.splice.apply(a1, [inputs[i], inputs[j]].concat(arrays[l])) + const res2 = a2.splice.apply(a2, [inputs[i], inputs[j]].concat(arrays[l])) expect(a1.slice()).toEqual(a2.slice()) expect(res1).toEqual(res2) expect(a1.length).toBe(a2.length) @@ -282,7 +271,7 @@ test("array modifications", function() { }) test("is array", function() { - var x = mobx.observable([]) + const x = mobx.observable([]) expect(x instanceof Array).toBe(true) // would be cool if this would return true... @@ -324,11 +313,11 @@ test("observes when stringified to locale", function() { }) test("react to sort changes", function() { - var x = mobx.observable([4, 2, 3]) - var sortedX = mobx.computed(function() { + const x = mobx.observable([4, 2, 3]) + const sortedX = mobx.computed(function() { return x.slice().sort() }) - var sorted + let sorted mobx.autorun(function() { sorted = sortedX.get() @@ -345,9 +334,9 @@ test("react to sort changes", function() { }) test("autoextend buffer length", function() { - var ar = observable(new Array(1000)) - var changesCount = 0 - ar.observe(changes => ++changesCount) + const ar = observable(new Array(1000)) + let changesCount = 0 + ar.observe(() => ++changesCount) ar[ar.length] = 0 ar.push(0) @@ -356,18 +345,18 @@ test("autoextend buffer length", function() { }) test("array exposes correct keys", () => { - var keys = [] - var ar = observable([1, 2]) - for (var key in ar) keys.push(key) + const keys = [] + const ar = observable([1, 2]) + for (const key in ar) keys.push(key) expect(keys).toEqual(["0", "1"]) }) test("isArrayLike", () => { - var arr = [0, 1, 2] - var observableArr = observable(arr) + const arr = [0, 1, 2] + const observableArr = observable(arr) - var isArrayLike = mobx.isArrayLike + const isArrayLike = mobx.isArrayLike expect(typeof isArrayLike).toBe("function") expect(isArrayLike(observableArr)).toBe(true) @@ -379,7 +368,7 @@ test("isArrayLike", () => { test("accessing out of bound values throws", () => { const a = mobx.observable([]) - var warns = 0 + let warns = 0 const baseWarn = console.warn console.warn = () => { warns++ diff --git a/test/base/autorun.js b/test/base/autorun.js index 47a654227..8b18bd7e0 100644 --- a/test/base/autorun.js +++ b/test/base/autorun.js @@ -1,8 +1,8 @@ -var m = require("../../src/mobx.ts") +const m = require("../../src/mobx.ts") test("autorun passes Reaction as an argument to view function", function() { - var a = m.observable.box(1) - var values = [] + const a = m.observable.box(1) + const values = [] m.autorun(r => { expect(typeof r.dispose).toBe("function") @@ -20,8 +20,8 @@ test("autorun passes Reaction as an argument to view function", function() { }) test("autorun can be disposed on first run", function() { - var a = m.observable.box(1) - var values = [] + const a = m.observable.box(1) + const values = [] m.autorun(r => { r.dispose() @@ -34,17 +34,17 @@ test("autorun can be disposed on first run", function() { }) test("autorun warns when passed an action", function() { - var action = m.action(() => {}) + const action = m.action(() => {}) expect.assertions(1) expect(() => m.autorun(action)).toThrowError(/Autorun does not accept actions/) }) test("autorun batches automatically", function() { - var runs = 0 - var a1runs = 0 - var a2runs = 0 + let runs = 0 + let a1runs = 0 + let a2runs = 0 - var x = m.observable({ + const x = m.observable({ a: 1, b: 1, c: 1, @@ -54,12 +54,12 @@ test("autorun batches automatically", function() { } }) - var d1 = m.autorun(() => { + const d1 = m.autorun(() => { a1runs++ x.d // read }) - var d2 = m.autorun(() => { + const d2 = m.autorun(() => { a2runs++ x.b = x.a x.c = x.a @@ -80,10 +80,10 @@ test("autorun batches automatically", function() { }) test("autorun tracks invalidation of unbound dependencies", function() { - var a = m.observable.box(0) - var b = m.observable.box(0) - var c = m.computed(() => a.get() + b.get()) - var values = [] + const a = m.observable.box(0) + const b = m.observable.box(0) + const c = m.computed(() => a.get() + b.get()) + const values = [] m.autorun(() => { values.push(c.get()) @@ -95,7 +95,7 @@ test("autorun tracks invalidation of unbound dependencies", function() { }) test("when effect is an action", function(done) { - var a = m.observable.box(0) + const a = m.observable.box(0) m.configure({ enforceActions: "observed" }) m.when( diff --git a/test/base/autorunAsync.js b/test/base/autorunAsync.js index b917e7973..15590a376 100644 --- a/test/base/autorunAsync.js +++ b/test/base/autorunAsync.js @@ -1,12 +1,12 @@ -var m = require("../../src/mobx.ts") +const m = require("../../src/mobx.ts") const { $mobx } = m test("autorun 1", function(done) { - var _fired = 0 - var _result = null - var _cCalcs = 0 - var to = setTimeout + let _fired = 0 + let _result = null + let _cCalcs = 0 + const to = setTimeout function check(fired, cCalcs, result) { expect(_fired).toBe(fired) @@ -16,18 +16,18 @@ test("autorun 1", function(done) { _cCalcs = 0 } - var a = m.observable.box(2) - var b = m.observable.box(3) - var c = m.computed(function() { + const a = m.observable.box(2) + const b = m.observable.box(3) + const c = m.computed(function() { _cCalcs++ return a.get() * b.get() }) - var d = m.observable.box(1) - var autorun = function() { + const d = m.observable.box(1) + const autorun = function() { _fired++ _result = d.get() > 0 ? a.get() * c.get() : d.get() } - var disp = m.autorun(autorun, { delay: 20 }) + let disp = m.autorun(autorun, { delay: 20 }) check(0, 0, null) disp() @@ -81,13 +81,13 @@ test("autorun 1", function(done) { }) test("autorun should not result in loop", function(done) { - var i = 0 - var a = m.observable({ + let i = 0 + const a = m.observable({ x: i }) - var autoRunsCalled = 0 - var d = m.autorun( + let autoRunsCalled = 0 + const d = m.autorun( function() { autoRunsCalled++ a.x = ++i @@ -108,9 +108,9 @@ test("autorun should not result in loop", function(done) { }) test("autorunAsync passes Reaction as an argument to view function", function(done) { - var a = m.observable.box(1) + const a = m.observable.box(1) - var autoRunsCalled = 0 + let autoRunsCalled = 0 m.autorun( r => { @@ -133,16 +133,16 @@ test("autorunAsync passes Reaction as an argument to view function", function(do }) test("autorunAsync accepts a scheduling function", function(done) { - var a = m.observable({ + const a = m.observable({ x: 0, y: 1 }) - var autoRunsCalled = 0 - var schedulingsCalled = 0 + let autoRunsCalled = 0 + let schedulingsCalled = 0 m.autorun( - function(r) { + function() { autoRunsCalled++ expect(a.y).toBe(a.x + 1) @@ -172,16 +172,16 @@ test("autorunAsync accepts a scheduling function", function(done) { }) test("reaction accepts a scheduling function", function(done) { - var a = m.observable({ + const a = m.observable({ x: 0, y: 1 }) - var autoRunsCalled = 0 - var schedulingsCalled = 0 - var exprCalled = 0 + let autoRunsCalled = 0 + let schedulingsCalled = 0 + let exprCalled = 0 - var values = [] + const values = [] m.reaction( () => { @@ -220,13 +220,13 @@ test("reaction accepts a scheduling function", function(done) { }) test("autorunAsync warns when passed an action", function() { - var action = m.action(() => {}) + const action = m.action(() => {}) expect.assertions(1) expect(() => m.autorun(action)).toThrowError(/Autorun does not accept actions/) }) test("whenWithTimeout should operate normally", done => { - var a = m.observable.box(1) + const a = m.observable.box(1) m.when(() => a.get() === 2, () => done(), { timeout: 500, diff --git a/test/base/babel-tests.js b/test/base/babel-tests.js index e2e557021..c2f7c8bb4 100644 --- a/test/base/babel-tests.js +++ b/test/base/babel-tests.js @@ -36,13 +36,13 @@ test("babel", function() { } } - var box = new Box() - var ar = [] + const box = new Box() + const ar = [] autorun(() => { ar.push(box.width) }) - var s = ar.slice() + let s = ar.slice() expect(s).toEqual([40]) box.height = 10 s = ar.slice() @@ -67,6 +67,7 @@ test("should not be possible to use @action with getters", () => { @action get Test() {} } + A // just to avoid the linter warning }).toThrowError(/@action cannot be used with getters/) mobx._resetGlobalState() @@ -129,7 +130,7 @@ class Order { @observable price = 3 @observable amount = 2 @observable orders = [] - @observable aFunction = function(a) {} + @observable aFunction = function() {} @computed get total() { @@ -138,16 +139,16 @@ class Order { } test("decorators", function() { - var o = new Order() + const o = new Order() expect(isObservableObject(o)).toBe(true) expect(isObservableProp(o, "amount")).toBe(true) expect(o.total).toBe(6) // .... this is required to initialize the props which are made reactive lazily... expect(isObservableProp(o, "total")).toBe(true) - var events = [] - var d1 = observe(o, ev => events.push(ev.name, ev.oldValue)) - var d2 = observe(o, "price", ev => events.push(ev.newValue, ev.oldValue)) - var d3 = observe(o, "total", ev => events.push(ev.newValue, ev.oldValue)) + const events = [] + const d1 = observe(o, ev => events.push(ev.name, ev.oldValue)) + const d2 = observe(o, "price", ev => events.push(ev.newValue, ev.oldValue)) + const d3 = observe(o, "total", ev => events.push(ev.newValue, ev.oldValue)) o.price = 4 @@ -173,11 +174,11 @@ test("issue 191 - shared initializers (babel)", function() { @observable array = [2] } - var t1 = new Test() + const t1 = new Test() t1.obj.a = 2 t1.array.push(3) - var t2 = new Test() + const t2 = new Test() t2.obj.a = 3 t2.array.push(4) @@ -415,6 +416,7 @@ test("267 (babel) should be possible to declare properties observable outside st class Store { @observable timer } + Store // just to avoid linter warning configure({ enforceActions: "never" }) }) @@ -454,12 +456,12 @@ test.skip("observable performance", () => { const objs = [] const start = Date.now() - for (var i = 0; i < AMOUNT; i++) objs.push(new A()) + for (let i = 0; i < AMOUNT; i++) objs.push(new A()) console.log("created in ", Date.now() - start) - for (var j = 0; j < 4; j++) { - for (var i = 0; i < AMOUNT; i++) { + for (let j = 0; j < 4; j++) { + for (let i = 0; i < AMOUNT; i++) { const obj = objs[i] obj.a += 3 obj.b *= 4 @@ -523,7 +525,7 @@ test("inheritance overrides observable", () => { @observable a = 2 } - class B { + class B extends A { @observable a = 5 @observable b = 3 @computed @@ -585,7 +587,7 @@ test("enumerability", () => { // not initialized yet let ownProps = Object.keys(a) let props = [] - for (var key in a) props.push(key) + for (const key in a) props.push(key) expect(ownProps).toEqual([ // should have a, not supported yet in babel... @@ -610,7 +612,7 @@ test("enumerability", () => { ownProps = Object.keys(a) props = [] - for (var key in a) props.push(key) + for (const key in a) props.push(key) expect(ownProps).toEqual([ "a", @@ -649,7 +651,7 @@ test("enumerability - workaround", () => { const ownProps = Object.keys(a) const props = [] - for (var key in a) props.push(key) + for (const key in a) props.push(key) expect(ownProps).toEqual([ "a", @@ -679,7 +681,7 @@ test("issue 285 (babel)", () => { } } - var todo = new Todo("Something to do") + const todo = new Todo("Something to do") expect(toJS(todo)).toEqual({ id: 1, @@ -1087,8 +1089,6 @@ test("actions are reassignable", () => { }) test("it should support asyncAction (babel)", async () => { - const values = [] - mobx.configure({ enforceActions: "observed" }) class X { @@ -1168,7 +1168,6 @@ test("computed setter problem - 2", () => { } } - debugger mobx.decorate(Contact, { fullName: computed({ // This doesn't work diff --git a/test/base/cycles.js b/test/base/cycles.js index 99ae3db34..f18536835 100644 --- a/test/base/cycles.js +++ b/test/base/cycles.js @@ -1,11 +1,11 @@ -var m = require("../../src/mobx.ts") +const m = require("../../src/mobx.ts") test("cascading active state (form 1)", function() { - var Store = function() { + const Store = function() { m.extendObservable(this, { _activeItem: null }) } Store.prototype.activeItem = function(item) { - var _this = this + const _this = this if (arguments.length === 0) return this._activeItem @@ -17,12 +17,12 @@ test("cascading active state (form 1)", function() { }) } - var Item = function() { + const Item = function() { m.extendObservable(this, { isActive: false }) } - var store = new Store() - var item1 = new Item(), + const store = new Store() + const item1 = new Item(), item2 = new Item() expect(store.activeItem()).toBe(null) expect(item1.isActive).toBe(false) @@ -45,8 +45,8 @@ test("cascading active state (form 1)", function() { }) test("cascading active state (form 2)", function() { - var Store = function() { - var _this = this + const Store = function() { + const _this = this m.extendObservable(this, { activeItem: null }) m.autorun(function() { @@ -57,12 +57,12 @@ test("cascading active state (form 2)", function() { }) } - var Item = function() { + const Item = function() { m.extendObservable(this, { isActive: false }) } - var store = new Store() - var item1 = new Item(), + const store = new Store() + const item1 = new Item(), item2 = new Item() expect(store.activeItem).toBe(null) expect(item1.isActive).toBe(false) @@ -85,10 +85,9 @@ test("cascading active state (form 2)", function() { }) test("emulate rendering", function() { - var renderCount = 0 + let renderCount = 0 - var Component = function(props) { - var _this = this + const Component = function(props) { this.props = props } Component.prototype.destroy = function() { @@ -99,7 +98,7 @@ test("emulate rendering", function() { } Component.prototype.render = function() { - var _this = this + const _this = this if (this.handler) { this.handler() @@ -111,9 +110,9 @@ test("emulate rendering", function() { }) } - var data = {} + const data = {} m.extendObservable(data, { title: null }) - var component = new Component({ data: data }) + const component = new Component({ data: data }) expect(renderCount).toBe(0) component.render() @@ -158,7 +157,7 @@ test("efficient selection", function() { }) } - var store = new Store() + const store = new Store() expect(store.selection).toBe(null) expect( diff --git a/test/base/decorate.js b/test/base/decorate.js index 7aea6fe64..e009e306f 100644 --- a/test/base/decorate.js +++ b/test/base/decorate.js @@ -3,19 +3,15 @@ import { observable, computed, - transaction, autorun, - extendObservable, action, isObservableObject, - observe, isObservable, isObservableProp, isComputedProp, spy, isAction, - decorate, - reaction + decorate } from "../../src/mobx" import { serializable, primitive, serialize, deserialize } from "serializr" @@ -59,7 +55,7 @@ test("decorate should work", function() { addSize: action }) - var box = new Box() + const box = new Box() expect(isObservableObject(box)).toBe(true) expect(box.uninitialized).toBe(undefined) expect(box.height).toBe(20) @@ -71,7 +67,7 @@ test("decorate should work", function() { expect(isComputedProp(box, "width")).toBe(true) expect(isAction(box.addSize)).toBe(true) - var ar = [] + const ar = [] autorun(() => { ar.push(box.width) @@ -143,7 +139,7 @@ test("decorate should work with plain object", function() { expect(isComputedProp(box, "width")).toBe(true) expect(isAction(box.addSize)).toBe(true) - var ar = [] + const ar = [] autorun(() => { ar.push(box.width) @@ -213,7 +209,7 @@ test("decorate should work with Object.create", function() { expect(isComputedProp(box, "width")).toBe(true) expect(isAction(box.addSize)).toBe(true) - var ar = [] + const ar = [] autorun(() => { ar.push(box.width) @@ -247,7 +243,7 @@ test("decorate should work with constructor function", function() { enumerable: false, get() { /** @type {Box} */ - var t /** @type {any} */ = this + const t /** @type {any} */ = this return ( // @ts-ignore @@ -293,7 +289,7 @@ test("decorate should work with constructor function", function() { expect(isComputedProp(box, "width")).toBe(true) expect(isAction(box.addSize)).toBe(true) - var ar = [] + const ar = [] autorun(() => { // @ts-ignore diff --git a/test/base/errorhandling.js b/test/base/errorhandling.js index 62217ad30..48be3308f 100644 --- a/test/base/errorhandling.js +++ b/test/base/errorhandling.js @@ -1,21 +1,10 @@ -var mobx = require("../../src/mobx.ts") -var m = mobx -var utils = require("../utils/test-utils") +const mobx = require("../../src/mobx.ts") +const m = mobx +const utils = require("../utils/test-utils") const { observable, computed, $mobx } = mobx -var voidObserver = function() {} - -function buffer() { - var b = [] - var res = function(newValue) { - b.push(newValue) - } - res.toArray = function() { - return b - } - return res -} +const voidObserver = function() {} function checkGlobalState() { const gs = mobx._getGlobalState() @@ -27,7 +16,7 @@ function checkGlobalState() { } test("exception1", function() { - var a = computed(function() { + const a = computed(function() { throw "hoi" }) expect(() => a.get()).toThrow(/hoi/) @@ -35,7 +24,7 @@ test("exception1", function() { }) test("exceptions in computed values can be recovered from", () => { - var a = observable({ + const a = observable({ x: 1, get y() { if (this.x === 2) throw "Uhoh" @@ -56,8 +45,8 @@ test("exceptions in computed values can be recovered from", () => { }) test("exception when starting autorun can be recovered from", () => { - var b = undefined - var a = observable({ + let b = undefined + const a = observable({ x: 2, get y() { if (this.x === 2) throw "Uhoh" @@ -79,8 +68,8 @@ test("exception when starting autorun can be recovered from", () => { }) test("exception in autorun can be recovered from", () => { - var b = undefined - var a = observable({ + let b = undefined + const a = observable({ x: 1, get y() { if (this.x === 2) throw "Uhoh" @@ -88,7 +77,7 @@ test("exception in autorun can be recovered from", () => { } }) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { b = a.y }) expect(a.y).toBe(2) @@ -118,14 +107,14 @@ test("exception in autorun can be recovered from", () => { }) test("multiple autoruns with exceptions are handled correctly", () => { - var a = mobx.observable.box(1) - var values = [] - var d1 = mobx.autorun(() => values.push("a" + a.get())) - var d2 = mobx.autorun(() => { + const a = mobx.observable.box(1) + const values = [] + const d1 = mobx.autorun(() => values.push("a" + a.get())) + const d2 = mobx.autorun(() => { if (a.get() === 2) throw /Uhoh/ values.push("b" + a.get()) }) - var d3 = mobx.autorun(() => values.push("c" + a.get())) + const d3 = mobx.autorun(() => values.push("c" + a.get())) expect(values).toEqual(["a1", "b1", "c1"]) values.splice(0) @@ -146,9 +135,9 @@ test("multiple autoruns with exceptions are handled correctly", () => { }) test("deny state changes in views", function() { - var x = observable.box(3) - var z = observable.box(5) - var y = computed(function() { + const x = observable.box(3) + const z = observable.box(5) + const y = computed(function() { z.set(6) return x.get() * x.get() }) @@ -166,8 +155,8 @@ test("deny state changes in views", function() { }) test("allow state changes in autorun", function() { - var x = observable.box(3) - var z = observable.box(3) + const x = observable.box(3) + const z = observable.box(3) m.autorun(function() { if (x.get() !== 3) z.set(x.get()) @@ -186,9 +175,9 @@ test("allow state changes in autorun", function() { }) test("deny array change in view", function(done) { - var x = observable.box(3) - var z = observable([]) - var y = computed(function() { + const x = observable.box(3) + const z = observable([]) + const y = computed(function() { z.push(3) return x.get() * x.get() }) @@ -210,9 +199,9 @@ test("deny array change in view", function(done) { }) test("allow array change in autorun", function() { - var x = observable.box(3) - var z = observable([]) - var y = m.autorun(function() { + const x = observable.box(3) + const z = observable([]) + m.autorun(function() { if (x.get() > 4) z.push(x.get()) }) @@ -227,8 +216,8 @@ test("allow array change in autorun", function() { }) test("throw error if modification loop", function() { - var x = observable.box(3) - var dis = m.autorun(function() { + const x = observable.box(3) + m.autorun(function() { x.set(x.get() + 1) // is allowed to throw, but doesn't as the observables aren't bound yet during first execution }) utils.consoleError(() => { @@ -238,7 +227,7 @@ test("throw error if modification loop", function() { }) test("cycle1", function() { - var p = computed(function() { + const p = computed(function() { return p.get() * 2 }) // thats a cycle! utils.consoleError(() => { @@ -248,10 +237,10 @@ test("cycle1", function() { }) test("cycle2", function() { - var a = computed(function() { + const a = computed(function() { return b.get() * 2 }) - var b = computed(function() { + const b = computed(function() { return a.get() * 2 }) expect(() => { @@ -261,7 +250,7 @@ test("cycle2", function() { }) test("cycle3", function() { - var p = computed(function() { + const p = computed(function() { return p.get() * 2 }) expect(() => { @@ -271,11 +260,11 @@ test("cycle3", function() { }) test("cycle4", function() { - var z = observable.box(true) - var a = computed(function() { + const z = observable.box(true) + const a = computed(function() { return z.get() ? 1 : b.get() * 2 }) - var b = computed(function() { + const b = computed(function() { return a.get() * 2 }) @@ -289,13 +278,13 @@ test("cycle4", function() { }) test("throws when the max iterations over reactions are done", () => { - var foo = mobx.observable({ + const foo = mobx.observable({ a: 1 }) mobx.autorun( () => { - var x = foo.a + foo.a foo.a = Math.random() }, { name: "bar" } @@ -310,13 +299,13 @@ test("throws when the max iterations over reactions are done", () => { test("issue 86, converging cycles", function() { function findIndex(arr, predicate) { - for (var i = 0, l = arr.length; i < l; i++) if (predicate(arr[i]) === true) return i + for (let i = 0, l = arr.length; i < l; i++) if (predicate(arr[i]) === true) return i return -1 } const deleteThisId = mobx.observable.box(1) const state = mobx.observable({ someArray: [] }) - var calcs = 0 + let calcs = 0 state.someArray.push({ id: 1, text: "I am 1" }) state.someArray.push({ id: 2, text: "I am 2" }) @@ -339,8 +328,8 @@ test("issue 86, converging cycles", function() { }) test("slow converging cycle", function() { - var x = mobx.observable.box(1) - var res = -1 + const x = mobx.observable.box(1) + let res = -1 mobx.autorun(() => { if (x.get() === 100) res = x.get() else x.set(x.get() + 1) @@ -362,12 +351,12 @@ test("slow converging cycle", function() { }) test("error handling assistence ", function(done) { - var baseError = console.error - var baseWarn = console.warn - var errors = [] // logged errors - var warns = [] // logged warns - var values = [] // produced errors - var thrown = [] // list of actually thrown exceptons + const baseError = console.error + const baseWarn = console.warn + const errors = [] // logged errors + const warns = [] // logged warns + const values = [] // produced errors + const thrown = [] // list of actually thrown exceptons console.error = function(msg) { errors.push(msg) @@ -376,13 +365,13 @@ test("error handling assistence ", function(done) { warns.push(msg) } - var a = observable.box(3) - var b = computed(function() { + const a = observable.box(3) + const b = computed(function() { if (a.get() === 42) throw "should not be 42" return a.get() * 2 }) - var c = m.autorun(function() { + m.autorun(function() { values.push(b.get()) }) @@ -417,7 +406,7 @@ test("error handling assistence ", function(done) { }) test("236 - cycles", () => { - var Parent = function() { + const Parent = function() { m.extendObservable(this, { children: [], get total0() { @@ -437,7 +426,7 @@ test("236 - cycles", () => { }) } - var Child = function(parent, kind) { + const Child = function(parent, kind) { this.parent = parent m.extendObservable(this, { kind: kind, @@ -457,8 +446,8 @@ test("236 - cycles", () => { parent.children.push(new Child(parent, 0)) parent.children.push(new Child(parent, 0)) - var msg = [] - var d = m.autorun(() => { + const msg = [] + m.autorun(() => { msg.push("total0:", parent.total0, "total1:", parent.total1) }) // So far, so good: total0: 9 total1: 0 @@ -504,7 +493,7 @@ test("peeking inside erroring computed value doesn't bork (global) state", () => }) describe("peeking inside autorun doesn't bork (global) state", () => { - var r = -1 + let r = -1 const a = mobx.observable.box(1) const b = mobx.computed(() => { const res = (r = a.get()) @@ -737,10 +726,10 @@ test("global error handling will be skipped when using disableErrorBoundaries - utils.supressConsole(() => { mobx.configure({ disableErrorBoundaries: true }) try { - const a = mobx.observable.box(1) + mobx.observable.box(1) expect(() => { - const d = mobx.autorun(function() { + mobx.autorun(function() { throw "OOPS" }) }).toThrowError(/OOPS/) @@ -780,7 +769,7 @@ test("error in effect of when is properly cleaned up", () => { const b = mobx.observable.box(1) utils.supressConsole(() => { - const d = mobx.when( + mobx.when( () => b.get() === 2, () => { throw "OOPS" diff --git a/test/base/extras.js b/test/base/extras.js index e5c48b7e8..c54bdf60f 100644 --- a/test/base/extras.js +++ b/test/base/extras.js @@ -6,23 +6,23 @@ const { $mobx } = mobx test("treeD", function() { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 - var a = m.observable.box(3) - var aName = "ObservableValue@1" + const a = m.observable.box(3) + const aName = "ObservableValue@1" - var dtree = m.getDependencyTree + const dtree = m.getDependencyTree expect(dtree(a)).toEqual({ name: aName }) - var b = m.computed(() => a.get() * a.get()) - var bName = "ComputedValue@3" + const b = m.computed(() => a.get() * a.get()) + const bName = "ComputedValue@3" expect(dtree(b)).toEqual({ name: bName // no dependencies yet, since it isn't observed yet }) - var c = m.autorun(() => b.get()) - var cName = "Autorun@4" + const c = m.autorun(() => b.get()) + const cName = "Autorun@4" expect(dtree(c[$mobx])).toEqual({ name: cName, dependencies: [ @@ -54,8 +54,8 @@ test("treeD", function() { ] }) - var x = mobx.observable.map({ temperature: 0 }) - var d = mobx.autorun(function() { + const x = mobx.observable.map({ temperature: 0 }) + const d = mobx.autorun(function() { Array.from(x.keys()) if (x.has("temperature")) x.get("temperature") x.has("absent") @@ -84,7 +84,7 @@ test("names", function() { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 - var struct = { + const struct = { x: "ObservableValue@1", y: { z: 7 @@ -97,7 +97,7 @@ test("names", function() { ] } - var rstruct = m.observable(struct) + const rstruct = m.observable(struct) m.extendObservable(rstruct.y, { a: { b: 2 } }) rstruct.ar.push({ b: 2 }) rstruct.ar.push([]) @@ -110,7 +110,7 @@ test("names", function() { expect(rstruct.y.a[$mobx].values.get("b").name).toBe("ObservableObject@1.y.a.b") expect(rstruct.ar[2][$mobx].values.get("b").name).toBe("ObservableObject@1.ar[..].b") - var d = m.autorun(function() {}) + const d = m.autorun(function() {}) expect(d[$mobx].name).toBeTruthy() expect(m.autorun(function namedFunction() {})[$mobx].name).toBe("namedFunction") @@ -125,7 +125,7 @@ test("names", function() { }) } - var task = new Task() + const task = new Task() expect(task[$mobx].name).toBe("Task@8") expect(task[$mobx].values.get("title").name).toBe("Task@8.title") }) @@ -142,16 +142,16 @@ function stripTrackerOutput(output) { test("spy 1", function() { m._resetGlobalState() - var lines = [] + const lines = [] - var a = m.observable.box(3) - var b = m.computed(function() { + const a = m.observable.box(3) + const b = m.computed(function() { return a.get() * 2 }) - var c = m.autorun(function() { + m.autorun(function() { b.get() }) - var stop = m.spy(function(line) { + const stop = m.spy(function(line) { lines.push(line) }) @@ -171,21 +171,21 @@ test("get atom", function() { }) } - var a = mobx.observable.box(3) - var b = mobx.observable({ a: 3 }) - var c = mobx.observable.map({ a: 3 }) - var d = mobx.observable([1, 2]) - var e = mobx.computed(() => 3) - var f = mobx.autorun(() => c.has("b")) - var g = new Clazz() + const a = mobx.observable.box(3) + const b = mobx.observable({ a: 3 }) + const c = mobx.observable.map({ a: 3 }) + const d = mobx.observable([1, 2]) + const e = mobx.computed(() => 3) + const f = mobx.autorun(() => c.has("b")) + const g = new Clazz() function atom(thing, prop) { return mobx.getAtom(thing, prop).constructor.name } - var ovClassName = mobx.observable.box(3).constructor.name - var atomClassName = mobx.createAtom("test").constructor.name - var reactionClassName = mobx.Reaction.name + const ovClassName = mobx.observable.box(3).constructor.name + const atomClassName = mobx.createAtom("test").constructor.name + // const reactionClassName = mobx.Reaction.name expect(atom(a)).toBe(ovClassName) @@ -224,14 +224,14 @@ test("get debug name", function() { }) } - var a = mobx.observable.box(3) - var b = mobx.observable({ a: 3 }) - var c = mobx.observable.map({ a: 3 }) - var d = mobx.observable([1, 2]) - var e = mobx.computed(() => 3) - var f = mobx.autorun(() => c.has("b")) - var g = new Clazz() - var h = mobx.observable({ b: function() {}, c() {} }) + const a = mobx.observable.box(3) + const b = mobx.observable({ a: 3 }) + const c = mobx.observable.map({ a: 3 }) + const d = mobx.observable([1, 2]) + const e = mobx.computed(() => 3) + const f = mobx.autorun(() => c.has("b")) + const g = new Clazz() + const h = mobx.observable({ b: function() {}, c() {} }) function name(thing, prop) { return mobx.getDebugName(thing, prop) @@ -276,13 +276,13 @@ test("get administration", function() { }) } - var a = mobx.observable.box(3) - var b = mobx.observable({ a: 3 }) - var c = mobx.observable.map({ a: 3 }) - var d = mobx.observable([1, 2]) - var e = mobx.computed(() => 3) - var f = mobx.autorun(() => c.has("b")) - var g = new Clazz() + const a = mobx.observable.box(3) + const b = mobx.observable({ a: 3 }) + const c = mobx.observable.map({ a: 3 }) + const d = mobx.observable([1, 2]) + const e = mobx.computed(() => 3) + const f = mobx.autorun(() => c.has("b")) + const g = new Clazz() const h = {} mobx.extendObservable(h, { a: 3 }) @@ -290,8 +290,8 @@ test("get administration", function() { return mobx._getAdministration(thing, prop).constructor.name } - var ovClassName = mobx.observable.box(3).constructor.name - var mapClassName = mobx.observable.map().constructor.name + const ovClassName = mobx.observable.box(3).constructor.name + const mapClassName = mobx.observable.map().constructor.name expect(adm(a)).toBe(ovClassName) @@ -327,10 +327,10 @@ test("onBecome(Un)Observed simple", () => { const x = mobx.observable.box(3) const events = [] - const d1 = mobx.onBecomeObserved(x, () => { + mobx.onBecomeObserved(x, () => { events.push("x observed") }) - const d2 = mobx.onBecomeUnobserved(x, () => { + mobx.onBecomeUnobserved(x, () => { events.push("x unobserved") }) @@ -405,7 +405,7 @@ test("onBecomeObserved correctly disposes second listener #1537", () => { const d1 = mobx.onBecomeObserved(x, "a", () => { events.push("a observed") }) - const d2 = mobx.onBecomeObserved(x, "b", () => { + mobx.onBecomeObserved(x, "b", () => { events.push("b observed") }) d1() @@ -429,7 +429,7 @@ test("onBecomeObserved correctly disposes second listener #1537", () => { expect(events.length).toBe(1) expect(events).toEqual(["b observed"]) d2() - const d4 = mobx.reaction(() => x.get(), () => {}) + mobx.reaction(() => x.get(), () => {}) expect(events).toEqual(["b observed"]) }) @@ -448,7 +448,7 @@ test("onBecomeUnobserved correctly disposes second listener #1537", () => { expect(events.length).toBe(1) expect(events).toEqual(["b unobserved"]) d2() - const d4 = mobx.reaction(() => x.get(), () => {}) + mobx.reaction(() => x.get(), () => {}) expect(events).toEqual(["b unobserved"]) }) diff --git a/test/base/flow.js b/test/base/flow.js index cdcd6e8c1..7e7480f11 100644 --- a/test/base/flow.js +++ b/test/base/flow.js @@ -63,35 +63,32 @@ test("it should support try catch in async generator", done => { }) test("it should support throw from async generator", done => { - mobx - .flow(function*() { - throw 7 - })() - .then( - () => { - done.fail("should fail") - }, - e => { - expect(e).toBe(7) - done() - } - ) + mobx.flow(function*() { + yield "a" + throw 7 + })().then( + () => { + done.fail("should fail") + }, + e => { + expect(e).toBe(7) + done() + } + ) }) test("it should support throw from yielded promise generator", done => { - mobx - .flow(function*() { - return yield delay(10, 7, true) - })() - .then( - () => { - done.fail("should fail") - }, - e => { - expect(e).toBe(7) - done() - } - ) + mobx.flow(function*() { + return yield delay(10, 7, true) + })().then( + () => { + done.fail("should fail") + }, + e => { + expect(e).toBe(7) + done() + } + ) }) test("it should support asyncAction in classes", done => { @@ -200,7 +197,7 @@ test("flows can be cancelled - 2 - finally clauses are run", done => { }) const promise = start() promise.then( - res => { + () => { fail() }, err => { @@ -224,6 +221,7 @@ test("flows can be cancelled - 3 - throw in finally should be catched", done => counter.counter = 15 } finally { counter.counter = 4 + // eslint-disable-next-line no-unsafe-finally throw "OOPS" } }) @@ -263,9 +261,8 @@ test("flows can be cancelled - 4 - pending Promise will be ignored", done => { }) test("flows can be cancelled - 5 - return before cancel", done => { - let steps = 0 + // eslint-disable-next-line require-yield const start = flow(function*() { - steps = 1 return Promise.resolve(2) // cancel will be to late.. }) @@ -274,7 +271,7 @@ test("flows can be cancelled - 5 - return before cancel", done => { value => { expect(value).toBe(2), done() }, - err => { + () => { fail() } ) @@ -319,7 +316,6 @@ test("flows can be cancelled - 5 - flows cancel recursively", done => { }) test("flows yield anything", async () => { - let steps = 0 const start = flow(function*() { const x = yield 2 return x @@ -336,6 +332,7 @@ test("cancelled flow should not result in runaway reject", async () => { return x } finally { yield Promise.reject("Oh noes") + // eslint-disable-next-line no-unsafe-finally return 4 } }) diff --git a/test/base/intercept.js b/test/base/intercept.js index f7c267b86..c13843c93 100644 --- a/test/base/intercept.js +++ b/test/base/intercept.js @@ -1,10 +1,10 @@ -var m = require("../../src/mobx.ts") -var intercept = m.intercept +const m = require("../../src/mobx.ts") +const intercept = m.intercept test("intercept observable value", () => { - var a = m.observable.box(1) + const a = m.observable.box(1) - var d = intercept(a, () => { + let d = intercept(a, () => { return null }) @@ -41,7 +41,7 @@ test("intercept observable value", () => { a.set(6) expect(a.get()).toBe(12) - var d2 = intercept(a, c => { + intercept(a, c => { c.newValue += 1 return c }) @@ -55,9 +55,9 @@ test("intercept observable value", () => { }) test("intercept array", () => { - var a = m.observable([1, 2]) + const a = m.observable([1, 2]) - var d = a.intercept(c => null) + let d = a.intercept(() => null) a.push(2) expect(a.slice()).toEqual([1, 2]) @@ -82,11 +82,11 @@ test("intercept array", () => { }) test("intercept object", () => { - var a = m.observable({ + const a = m.observable({ b: 3 }) - var d = intercept(a, change => { + intercept(a, change => { change.newValue *= 3 return change }) @@ -95,7 +95,7 @@ test("intercept object", () => { expect(a.b).toBe(12) - var d2 = intercept(a, "b", change => { + intercept(a, "b", change => { change.newValue += 1 return change }) @@ -103,7 +103,7 @@ test("intercept object", () => { a.b = 5 expect(a.b).toBe(16) - var d3 = intercept(a, c => { + const d3 = intercept(a, c => { expect(c.name).toBe("b") expect(c.object).toBe(a) expect(c.type).toBe("update") @@ -119,8 +119,8 @@ test("intercept object", () => { }) test("intercept property additions", () => { - var a = m.observable({}) - var d4 = intercept(a, change => { + const a = m.observable({}) + const d4 = intercept(a, change => { if (change.type === "add") { return null } @@ -139,11 +139,11 @@ test("intercept property additions", () => { }) test("intercept map", () => { - var a = m.observable.map({ + const a = m.observable.map({ b: 3 }) - var d = intercept(a, c => { + intercept(a, c => { c.newValue *= 3 return c }) @@ -152,7 +152,7 @@ test("intercept map", () => { expect(a.get("b")).toBe(12) - var d2 = intercept(a, "b", c => { + intercept(a, "b", c => { c.newValue += 1 return c }) @@ -160,7 +160,7 @@ test("intercept map", () => { a.set("b", 5) expect(a.get("b")).toBe(16) - var d3 = intercept(a, c => { + const d3 = intercept(a, c => { expect(c.name).toBe("b"), expect(c.object).toBe(a) expect(c.type).toBe("update") return null @@ -173,7 +173,7 @@ test("intercept map", () => { a.set("b", 7) expect(a.get("b")).toBe(22) - var d4 = intercept(a, c => { + const d4 = intercept(a, c => { if (c.type === "delete") return null return c }) diff --git a/test/base/makereactive.js b/test/base/makereactive.js index cd8eee95f..a301a5c08 100644 --- a/test/base/makereactive.js +++ b/test/base/makereactive.js @@ -1,13 +1,10 @@ -var mobx = require("../../src/mobx.ts") -var m = mobx -var o = mobx.observable - -var value = mobx.value -var voidObserver = function() {} +const mobx = require("../../src/mobx.ts") +const m = mobx +const o = mobx.observable function buffer() { - var b = [] - var res = function(x) { + const b = [] + const res = function(x) { b.push(x) } res.toArray = function() { @@ -17,7 +14,7 @@ function buffer() { } test("isObservable", function() { - function Order(price) {} + function Order() {} function ReactiveOrder(price) { m.extendObservable(this, { @@ -42,7 +39,7 @@ test("isObservable", function() { expect(m.isObservable(new ReactiveOrder())).toBe(true) expect(m.isObservable(m.observable.box(3))).toBe(true) - var obj = {} + const obj = {} expect(m.isObservable(obj)).toBe(false) expect(m.isObservable(m.observable.box(function() {}))).toBe(true) @@ -74,14 +71,14 @@ test("observable1", function() { m._resetGlobalState() // recursive structure - var x = m.observable({ + const x = m.observable({ a: { b: { c: 3 } } }) - var b = buffer() + const b = buffer() m.autorun(function() { b(x.a.b.c) }) @@ -91,7 +88,7 @@ test("observable1", function() { // recursive structure, but asReference passed in expect(m.isObservable(x.a.b)).toBe(true) - var x2 = m.observable.object( + const x2 = m.observable.object( { a: { b: { @@ -108,7 +105,7 @@ test("observable1", function() { expect(m.isObservable(x2.a)).toBe(false) expect(m.isObservable(x2.a.b)).toBe(false) - var b2 = buffer() + const b2 = buffer() m.autorun(function() { b2(x2.a.b.c) }) @@ -117,7 +114,7 @@ test("observable1", function() { expect(b2.toArray()).toEqual([3, 4]) // non recursive structure - var x3 = o.object( + const x3 = o.object( { a: { b: { @@ -128,7 +125,7 @@ test("observable1", function() { {}, { deep: false } ) - var b3 = buffer() + const b3 = buffer() m.autorun(function() { b3(x3.a.b.c) }) @@ -142,11 +139,11 @@ test("observable3", function() { this.price = price } - var x = m.observable({ + const x = m.observable({ orders: [new Order(1), new Order(2)] }) - var b = buffer() + const b = buffer() m.autorun(function() { b(x.orders.length) }) @@ -161,9 +158,9 @@ test("observable3", function() { }) test("observable4", function() { - var x = m.observable([{ x: 1 }, { x: 2 }]) + const x = m.observable([{ x: 1 }, { x: 2 }]) - var b = buffer() + const b = buffer() m.observe( m.computed(function() { return x.map(function(d) { @@ -180,9 +177,9 @@ test("observable4", function() { expect(b.toArray()).toEqual([[1, 2], [3, 2], [2], [2, 5]]) // non recursive - var x2 = o.array([{ x: 1 }, { x: 2 }], { deep: false }) + const x2 = o.array([{ x: 1 }, { x: 2 }], { deep: false }) - var b2 = buffer() + const b2 = buffer() m.observe( m.computed(function() { return x2.map(function(d) { @@ -200,20 +197,20 @@ test("observable4", function() { }) test("observable5", function() { - var x = m.computed(function() {}) + let x = m.computed(function() {}) expect(function() { x.set(7) // set not allowed }).toThrow(/It is not possible to assign a new value to a computed value/) - var f = function() {} - var x2 = m.observable.box(f) + let f = function() {} + const x2 = m.observable.box(f) expect(x2.get()).toBe(f) x2.set(null) // allowed f = function() { return this.price } - var x = m.observable({ + x = m.observable({ price: 17, get reactive() { return this.price @@ -221,13 +218,13 @@ test("observable5", function() { nonReactive: f }) - var b = buffer() + const b = buffer() m.autorun(function() { b([x.reactive, x.nonReactive, x.nonReactive()]) }) x.price = 18 - var three = function() { + const three = function() { return 3 } x.nonReactive = three @@ -235,7 +232,7 @@ test("observable5", function() { }) test("flat array", function() { - var x = m.observable.object( + const x = m.observable.object( { x: [ { @@ -246,9 +243,9 @@ test("flat array", function() { { x: m.observable.shallow } ) - var result - var updates = 0 - var dis = m.autorun(function() { + let result + let updates = 0 + m.autorun(function() { updates++ result = JSON.stringify(mobx.toJS(x)) }) @@ -274,7 +271,7 @@ test("flat array", function() { }) test("flat object", function() { - var y = m.observable.object( + const y = m.observable.object( { x: { z: 3 } }, @@ -282,9 +279,9 @@ test("flat object", function() { { deep: false } ) - var result - var updates = 0 - var dis = m.autorun(function() { + let result + let updates = 0 + m.autorun(function() { updates++ result = JSON.stringify(mobx.toJS(y)) }) @@ -306,7 +303,7 @@ test("flat object", function() { }) test("as structure", function() { - var x = m.observable.object( + const x = m.observable.object( { x: null }, @@ -315,8 +312,8 @@ test("as structure", function() { } ) - var changed = 0 - var dis = m.autorun(function() { + let changed = 0 + const dis = m.autorun(function() { changed++ JSON.stringify(x) }) @@ -402,7 +399,7 @@ test("as structure", function() { }) test("as structure view", function() { - var x = m.observable.object( + const x = m.observable.object( { a: 1, aa: 1, @@ -420,15 +417,15 @@ test("as structure view", function() { } ) - var bc = 0 - var bo = m.autorun(function() { + let bc = 0 + m.autorun(function() { x.b bc++ }) expect(bc).toBe(1) - var cc = 0 - var co = m.autorun(function() { + let cc = 0 + m.autorun(function() { x.c cc++ }) @@ -449,7 +446,7 @@ test("as structure view", function() { // which is not unfixiable in itself, // but definitely a pattern we don't want to encourage test("ES5 non reactive props", function() { - var te = m.observable({}) + let te = m.observable({}) Object.defineProperty(te, "nonConfigurable", { enumerable: true, configurable: false, @@ -458,7 +455,7 @@ test("ES5 non reactive props", function() { }) // should throw if trying to reconfigure an existing non-configurable prop expect(function() { - const a = m.extendObservable(te2, { notConfigurable: 1 }) + m.extendObservable(te2, { notConfigurable: 1 }) }).toThrow(/'extendObservable' expects an object as first argument/) // should skip non-configurable / writable props when using `observable` expect(() => { @@ -469,7 +466,7 @@ test("ES5 non reactive props", function() { const d1 = Object.getOwnPropertyDescriptor(te, "nonConfigurable") expect(d1.value).toBe("static") - var te2 = m.observable({}) + const te2 = m.observable({}) Object.defineProperty(te2, "notWritable", { enumerable: true, configurable: true, @@ -478,7 +475,7 @@ test("ES5 non reactive props", function() { }) // should throw if trying to reconfigure an existing non-writable prop expect(function() { - const a = m.set(te2, { notWritable: 1 }) + m.set(te2, { notWritable: 1 }) }).toThrow(/Cannot make property 'notWritable' observable/) const d2 = Object.getOwnPropertyDescriptor(te2, "notWritable") expect(d2.value).toBe("static") @@ -488,7 +485,7 @@ test("ES5 non reactive props", function() { }) test("ES5 non reactive props - 2", function() { - var te = {} + const te = {} Object.defineProperty(te, "nonConfigurable", { enumerable: true, configurable: false, @@ -512,11 +509,11 @@ test("540 - extendobservable should not report cycles", function() { /Cannot make the designated object observable/ ) - var objWrapper = mobx.observable({ + const objWrapper = mobx.observable({ value: null }) - var obj = { + const obj = { name: "Hello" } @@ -540,7 +537,7 @@ test("mobx 3", () => { test("computed value", () => { mobx._getGlobalState().mobxGuid = 0 - var c = mobx.computed(() => 3) + const c = mobx.computed(() => 3) expect(c.toJSON()).toBe(3) expect(mobx.isComputed(c)).toBe(true) @@ -548,7 +545,7 @@ test("computed value", () => { }) test("boxed value json", () => { - var a = mobx.observable.box({ x: 1 }) + const a = mobx.observable.box({ x: 1 }) expect(a.get().x).toEqual(1) a.set(3) expect(a.get()).toEqual(3) @@ -557,7 +554,7 @@ test("boxed value json", () => { }) test("computed value scope", () => { - var a = mobx.observable({ + const a = mobx.observable({ x: 1, get y() { return this.x * 2 @@ -575,7 +572,7 @@ test("computed value scope", () => { }) test("shallow array", () => { - var a = mobx.observable.array([], { deep: false }) + const a = mobx.observable.array([], { deep: false }) a.push({ x: 1 }, [], 2, mobx.observable({ y: 3 })) expect(mobx.isObservable(a)).toBe(true) @@ -586,7 +583,7 @@ test("shallow array", () => { }) test("761 - deeply nested modifiers work", () => { - var a = {} + const a = {} mobx.extendObservable(a, { someKey: mobx.observable.object( { @@ -615,7 +612,7 @@ test("761 - deeply nested modifiers work", () => { }) test("compare structurally, ref", () => { - var a = mobx.observable.object( + const a = mobx.observable.object( { x: undefined }, @@ -624,8 +621,8 @@ test("compare structurally, ref", () => { } ) - var changed = 0 - var d = mobx.autorun(() => { + let changed = 0 + const d = mobx.autorun(() => { mobx.toJS(a) changed++ }) @@ -730,7 +727,6 @@ test("jest object equals issue - reference", () => { } const store = new Store() - debugger expect(store).toEqual(new Store()) }) diff --git a/test/base/map.js b/test/base/map.js index 61ebbba66..3b81a725c 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -1,15 +1,15 @@ "use strict" -var mobx = require("../../src/mobx.ts") -var map = mobx.observable.map -var autorun = mobx.autorun -var iterall = require("iterall") +const mobx = require("../../src/mobx.ts") +const map = mobx.observable.map +const autorun = mobx.autorun +const iterall = require("iterall") test("map crud", function() { mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? - var events = [] - var m = map({ "1": "a" }) + const events = [] + const m = map({ "1": "a" }) m.observe(function(changes) { events.push(changes) }) @@ -26,7 +26,7 @@ test("map crud", function() { expect(m.get("1")).toBe("aa") expect(m.get(1)).toBe("b") - var k = ["arr"] + const k = ["arr"] m.set(k, "arrVal") expect(m.has(k)).toBe(true) expect(m.get(k)).toBe("arrVal") @@ -74,17 +74,17 @@ test("map crud", function() { }) test("map merge", function() { - var a = map({ a: 1, b: 2, c: 2 }) - var b = map({ c: 3, d: 4 }) + const a = map({ a: 1, b: 2, c: 2 }) + const b = map({ c: 3, d: 4 }) a.merge(b) expect(a.toJSON()).toEqual({ a: 1, b: 2, c: 3, d: 4 }) }) test("observe value", function() { - var a = map() - var hasX = false - var valueX = undefined - var valueY = undefined + const a = map() + let hasX = false + let valueX = undefined + let valueY = undefined autorun(function() { hasX = a.has("x") @@ -130,14 +130,14 @@ test("observe value", function() { test("initialize with entries", function() { const thing = [{ x: 3 }] - var a = map([["a", 1], [thing, 2]]) + const a = map([["a", 1], [thing, 2]]) expect(Array.from(a)).toEqual([["a", 1], [thing, 2]]) }) test("initialize with empty value", function() { - var a = map() - var b = map({}) - var c = map([]) + const a = map() + const b = map({}) + const c = map([]) a.set("0", 0) b.set("0", 0) @@ -149,8 +149,8 @@ test("initialize with empty value", function() { }) test("observe collections", function() { - var x = map() - var keys, values, entries + const x = map() + let keys, values, entries autorun(function() { keys = mobx.keys(x) @@ -197,14 +197,14 @@ test("observe collections", function() { }) test("cleanup", function() { - var x = map({ a: 1 }) + const x = map({ a: 1 }) - var aValue - var disposer = autorun(function() { + let aValue + const disposer = autorun(function() { aValue = x.get("a") }) - var observable = x._data.get("a") + let observable = x._data.get("a") expect(aValue).toBe(1) expect(observable.observers.size).toBe(1) @@ -231,14 +231,14 @@ test("cleanup", function() { }) test("strict", function() { - var x = map() + const x = map() autorun(function() { x.get("y") // should not throw }) }) test("issue 100", function() { - var that = {} + const that = {} mobx.extendObservable(that, { myMap: map() }) @@ -247,8 +247,8 @@ test("issue 100", function() { }) test("issue 119 - unobserve before delete", function() { - var propValues = [] - var myObservable = mobx.observable({ + const propValues = [] + const myObservable = mobx.observable({ myMap: map() }) myObservable.myMap.set("myId", { @@ -271,7 +271,7 @@ test("issue 119 - unobserve before delete", function() { }) test("issue 116 - has should not throw on invalid keys", function() { - var x = map() + const x = map() expect(x.has(undefined)).toBe(false) expect(x.has({})).toBe(false) expect(x.get({})).toBe(undefined) @@ -279,7 +279,7 @@ test("issue 116 - has should not throw on invalid keys", function() { }) test("map modifier", () => { - var x = mobx.observable.map({ a: 1 }) + let x = mobx.observable.map({ a: 1 }) expect(mobx.isObservableMap(x)).toBe(true) expect(x.get("a")).toBe(1) x.set("b", {}) @@ -299,7 +299,7 @@ test("map modifier", () => { }) test("map modifier with modifier", () => { - var x = mobx.observable.map({ a: { c: 3 } }) + let x = mobx.observable.map({ a: { c: 3 } }) expect(mobx.isObservableObject(x.get("a"))).toBe(true) x.set("b", { d: 4 }) expect(mobx.isObservableObject(x.get("b"))).toBe(true) @@ -318,9 +318,9 @@ test("map modifier with modifier", () => { }) test("256, map.clear should not be tracked", () => { - var x = mobx.observable.map({ a: 3 }) - var c = 0 - var d = mobx.autorun(() => { + const x = mobx.observable.map({ a: 3 }) + let c = 0 + const d = mobx.autorun(() => { c++ x.clear() }) @@ -333,11 +333,11 @@ test("256, map.clear should not be tracked", () => { }) test("256, map.merge should be not be tracked for target", () => { - var x = mobx.observable.map({ a: 3 }) - var y = mobx.observable.map({ b: 3 }) - var c = 0 + const x = mobx.observable.map({ a: 3 }) + const y = mobx.observable.map({ b: 3 }) + let c = 0 - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { c++ x.merge(y) }) @@ -357,7 +357,7 @@ test("256, map.merge should be not be tracked for target", () => { }) test("308, map keys should be coerced to strings correctly", () => { - var m = mobx.observable.map() + const m = mobx.observable.map() m.set(1, true) m.delete(1) expect(mobx.keys(m)).toEqual([]) @@ -384,12 +384,13 @@ test("308, map keys should be coerced to strings correctly", () => { }) test("map should support iterall / iterable ", () => { - var a = mobx.observable.map({ a: 1, b: 2 }) + const a = mobx.observable.map({ a: 1, b: 2 }) function leech(iter) { - var values = [] + const values = [] + let v do { - var v = iter.next() + v = iter.next() if (!v.done) values.push(v.value) } while (!v.done) return values @@ -406,30 +407,30 @@ test("map should support iterall / iterable ", () => { }) test("support for ES6 Map", () => { - var x = new Map() + const x = new Map() x.set("x", 3) x.set("y", 2) - var m = mobx.observable(x) + const m = mobx.observable(x) expect(mobx.isObservableMap(m)).toBe(true) expect(Array.from(m)).toEqual([["x", 3], ["y", 2]]) - var x2 = new Map() + const x2 = new Map() x2.set("y", 4) x2.set("z", 5) m.merge(x2) expect(m.get("z")).toEqual(5) - var x3 = new Map() + const x3 = new Map() x3.set({ y: 2 }, { z: 4 }) }) test("deepEqual map", () => { - var x = new Map() + const x = new Map() x.set("x", 3) x.set("y", { z: 2 }) - var x2 = mobx.observable.map() + const x2 = mobx.observable.map() x2.set("x", 3) x2.set("y", { z: 3 }) @@ -449,8 +450,8 @@ test("798, cannot return observable map from computed prop", () => { // MWE: this is an anti pattern, yet should be possible in certain cases nonetheless..? // https://jsfiddle.net/7e6Ltscr/ - const form = function(settings) { - var form = mobx.observable({ + const form = function() { + const form = mobx.observable({ reactPropsMap: mobx.observable.map({ onSubmit: function() {} }), @@ -465,7 +466,7 @@ test("798, cannot return observable map from computed prop", () => { } const customerSearchStore = function() { - var customerSearchStore = mobx.observable({ + const customerSearchStore = mobx.observable({ customerType: "RUBY", searchTypeFormStore() { return form(customerSearchStore.customerType) @@ -476,16 +477,16 @@ test("798, cannot return observable map from computed prop", () => { }) return customerSearchStore } - var cs = customerSearchStore() + const cs = customerSearchStore() expect(() => { - const x = Object.assign({}, cs.customerSearchType) + Object.assign({}, cs.customerSearchType) // console.log(x) }).not.toThrow() }) test("869, deeply observable map should make added items observables as well", () => { - var store = { + const store = { map_deep1: mobx.observable(new Map()), map_deep2: mobx.observable.map() } @@ -503,7 +504,7 @@ test("869, deeply observable map should make added items observables as well", ( }) test("using deep map", () => { - var store = { + const store = { map_deep: mobx.observable(new Map()) } @@ -511,7 +512,7 @@ test("using deep map", () => { let observed = -1 mobx.autorun(function() { // Use the map, to observe all changes - var _ = mobx.toJS(store.map_deep) + mobx.toJS(store.map_deep) observed++ }) @@ -561,7 +562,6 @@ test("issue 1243, .replace should not trigger change on unchanged values", () => const m = mobx.observable.map({ a: 1, b: 2, c: 3 }) let recomputeCount = 0 - let visitedComputed = false const computedValue = mobx.computed(() => { recomputeCount++ return m.get("a") @@ -671,7 +671,7 @@ test("can iterate map - values", () => { }) test("NaN as map key", function() { - var a = map(new Map([[NaN, 0]])) + const a = map(new Map([[NaN, 0]])) expect(a.has(NaN)).toBe(true) expect(a.get(NaN)).toBe(0) a.set(NaN, 1) diff --git a/test/base/modifiers2.js b/test/base/modifiers2.js deleted file mode 100644 index 4b822bac5..000000000 --- a/test/base/modifiers2.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict" - -const mobx = require("../../src/mobx.ts") - -test("extend observable", () => {}) diff --git a/test/base/nested.js b/test/base/nested.js index 8819964ba..24bb48eb2 100644 --- a/test/base/nested.js +++ b/test/base/nested.js @@ -62,7 +62,6 @@ test("fix #1535: stale observables", cb => { // Acessing computed outside of action causes staleness // NOTE IT DOESN'T MATTER WHICH COMPUTED IS ACCESSED // derived1.get(); - debugger derived2.get() } diff --git a/test/base/object-api-proxy.js b/test/base/object-api-proxy.js index 67a7d8102..063380098 100644 --- a/test/base/object-api-proxy.js +++ b/test/base/object-api-proxy.js @@ -1,18 +1,5 @@ const mobx = require("../../src/mobx") -const { - has, - autorun, - when, - set, - remove, - values, - runInAction, - entries, - reaction, - observable, - extendObservable, - $mobx -} = mobx +const { has, autorun, when, values, runInAction, entries, reaction, observable } = mobx test("keys should be observable when extending", () => { const todos = observable({}) @@ -135,7 +122,6 @@ test("has and get are reactive", async () => { const todos = observable({}) const p1 = when(() => { - debugger return "x" in todos }) const p2 = when(() => { diff --git a/test/base/object-api.js b/test/base/object-api.js index 4b28465db..d06b5be80 100644 --- a/test/base/object-api.js +++ b/test/base/object-api.js @@ -1,19 +1,5 @@ const mobx = require("../../src/mobx") -const { - autorun, - keys, - when, - set, - remove, - values, - entries, - reaction, - observable, - extendObservable, - has, - get, - $mobx -} = mobx +const { autorun, keys, when, set, remove, values, entries, reaction, observable, has, get } = mobx test("keys should be observable when extending", () => { const todos = observable({}) diff --git a/test/base/observables.js b/test/base/observables.js index 62e932e6b..16be63683 100644 --- a/test/base/observables.js +++ b/test/base/observables.js @@ -1,24 +1,15 @@ "use strict" -var mobx = require("../../src/mobx") -var m = mobx -const { - $mobx, - observable, - computed, - transaction, - action, - autorun, - extendObservable, - decorate -} = mobx +const mobx = require("../../src/mobx") +const m = mobx +const { $mobx, observable, computed, transaction, autorun, extendObservable, decorate } = mobx const utils = require("../utils/test-utils") -var voidObserver = function() {} +const voidObserver = function() {} function buffer() { - var b = [] - var res = function(x) { + const b = [] + const res = function(x) { if (typeof x.newValue === "object") { const copy = { ...x.newValue } delete copy[$mobx] @@ -34,15 +25,15 @@ function buffer() { } test("argumentless observable", () => { - var a = observable.box() + const a = observable.box() expect(m.isObservable(a)).toBe(true) expect(a.get()).toBe(undefined) }) test("basic", function() { - var x = observable.box(3) - var b = buffer() + const x = observable.box(3) + const b = buffer() m.observe(x, b) expect(3).toBe(x.get()) @@ -53,11 +44,11 @@ test("basic", function() { }) test("basic2", function() { - var x = observable.box(3) - var z = computed(function() { + const x = observable.box(3) + const z = computed(function() { return x.get() * 2 }) - var y = computed(function() { + const y = computed(function() { return x.get() * 3 }) @@ -74,9 +65,9 @@ test("basic2", function() { }) test("computed with asStructure modifier", function() { - var x1 = observable.box(3) - var x2 = observable.box(5) - var y = m.computed( + const x1 = observable.box(3) + const x2 = observable.box(5) + const y = m.computed( function() { return { sum: x1.get() + x2.get() @@ -84,7 +75,7 @@ test("computed with asStructure modifier", function() { }, { compareStructural: true } ) - var b = buffer() + const b = buffer() m.observe(y, b, true) expect(8).toBe(y.get().sum) @@ -104,11 +95,11 @@ test("computed with asStructure modifier", function() { test("dynamic", function(done) { try { - var x = observable.box(3) - var y = m.computed(function() { + const x = observable.box(3) + const y = m.computed(function() { return x.get() }) - var b = buffer() + const b = buffer() m.observe(y, b, true) expect(3).toBe(y.get()) // First evaluation here.. @@ -127,13 +118,13 @@ test("dynamic", function(done) { test("dynamic2", function(done) { try { - var x = observable.box(3) - var y = computed(function() { + const x = observable.box(3) + const y = computed(function() { return x.get() * x.get() }) expect(9).toBe(y.get()) - var b = buffer() + const b = buffer() m.observe(y, b) x.set(5) @@ -151,13 +142,13 @@ test("dynamic2", function(done) { test("box uses equals", function(done) { try { - var x = observable.box("a", { + const x = observable.box("a", { equals: (oldValue, newValue) => { return oldValue.toLowerCase() === newValue.toLowerCase() } }) - var b = buffer() + const b = buffer() m.observe(x, b) x.set("A") @@ -176,17 +167,17 @@ test("box uses equals", function(done) { test("box uses equals2", function(done) { try { - var x = observable.box("01", { + const x = observable.box("01", { equals: (oldValue, newValue) => { return parseInt(oldValue) === parseInt(newValue) } }) - var y = computed(function() { + const y = computed(function() { return parseInt(x) }) - var b = buffer() + const b = buffer() m.observe(y, b) x.set("2") @@ -205,10 +196,10 @@ test("box uses equals2", function(done) { test("readme1", function(done) { try { - var b = buffer() + const b = buffer() - var vat = observable.box(0.2) - var order = {} + const vat = observable.box(0.2) + const order = {} order.price = observable.box(10) // Prints: New price: 24 // in TS, just: value(() => this.price() * (1+vat())) @@ -232,15 +223,15 @@ test("readme1", function(done) { }) test("batch", function() { - var a = observable.box(2) - var b = observable.box(3) - var c = computed(function() { + const a = observable.box(2) + const b = observable.box(3) + const c = computed(function() { return a.get() * b.get() }) - var d = computed(function() { + const d = computed(function() { return c.get() * b.get() }) - var buf = buffer() + const buf = buffer() m.observe(d, buf) a.set(4) @@ -248,7 +239,7 @@ test("batch", function() { // Note, 60 should not happen! (that is d begin computed before c after update of b) expect(buf.toArray()).toEqual([36, 100]) - var x = mobx.transaction(function() { + const x = mobx.transaction(function() { a.set(2) b.set(3) a.set(6) @@ -262,9 +253,9 @@ test("batch", function() { }) test("transaction with inspection", function() { - var a = observable.box(2) - var calcs = 0 - var b = computed(function() { + const a = observable.box(2) + let calcs = 0 + const b = computed(function() { calcs++ return a.get() * 2 }) @@ -289,9 +280,9 @@ test("transaction with inspection", function() { }) test("transaction with inspection 2", function() { - var a = observable.box(2) - var calcs = 0 - var b + const a = observable.box(2) + let calcs = 0 + let b mobx.autorun(function() { calcs++ b = a.get() * 2 @@ -317,8 +308,8 @@ test("transaction with inspection 2", function() { }) test("scope", function() { - var vat = observable.box(0.2) - var Order = function() { + const vat = observable.box(0.2) + const Order = function() { this.price = observable.box(20) this.amount = observable.box(2) this.total = computed( @@ -329,7 +320,7 @@ test("scope", function() { ) } - var order = new Order() + const order = new Order() m.observe(order.total, voidObserver) order.price.set(10) order.amount.set(3) @@ -338,8 +329,8 @@ test("scope", function() { }) test("props1", function() { - var vat = observable.box(0.2) - var Order = function() { + const vat = observable.box(0.2) + const Order = function() { mobx.extendObservable(this, { price: 20, amount: 2, @@ -349,14 +340,14 @@ test("props1", function() { }) } - var order = new Order() + const order = new Order() expect(48).toBe(order.total) order.price = 10 order.amount = 3 expect(36).toBe(order.total) - var totals = [] - var sub = mobx.autorun(function() { + const totals = [] + const sub = mobx.autorun(function() { totals.push(order.total) }) order.amount = 4 @@ -368,8 +359,8 @@ test("props1", function() { }) test("props2", function() { - var vat = observable.box(0.2) - var Order = function() { + const vat = observable.box(0.2) + const Order = function() { mobx.extendObservable(this, { price: 20, amount: 2, @@ -379,7 +370,7 @@ test("props2", function() { }) } - var order = new Order() + const order = new Order() expect(48).toBe(order.total) order.price = 10 order.amount = 3 @@ -398,8 +389,8 @@ test("props4", function() { }) } - var x = new Bzz() - var ar = x.fluff + const x = new Bzz() + x.fluff expect(x.sum).toBe(3) x.fluff.push(3) expect(x.sum).toBe(6) @@ -410,7 +401,7 @@ test("props4", function() { }) test("extend observable multiple prop maps", function() { - var x = { a: 1 } + const x = { a: 1 } expect(() => { mobx.extendObservable( x, @@ -425,23 +416,23 @@ test("extend observable multiple prop maps", function() { }) test("object enumerable props", function() { - var x = mobx.observable({ + const x = mobx.observable({ a: 3, get b() { return 2 * this.a } }) mobx.extendObservable(x, { c: 4 }) - var ar = [] - for (var key in x) ar.push(key) + const ar = [] + for (const key in x) ar.push(key) expect(ar).toEqual(["a", "c"]) }) test("observe property", function() { - var sb = [] - var mb = [] + const sb = [] + const mb = [] - var Wrapper = function(chocolateBar) { + const Wrapper = function(chocolateBar) { mobx.extendObservable(this, { chocolateBar: chocolateBar, get calories() { @@ -450,20 +441,20 @@ test("observe property", function() { }) } - var snickers = mobx.observable({ + const snickers = mobx.observable({ calories: null }) - var mars = mobx.observable({ + const mars = mobx.observable({ calories: undefined }) - var wrappedSnickers = new Wrapper(snickers) - var wrappedMars = new Wrapper(mars) + const wrappedSnickers = new Wrapper(snickers) + const wrappedMars = new Wrapper(mars) - var disposeSnickers = mobx.autorun(function() { + const disposeSnickers = mobx.autorun(function() { sb.push(wrappedSnickers.calories) }) - var disposeMars = mobx.autorun(function() { + const disposeMars = mobx.autorun(function() { mb.push(wrappedMars.calories) }) snickers.calories = 10 @@ -479,14 +470,14 @@ test("observe property", function() { }) test("observe object", function() { - var events = [] - var a = observable({ + let events = [] + const a = observable({ a: 1, get da() { return this.a * 2 } }) - var stop = m.observe(a, function(change) { + const stop = m.observe(a, function(change) { events.push(change) }) @@ -533,18 +524,18 @@ test("observe object", function() { }) test("mobx.observe", function() { - var events = [] - var o = observable({ b: 2 }) - var ar = observable([3]) - var map = mobx.observable.map({}) + const events = [] + const o = observable({ b: 2 }) + const ar = observable([3]) + const map = mobx.observable.map({}) - var push = function(event) { + const push = function(event) { events.push(event) } - var stop2 = mobx.observe(o, push) - var stop3 = mobx.observe(ar, push) - var stop4 = mobx.observe(map, push) + const stop2 = mobx.observe(o, push) + const stop3 = mobx.observe(ar, push) + const stop4 = mobx.observe(map, push) o.b = 5 ar[0] = 6 @@ -583,14 +574,14 @@ test("mobx.observe", function() { }) test("change count optimization", function() { - var bCalcs = 0 - var cCalcs = 0 - var a = observable.box(3) - var b = computed(function() { + let bCalcs = 0 + let cCalcs = 0 + const a = observable.box(3) + const b = computed(function() { bCalcs += 1 return 4 + a.get() - a.get() }) - var c = computed(function() { + const c = computed(function() { cCalcs += 1 return b.get() }) @@ -613,10 +604,10 @@ test("change count optimization", function() { }) test("observables removed", function() { - var calcs = 0 - var a = observable.box(1) - var b = observable.box(2) - var c = computed(function() { + let calcs = 0 + const a = observable.box(1) + const b = observable.box(2) + const c = computed(function() { calcs++ if (a.get() === 1) return b.get() * a.get() * b.get() return 3 @@ -642,18 +633,18 @@ test("observables removed", function() { }) test("lazy evaluation", function() { - var bCalcs = 0 - var cCalcs = 0 - var dCalcs = 0 - var observerChanges = 0 + let bCalcs = 0 + let cCalcs = 0 + let dCalcs = 0 + let observerChanges = 0 - var a = observable.box(1) - var b = computed(function() { + const a = observable.box(1) + const b = computed(function() { bCalcs += 1 return a.get() + 1 }) - var c = computed(function() { + const c = computed(function() { cCalcs += 1 return b.get() + 1 }) @@ -676,12 +667,12 @@ test("lazy evaluation", function() { expect(bCalcs).toBe(3) expect(cCalcs).toBe(3) - var d = computed(function() { + const d = computed(function() { dCalcs += 1 return b.get() * 2 }) - var handle = m.observe( + const handle = m.observe( d, function() { observerChanges += 1 @@ -720,23 +711,23 @@ test("lazy evaluation", function() { }) test("multiple view dependencies", function() { - var bCalcs = 0 - var dCalcs = 0 - var a = observable.box(1) - var b = computed(function() { + let bCalcs = 0 + let dCalcs = 0 + const a = observable.box(1) + const b = computed(function() { bCalcs++ return 2 * a.get() }) - var c = observable.box(2) - var d = computed(function() { + const c = observable.box(2) + const d = computed(function() { dCalcs++ return 3 * c.get() }) - var zwitch = true - var buffer = [] - var fCalcs = 0 - var dis = mobx.autorun(function() { + let zwitch = true + const buffer = [] + let fCalcs = 0 + const dis = mobx.autorun(function() { fCalcs++ if (zwitch) buffer.push(b.get() + d.get()) else buffer.push(d.get() + b.get()) @@ -764,12 +755,12 @@ test("multiple view dependencies", function() { }) test("nested observable2", function() { - var factor = observable.box(0) - var price = observable.box(100) - var totalCalcs = 0 - var innerCalcs = 0 + const factor = observable.box(0) + const price = observable.box(100) + let totalCalcs = 0 + let innerCalcs = 0 - var total = computed(function() { + const total = computed(function() { totalCalcs += 1 // outer observable shouldn't recalc if inner observable didn't publish a real change return ( price.get() * @@ -780,8 +771,8 @@ test("nested observable2", function() { ) }) - var b = [] - var sub = m.observe( + const b = [] + m.observe( total, function(x) { b.push(x.newValue) @@ -802,13 +793,13 @@ test("nested observable2", function() { }) test("observe", function() { - var x = observable.box(3) - var x2 = computed(function() { + const x = observable.box(3) + const x2 = computed(function() { return x.get() * 2 }) - var b = [] + const b = [] - var cancel = mobx.autorun(function() { + const cancel = mobx.autorun(function() { b.push(x2.get()) }) @@ -821,9 +812,9 @@ test("observe", function() { }) test("when", function() { - var x = observable.box(3) + const x = observable.box(3) - var called = 0 + let called = 0 mobx.when( function() { return x.get() === 4 @@ -844,10 +835,10 @@ test("when", function() { }) test("when 2", function() { - var x = observable.box(3) + const x = observable.box(3) - var called = 0 - var d = mobx.when( + let called = 0 + const d = mobx.when( function() { return x.get() === 3 }, @@ -878,7 +869,7 @@ function stripSpyOutput(events) { test("issue 50", function(done) { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 - var x = observable({ + const x = observable({ a: true, b: false, get c() { @@ -887,14 +878,14 @@ test("issue 50", function(done) { } }) - var result - var events = [] - var disposer1 = mobx.autorun(function ar() { + let result + const events = [] + const disposer1 = mobx.autorun(function ar() { events.push("auto") result = [x.a, x.b, x.c].join(",") }) - var disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function(info) { events.push(info) }) @@ -921,7 +912,7 @@ test("verify transaction events", function() { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 - var x = observable({ + const x = observable({ b: 1, get c() { events.push("calc c") @@ -929,13 +920,13 @@ test("verify transaction events", function() { } }) - var events = [] - var disposer1 = mobx.autorun(function ar() { + const events = [] + const disposer1 = mobx.autorun(function ar() { events.push("auto") x.c }) - var disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function(info) { events.push(info) }) @@ -954,14 +945,14 @@ test("verify transaction events", function() { }) test("verify array in transaction", function() { - var ar = observable([]) - var aCount = 0 - var aValue + const ar = observable([]) + let aCount = 0 + let aValue mobx.autorun(function() { aCount++ aValue = 0 - for (var i = 0; i < ar.length; i++) aValue += ar[i] + for (let i = 0; i < ar.length; i++) aValue += ar[i] }) mobx.transaction(function() { @@ -977,19 +968,19 @@ test("verify array in transaction", function() { test("delay autorun until end of transaction", function() { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 - var events = [] - var x = observable({ + const events = [] + const x = observable({ a: 2, get b() { events.push("calc y") return this.a } }) - var disposer1 - var disposer2 = mobx.spy(function(info) { + let disposer1 + const disposer2 = mobx.spy(function(info) { events.push(info) }) - var didRun = false + let didRun = false mobx.transaction(function() { mobx.transaction(function() { @@ -1025,8 +1016,8 @@ test("delay autorun until end of transaction", function() { }) test("prematurely end autorun", function() { - var x = observable.box(2) - var dis1, dis2 + const x = observable.box(2) + let dis1, dis2 mobx.transaction(function() { dis1 = mobx.autorun(function() { x.get() @@ -1053,12 +1044,12 @@ test("prematurely end autorun", function() { }) test("computed values believe NaN === NaN", function() { - var a = observable.box(2) - var b = observable.box(3) - var c = computed(function() { + const a = observable.box(2) + const b = observable.box(3) + const c = computed(function() { return String(a.get() * b.get()) }) - var buf = buffer() + const buf = buffer() m.observe(c, buf) a.set(NaN) @@ -1071,15 +1062,15 @@ test("computed values believe NaN === NaN", function() { }) test("computed values believe deep NaN === deep NaN when using compareStructural", function() { - var a = observable({ b: { a: 1 } }) - var c = computed( + const a = observable({ b: { a: 1 } }) + const c = computed( function() { return a.b }, { compareStructural: true } ) - var buf = new buffer() + const buf = new buffer() c.observe(newValue => { buf(newValue) }) @@ -1090,7 +1081,7 @@ test("computed values believe deep NaN === deep NaN when using compareStructural a.b = { a: 2 } a.b = { a: NaN } - var bufArray = buf.toArray() + const bufArray = buf.toArray() expect(isNaN(bufArray[0].b)).toBe(true) expect(bufArray[1]).toEqual({ a: 2 }) expect(isNaN(bufArray[2].b)).toEqual(true) @@ -1098,7 +1089,7 @@ test("computed values believe deep NaN === deep NaN when using compareStructural }) test("issue 71, transacting running transformation", function() { - var state = mobx.observable({ + const state = mobx.observable({ things: [] }) @@ -1123,8 +1114,8 @@ test("issue 71, transacting running transformation", function() { ) } - var copy - var vSum + let copy + let vSum mobx.autorun(function() { copy = state.things.map(function(thing) { return thing.value @@ -1151,15 +1142,15 @@ test("issue 71, transacting running transformation", function() { }) test("eval in transaction", function() { - var bCalcs = 0 - var x = mobx.observable({ + let bCalcs = 0 + const x = mobx.observable({ a: 1, get b() { bCalcs++ return this.a * 2 } }) - var c + let c mobx.autorun(function() { c = x.b @@ -1184,14 +1175,14 @@ test("eval in transaction", function() { }) test("forcefully tracked reaction should still yield valid results", function() { - var x = observable.box(3) - var z - var runCount = 0 - var identity = function() { + const x = observable.box(3) + let z + let runCount = 0 + const identity = function() { runCount++ z = x.get() } - var a = new mobx.Reaction("test", function() { + const a = new mobx.Reaction("test", function() { this.track(identity) }) a.runReaction() @@ -1228,11 +1219,11 @@ test("forcefully tracked reaction should still yield valid results", function() }) test("autoruns created in autoruns should kick off", function() { - var x = observable.box(3) - var x2 = [] - var d + const x = observable.box(3) + const x2 = [] + let d - var a = m.autorun(function() { + const a = m.autorun(function() { if (d) { // dispose previous autorun d() @@ -1251,29 +1242,29 @@ test("autoruns created in autoruns should kick off", function() { }) test("#502 extendObservable throws on objects created with Object.create(null)", () => { - var a = Object.create(null) + const a = Object.create(null) mobx.extendObservable(a, { b: 3 }) expect(mobx.isObservableProp(a, "b")).toBe(true) }) test("#328 atom throwing exception if observing stuff in onObserved", () => { - var b = mobx.observable.box(1) - var a = mobx.createAtom("test atom", () => { + const b = mobx.observable.box(1) + const a = mobx.createAtom("test atom", () => { b.get() }) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { a.reportObserved() // threw }) d() }) test("prematurely ended autoruns are cleaned up properly", () => { - var a = mobx.observable.box(1) - var b = mobx.observable.box(2) - var c = mobx.observable.box(3) - var called = 0 + const a = mobx.observable.box(1) + const b = mobx.observable.box(2) + const c = mobx.observable.box(3) + let called = 0 - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { called++ if (a.get() === 2) { d() // dispose @@ -1300,14 +1291,14 @@ test("prematurely ended autoruns are cleaned up properly", () => { }) test("unoptimizable subscriptions are diffed correctly", () => { - var a = mobx.observable.box(1) - var b = mobx.observable.box(1) - var c = mobx.computed(() => { + const a = mobx.observable.box(1) + const b = mobx.observable.box(1) + const c = mobx.computed(() => { a.get() return 3 }) - var called = 0 - var val = 0 + let called = 0 + let val = 0 const d = mobx.autorun(() => { called++ @@ -1349,17 +1340,17 @@ test("unoptimizable subscriptions are diffed correctly", () => { }) test("atom events #427", () => { - var start = 0 - var stop = 0 - var runs = 0 + let start = 0 + let stop = 0 + let runs = 0 - var a = mobx.createAtom("test", () => start++, () => stop++) + const a = mobx.createAtom("test", () => start++, () => stop++) expect(a.reportObserved()).toEqual(false) expect(start).toBe(0) expect(stop).toBe(0) - var d = mobx.autorun(() => { + let d = mobx.autorun(() => { runs++ expect(a.reportObserved()).toBe(true) expect(start).toBe(1) @@ -1402,25 +1393,25 @@ test("atom events #427", () => { }) test("verify calculation count", () => { - var calcs = [] - var a = observable.box(1) - var b = mobx.computed(() => { + const calcs = [] + const a = observable.box(1) + const b = mobx.computed(() => { calcs.push("b") return a.get() }) - var c = mobx.computed(() => { + const c = mobx.computed(() => { calcs.push("c") return b.get() }) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { calcs.push("d") return b.get() }) - var e = mobx.autorun(() => { + const e = mobx.autorun(() => { calcs.push("e") return c.get() }) - var f = mobx.computed(() => { + const f = mobx.computed(() => { calcs.push("f") return c.get() }) @@ -1523,7 +1514,7 @@ test("support computed property getters / setters", () => { }) test("computed getter / setter for plan objects should succeed", function() { - var b = observable({ + const b = observable({ a: 3, get propX() { return this.a * 2 @@ -1533,7 +1524,7 @@ test("computed getter / setter for plan objects should succeed", function() { } }) - var values = [] + const values = [] mobx.autorun(function() { return values.push(b.propX) }) @@ -1545,7 +1536,7 @@ test("computed getter / setter for plan objects should succeed", function() { }) test("helpful error for self referencing setter", function() { - var a = observable({ + const a = observable({ x: 1, get y() { return this.x @@ -1559,7 +1550,7 @@ test("helpful error for self referencing setter", function() { }) test("#558 boxed observables stay boxed observables", function() { - var a = observable({ + const a = observable({ x: observable.box(3) }) @@ -1577,7 +1568,7 @@ test("iscomputed", function() { ) ).toBe(true) - var x = observable({ + const x = observable({ a: 3, get b() { return this.a @@ -1589,9 +1580,9 @@ test("iscomputed", function() { }) test("603 - transaction should not kill reactions", () => { - var a = observable.box(1) - var b = 1 - var d = mobx.autorun(() => { + const a = observable.box(1) + let b = 1 + const d = mobx.autorun(() => { b = a.get() }) @@ -1600,7 +1591,9 @@ test("603 - transaction should not kill reactions", () => { a.set(2) throw 3 }) - } catch (e) {} + } catch (e) { + // empty + } expect(a.observers.size).toBe(1) expect(d[$mobx].observing.length).toBe(1) @@ -1617,7 +1610,7 @@ test("603 - transaction should not kill reactions", () => { test("#561 test toPrimitive() of observable objects", function() { if (typeof Symbol !== "undefined" && Symbol.toPrimitive) { - var x = observable.box(3) + let x = observable.box(3) expect(x.valueOf()).toBe(3) expect(x[Symbol.toPrimitive]()).toBe(3) @@ -1625,14 +1618,14 @@ test("#561 test toPrimitive() of observable objects", function() { expect(+x).toBe(3) expect(++x).toBe(4) - var y = observable.box(3) + const y = observable.box(3) expect(y + 7).toBe(10) - var z = computed(() => ({ a: 3 })) + const z = computed(() => ({ a: 3 })) expect(3 + z).toBe("3[object Object]") } else { - var x = observable.box(3) + let x = observable.box(3) expect(x.valueOf()).toBe(3) expect(x["@@toPrimitive"]()).toBe(3) @@ -1640,11 +1633,11 @@ test("#561 test toPrimitive() of observable objects", function() { expect(+x).toBe(3) expect(++x).toBe(4) - var y = observable.box(3) + const y = observable.box(3) expect(y + 7).toBe(10) - var z = computed(() => ({ a: 3 })) + const z = computed(() => ({ a: 3 })) expect("3" + z["@@toPrimitive"]()).toBe("3[object Object]") } }) @@ -1780,7 +1773,7 @@ test("It should not be possible to redefine a computed property", () => { test("extendObservable should not be able to set a computed property", () => { expect(() => { - const x = observable({ + observable({ a: computed( function() { return this.b * 2 diff --git a/test/base/observe.js b/test/base/observe.js index e934eea51..53e441532 100644 --- a/test/base/observe.js +++ b/test/base/observe.js @@ -1,14 +1,14 @@ -var m = require("../../src/mobx.ts") +const m = require("../../src/mobx.ts") test("observe object and map properties", function() { - var map = m.observable.map({ a: 1 }) - var events = [] + const map = m.observable.map({ a: 1 }) + const events = [] expect(function() { m.observe(map, "b", function() {}) }).toThrow(/the entry 'b' does not exist in the observable map/) - var d1 = m.observe(map, "a", function(e) { + const d1 = m.observe(map, "a", function(e) { events.push([e.newValue, e.oldValue]) }) @@ -17,14 +17,14 @@ test("observe object and map properties", function() { d1() map.set("a", 4) - var o = m.observable({ + const o = m.observable({ a: 5 }) expect(function() { m.observe(o, "b", function() {}) }).toThrow(/no observable property 'b' found on the observable object/) - var d2 = m.observe(o, "a", function(e) { + const d2 = m.observe(o, "a", function(e) { events.push([e.newValue, e.oldValue]) }) @@ -37,15 +37,15 @@ test("observe object and map properties", function() { }) test("observe computed values", function() { - var events = [] + const events = [] - var v = m.observable.box(0) - var f = m.observable.box(0) - var c = m.computed(function() { + const v = m.observable.box(0) + const f = m.observable.box(0) + const c = m.computed(function() { return v.get() }) - var d2 = c.observe(function(e) { + c.observe(function(e) { v.get() f.get() events.push([e.newValue, e.oldValue]) diff --git a/test/base/proxies.js b/test/base/proxies.js index 74542ed13..afbd5cd67 100644 --- a/test/base/proxies.js +++ b/test/base/proxies.js @@ -1,6 +1,5 @@ import { computed, - decorate, isComputedProp, isAction, isObservableProp, @@ -9,8 +8,7 @@ import { action, reaction, extendObservable, - keys, - $mobx + keys } from "../../src/mobx.ts" import { stripAdminFromDescriptors } from "../utils/test-utils" @@ -232,7 +230,6 @@ test("ownKeys invariant not broken - 2", () => { test("non-proxied object", () => { const a = observable({ x: 3 }, {}, { proxy: false }) a.b = 4 - debugger extendObservable( a, { @@ -249,7 +246,6 @@ test("non-proxied object", () => { ) expect(a.y).toBe(6) - debugger a.double() expect(a.y).toBe(12) expect(isComputedProp(a, "y")).toBe(true) @@ -277,7 +273,6 @@ test("extend proxies", () => { ) expect(a.y).toBe(6) - debugger a.double() expect(a.y).toBe(12) expect(isComputedProp(a, "y")).toBe(true) @@ -314,7 +309,6 @@ test("decorate proxies", () => { }) test("predictable 'this' - 1", () => { - debugger const a = observable.object( { a0() { @@ -379,7 +373,7 @@ test("1796 - deleting / recreate prop", () => { const events = [] - const aut = autorun(() => { + autorun(() => { events.push(value.foo) }) delete value.foo diff --git a/test/base/reaction.js b/test/base/reaction.js index 438ed6589..3d7d7085b 100644 --- a/test/base/reaction.js +++ b/test/base/reaction.js @@ -1,12 +1,12 @@ -var mobx = require("../../src/mobx.ts") -var reaction = mobx.reaction +const mobx = require("../../src/mobx.ts") +const reaction = mobx.reaction const utils = require("../utils/test-utils") test("basic", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] - var d = reaction( + const d = reaction( () => a.get(), newValue => { values.push(newValue) @@ -22,10 +22,10 @@ test("basic", () => { }) test("effect fireImmediately is honored", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] - var d = reaction( + const d = reaction( () => a.get(), newValue => { values.push(newValue) @@ -42,11 +42,11 @@ test("effect fireImmediately is honored", () => { }) test("effect is untracked", () => { - var a = mobx.observable.box(1) - var b = mobx.observable.box(2) - var values = [] + const a = mobx.observable.box(1) + const b = mobx.observable.box(2) + const values = [] - var d = reaction( + const d = reaction( () => a.get(), newValue => { values.push(newValue * b.get()) @@ -74,11 +74,11 @@ test("effect debounce is honored", () => { expect.assertions(2) return new Promise((resolve, reject) => { - var a = mobx.observable.box(1) - var values = [] - var exprCount = 0 + const a = mobx.observable.box(1) + const values = [] + let exprCount = 0 - var d = reaction( + const d = reaction( () => { exprCount++ return a.get() @@ -120,11 +120,11 @@ test("effect debounce is honored", () => { test("effect debounce + fire immediately is honored", () => { expect.assertions(2) return new Promise((resolve, reject) => { - var a = mobx.observable.box(1) - var values = [] - var exprCount = 0 + const a = mobx.observable.box(1) + const values = [] + let exprCount = 0 - var d = reaction( + const d = reaction( () => { exprCount++ return a.get() @@ -155,8 +155,8 @@ test("effect debounce + fire immediately is honored", () => { }) test("passes Reaction as an argument to expression function", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] reaction( r => { @@ -179,8 +179,8 @@ test("passes Reaction as an argument to expression function", () => { }) test("passes Reaction as an argument to effect function", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] reaction( () => a.get(), @@ -201,9 +201,9 @@ test("passes Reaction as an argument to effect function", () => { }) test("can dispose reaction on first run", () => { - var a = mobx.observable.box(1) + const a = mobx.observable.box(1) - var valuesExpr1st = [] + const valuesExpr1st = [] reaction( () => a.get(), (newValue, r) => { @@ -213,7 +213,7 @@ test("can dispose reaction on first run", () => { { fireImmediately: true } ) - var valuesEffect1st = [] + const valuesEffect1st = [] reaction( r => { r.dispose() @@ -225,7 +225,7 @@ test("can dispose reaction on first run", () => { { fireImmediately: true } ) - var valuesExpr = [] + const valuesExpr = [] reaction( () => a.get(), (newValue, r) => { @@ -234,7 +234,7 @@ test("can dispose reaction on first run", () => { } ) - var valuesEffect = [] + const valuesEffect = [] reaction( r => { r.dispose() @@ -255,10 +255,10 @@ test("can dispose reaction on first run", () => { }) test("#278 do not rerun if expr output doesn't change", () => { - var a = mobx.observable.box(1) - var values = [] + const a = mobx.observable.box(1) + const values = [] - var d = reaction( + const d = reaction( () => (a.get() < 10 ? a.get() : 11), newValue => { values.push(newValue) @@ -281,7 +281,7 @@ test("#278 do not rerun if expr output doesn't change", () => { }) test("#278 do not rerun if expr output doesn't change structurally", () => { - var users = mobx.observable([ + const users = mobx.observable([ { name: "jan", get uppername() { @@ -295,9 +295,9 @@ test("#278 do not rerun if expr output doesn't change structurally", () => { } } ]) - var values = [] + const values = [] - var d = reaction( + const d = reaction( () => users.map(user => user.uppername), newValue => { values.push(newValue) @@ -320,18 +320,18 @@ test("#278 do not rerun if expr output doesn't change structurally", () => { }) test("do not rerun if prev & next expr output is NaN", () => { - var v = mobx.observable.box("a") - var values = [] - var valuesS = [] + const v = mobx.observable.box("a") + const values = [] + const valuesS = [] - var d = reaction( + const d = reaction( () => v.get(), newValue => { values.push(String(newValue)) }, { fireImmediately: true } ) - var dd = reaction( + const dd = reaction( () => v.get(), newValue => { valuesS.push(String(newValue)) @@ -462,7 +462,6 @@ test("Introduce custom onError for - autorun - 1", () => { }) test("Introduce custom onError for - autorun - 2", done => { - let error = "" let globalHandlerCalled = false const d = mobx.onReactionError(() => { globalHandlerCalled = true diff --git a/test/base/set.js b/test/base/set.js index e04647ed2..6b49b24d0 100644 --- a/test/base/set.js +++ b/test/base/set.js @@ -161,7 +161,7 @@ test("cleanup", function() { let hasA - const disposer = autorun(function() { + autorun(function() { hasA = s.has("a") }) @@ -172,12 +172,13 @@ test("cleanup", function() { }) test("set should support iterall / iterable ", () => { - var a = set([1, 2]) + const a = set([1, 2]) function leech(iter) { - var values = [] + const values = [] + let v do { - var v = iter.next() + v = iter.next() if (!v.done) values.push(v.value) } while (!v.done) return values @@ -194,21 +195,21 @@ test("set should support iterall / iterable ", () => { }) test("support for ES6 Set", () => { - var x = new Set() + const x = new Set() x.add(1) x.add(2) - var s = mobx.observable(x) + const s = mobx.observable(x) expect(mobx.isObservableSet(s)).toBe(true) expect(Array.from(s)).toEqual([1, 2]) }) test("deepEqual set", () => { - var x = new Set() + const x = new Set() x.add(1) x.add({ z: 1 }) - var x2 = mobx.observable.set() + const x2 = mobx.observable.set() x2.add(1) x2.add({ z: 2 }) @@ -218,9 +219,9 @@ test("deepEqual set", () => { }) test("set.clear should not be tracked", () => { - var x = set([1]) - var c = 0 - var d = mobx.autorun(() => { + const x = set([1]) + let c = 0 + const d = mobx.autorun(() => { c++ x.clear() }) @@ -239,7 +240,7 @@ test("toStringTag", () => { }) test("getAtom", () => { - var x = set([1]) + const x = set([1]) expect(mobx.getAtom(x)).toBeTruthy() expect(mobx.isObservableSet(x)).toBeTruthy() @@ -248,7 +249,7 @@ test("getAtom", () => { test("observe", () => { const vals = [] - var x = set([1]) + const x = set([1]) mobx.observe(x, v => { vals.push(v) }) diff --git a/test/base/spy.js b/test/base/spy.js index 102dfe8e7..6f2e8a2db 100644 --- a/test/base/spy.js +++ b/test/base/spy.js @@ -1,11 +1,11 @@ "use strict" -var mobx = require("../../src/mobx.ts") +const mobx = require("../../src/mobx.ts") const utils = require("../utils/test-utils") test("spy output", () => { - var events = [] + const events = [] - var stop = mobx.spy(c => events.push(c)) + const stop = mobx.spy(c => events.push(c)) doStuff() @@ -23,30 +23,30 @@ test("spy output", () => { }) function doStuff() { - var a = mobx.observable.box(2) + const a = mobx.observable.box(2) a.set(3) - var b = mobx.observable({ + const b = mobx.observable({ c: 4 }) b.c = 5 mobx.extendObservable(b, { d: 6 }) b.d = 7 - var e = mobx.observable([1, 2]) + const e = mobx.observable([1, 2]) e.push(3, 4) e.shift() e[2] = 5 - var f = mobx.observable.map({ g: 1 }) + const f = mobx.observable.map({ g: 1 }) f.delete("h") f.delete("g") f.set("i", 5) f.set("i", 6) - var j = mobx.computed(() => a.get() * 2) + const j = mobx.computed(() => a.get() * 2) - var stop = mobx.autorun(() => { + mobx.autorun(() => { j.get() }) @@ -57,11 +57,9 @@ function doStuff() { a.set(6) }) - mobx - .action("myTestAction", newValue => { - a.set(newValue) - }) - .call({}, 7) + mobx.action("myTestAction", newValue => { + a.set(newValue) + }).call({}, 7) } test("spy error", () => { @@ -79,10 +77,10 @@ test("spy error", () => { }) }) - var events = [] - var stop = mobx.spy(c => events.push(c)) + const events = [] + const stop = mobx.spy(c => events.push(c)) - var d = mobx.autorun(() => a.y, { name: "autorun" }) + const d = mobx.autorun(() => a.y, { name: "autorun" }) a.x = 3 a.setX(4) diff --git a/test/base/strict-mode.js b/test/base/strict-mode.js index 50394c4c0..57362742a 100644 --- a/test/base/strict-mode.js +++ b/test/base/strict-mode.js @@ -1,16 +1,16 @@ -var mobx = require("../../src/mobx.ts") -var utils = require("../utils/test-utils") +const mobx = require("../../src/mobx.ts") +const utils = require("../utils/test-utils") -var strictError = /Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: / +const strictError = /Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: / test("strict mode should not allow changes outside action", () => { - var a = mobx.observable.box(2) + const a = mobx.observable.box(2) mobx.configure({ enforceActions: "observed" }) // allowed, a is not observed a.set(3) - var d = mobx.autorun(() => a.get()) + const d = mobx.autorun(() => a.get()) // not-allowed, a is observed expect(() => a.set(3)).toThrowError(strictError) d() @@ -21,13 +21,13 @@ test("strict mode should not allow changes outside action", () => { }) test("actions can modify observed state in strict mode", () => { - var a = mobx.observable.box(2) - var d = mobx.autorun(() => a.get()) + const a = mobx.observable.box(2) + const d = mobx.autorun(() => a.get()) mobx.configure({ enforceActions: "observed" }) mobx.action(() => { a.set(3) - var b = mobx.observable.box(4) + mobx.observable.box(4) })() mobx.configure({ enforceActions: "never" }) @@ -35,28 +35,28 @@ test("actions can modify observed state in strict mode", () => { }) test("actions can modify non-observed state in strict mode", () => { - var a = mobx.observable.box(2) + const a = mobx.observable.box(2) mobx.configure({ enforceActions: "observed" }) mobx.action(() => { a.set(3) - var b = mobx.observable.box(4) + mobx.observable.box(4) })() mobx.configure({ enforceActions: "never" }) }) test("reactions cannot modify state in strict mode", () => { - var a = mobx.observable.box(3) - var b = mobx.observable.box(4) + const a = mobx.observable.box(3) + const b = mobx.observable.box(4) mobx.configure({ enforceActions: "observed" }) mobx._resetGlobalState() // should preserve strict mode - var bd = mobx.autorun(() => { + const bd = mobx.autorun(() => { b.get() // make sure it is observed }) - var d = mobx.autorun(() => { + let d = mobx.autorun(() => { expect(() => { a.get() b.set(3) @@ -77,24 +77,24 @@ test("reactions cannot modify state in strict mode", () => { }) test("action inside reaction in strict mode can modify state", () => { - var a = mobx.observable.box(1) - var b = mobx.observable.box(2) + const a = mobx.observable.box(1) + const b = mobx.observable.box(2) - var bd = mobx.autorun(() => { + const bd = mobx.autorun(() => { b.get() // make sure it is observed }) mobx.configure({ enforceActions: "observed" }) - var act = mobx.action(() => b.set(b.get() + 1)) + const act = mobx.action(() => b.set(b.get() + 1)) - var d = mobx.autorun(() => { + const d = mobx.autorun(() => { if (a.get() % 2 === 0) act() if (a.get() == 16) { expect(() => b.set(55)).toThrowError(strictError) } }) - var setA = mobx.action(val => a.set(val)) + const setA = mobx.action(val => a.set(val)) expect(b.get()).toBe(2) setA(4) expect(b.get()).toBe(3) @@ -109,9 +109,9 @@ test("action inside reaction in strict mode can modify state", () => { }) test("cannot create or modify objects in strict mode without action", () => { - var obj = mobx.observable({ a: 2 }) - var ar = mobx.observable([1]) - var map = mobx.observable.map({ a: 2 }) + const obj = mobx.observable({ a: 2 }) + /*const ar = */ mobx.observable([1]) + /*const map = */ mobx.observable.map({ a: 2 }) mobx.configure({ enforceActions: "observed" }) @@ -136,9 +136,9 @@ test("cannot create or modify objects in strict mode without action", () => { }) test("can create objects in strict mode with action", () => { - var obj = mobx.observable({ a: 2 }) - var ar = mobx.observable([1]) - var map = mobx.observable.map({ a: 2 }) + const obj = mobx.observable({ a: 2 }) + const ar = mobx.observable([1]) + const map = mobx.observable.map({ a: 2 }) mobx.configure({ enforceActions: "observed" }) @@ -165,8 +165,8 @@ test("can create objects in strict mode with action", () => { }) test("strict mode checks", function() { - var x = mobx.observable.box(3) - var d = mobx.autorun(() => x.get()) + const x = mobx.observable.box(3) + const d = mobx.autorun(() => x.get()) mobx._allowStateChanges(false, function() { x.get() @@ -215,7 +215,7 @@ test("enforceActions 'strict' should not throw exception while observable array mobx.configure({ enforceActions: "always" }) expect(() => { - const x = mobx.observable({ + mobx.observable({ a: [1, 2] }) }).not.toThrow(/Since strict-mode is enabled/) diff --git a/test/base/tojs.js b/test/base/tojs.js index 9f324a525..9ca9415ea 100644 --- a/test/base/tojs.js +++ b/test/base/tojs.js @@ -1,14 +1,13 @@ "use strict" -var mobx = require("../../src/mobx.ts") -var m = mobx -var observable = mobx.observable -var transaction = mobx.transaction +const mobx = require("../../src/mobx.ts") +const m = mobx +const observable = mobx.observable test("json1", function() { mobx._resetGlobalState() - var todos = observable([ + const todos = observable([ { title: "write blog" }, @@ -17,7 +16,7 @@ test("json1", function() { } ]) - var output + let output mobx.autorun(function() { output = todos .map(function(todo) { @@ -33,7 +32,7 @@ test("json1", function() { }) test("json2", function() { - var source = { + const source = { todos: [ { title: "write blog", @@ -52,15 +51,15 @@ test("json2", function() { ] } - var o = mobx.observable(JSON.parse(JSON.stringify(source))) + const o = mobx.observable(JSON.parse(JSON.stringify(source))) expect(mobx.toJS(o)).toEqual(source) - var analyze = mobx.computed(function() { + const analyze = mobx.computed(function() { return [o.todos.length, o.todos[1].details.url] }) - var alltags = mobx.computed(function() { + const alltags = mobx.computed(function() { return o.todos .map(function(todo) { return todo.tags.join(",") @@ -68,8 +67,8 @@ test("json2", function() { .join(",") }) - var ab = [] - var tb = [] + let ab = [] + let tb = [] m.observe( analyze, @@ -212,17 +211,17 @@ test("json2", function() { }) test("toJS handles dates", () => { - var a = observable({ + const a = observable({ d: new Date() }) - var b = mobx.toJS(a) + const b = mobx.toJS(a) expect(b.d instanceof Date).toBe(true) expect(a.d === b.d).toBe(true) }) test("json cycles", function() { - var a = observable({ + const a = observable({ b: 1, c: [2], d: mobx.observable.map(), @@ -235,9 +234,9 @@ test("json cycles", function() { a.d.set("d", a.d) a.d.set("c", a.c) - var cloneA = mobx.toJS(a, true) - var cloneC = cloneA.c - var cloneD = cloneA.d + const cloneA = mobx.toJS(a, true) + const cloneC = cloneA.c + const cloneD = cloneA.d expect(cloneA.b).toBe(1) expect(cloneA.c[0]).toBe(2) @@ -314,7 +313,7 @@ test("verify already seen", () => { }) test("json cycles when exporting maps as maps", function() { - var a = observable({ + const a = observable({ b: 1, c: [2], d: mobx.observable.map(), @@ -327,9 +326,9 @@ test("json cycles when exporting maps as maps", function() { a.d.set("d", a.d) a.d.set("c", a.c) - var cloneA = mobx.toJS(a, { exportMapsAsObjects: false, detectCycles: true }) - var cloneC = cloneA.c - var cloneD = cloneA.d + const cloneA = mobx.toJS(a, { exportMapsAsObjects: false, detectCycles: true }) + const cloneC = cloneA.c + const cloneD = cloneA.d expect(cloneA.b).toBe(1) expect(cloneA.c[0]).toBe(2) @@ -403,7 +402,7 @@ describe("recurseEverything set to true", function() { const convertedObj = mobx.toJS({ key: cycledObj }, { recurseEverything: true }) expect(convertedObj.key).toBe(convertedObj.key.cycle) }) - + test("should return null if source is null", function() { expect(mobx.toJS(null)).toBeNull() expect(mobx.toJS(null, { recurseEverything: true })).toBeNull() diff --git a/test/base/trace.js b/test/base/trace.js index 15e3bab02..fcacaa318 100644 --- a/test/base/trace.js +++ b/test/base/trace.js @@ -19,7 +19,7 @@ test("trace", () => { /* test multi line comment (run this unit test from VS code, and pass 'true' as third argument to trace below to verify) */ - var res = this.firstname + " " + this.lastname + const res = this.firstname + " " + this.lastname mobx.trace(this, "fullname") return res } @@ -67,7 +67,7 @@ test("1850", () => { /* test multi line comment (run this unit test from VS code, to manually verify serialization) */ - var res = this.firstname + " " + this.lastname + const res = this.firstname + " " + this.lastname mobx.trace(this, "fullname", true) return res } diff --git a/test/base/typescript-tests.ts b/test/base/typescript-tests.ts index e58829ba9..0b5fd931d 100644 --- a/test/base/typescript-tests.ts +++ b/test/base/typescript-tests.ts @@ -29,12 +29,12 @@ import { } from "../../src/mobx" import * as mobx from "../../src/mobx" -var v = observable.box(3) +const v = observable.box(3) observe(v, () => {}) -var a = observable([1, 2, 3]) +const a = observable([1, 2, 3]) -var testFunction = function(a: any) {} +const testFunction = function(a: any) {} // lazy wrapper around yest @@ -71,15 +71,15 @@ test("decorators", () => { // @observable hoepie() { return 3; } } - var o = new Order() + const o = new Order() t.equal(isObservableObject(o), true) t.equal(isObservableProp(o, "amount"), true) t.equal(isObservableProp(o, "total"), true) - var events: any[] = [] - var d1 = observe(o, (ev: IObjectDidChange) => events.push(ev.name, (ev as any).oldValue)) - var d2 = observe(o, "price", ev => events.push(ev.newValue, ev.oldValue)) - var d3 = observe(o, "total", ev => events.push(ev.newValue, ev.oldValue)) + const events: any[] = [] + const d1 = observe(o, (ev: IObjectDidChange) => events.push(ev.name, (ev as any).oldValue)) + const d2 = observe(o, "price", ev => events.push(ev.newValue, ev.oldValue)) + const d3 = observe(o, "total", ev => events.push(ev.newValue, ev.oldValue)) o.price = 4 @@ -100,8 +100,8 @@ test("decorators", () => { }) test("observable", () => { - var a = observable.box(3) - var b = computed(() => a.get() * 2) + const a = observable.box(3) + const b = computed(() => a.get() * 2) t.equal(b.get(), 6) }) @@ -118,11 +118,11 @@ test("annotations", () => { } } - var order1totals: number[] = [] - var order1 = new Order() - var order2 = new Order() + const order1totals: number[] = [] + const order1 = new Order() + const order2 = new Order() - var disposer = autorun(() => { + const disposer = autorun(() => { order1totals.push(order1.total) }) @@ -144,7 +144,7 @@ test("annotations", () => { t.deepEqual(order1totals, [6, 3, 9]) t.equal(order1.aFunction, testFunction) - var x = function() { + const x = function() { return 3 } order1.aFunction = x @@ -152,7 +152,7 @@ test("annotations", () => { }) test("scope", () => { - var x = observable({ + const x = observable({ y: 3, // this wo't work here. get z() { @@ -179,14 +179,14 @@ test("scope", () => { }) } - var x3: IThing = new (Thing)() + const x3: IThing = new (Thing)() t.equal(x3.z, 6) x3.y = 4 t.equal(x3.z, 8) }) test("typing", () => { - var ar: IObservableArray = observable([1, 2]) + const ar: IObservableArray = observable([1, 2]) ar.intercept((c: IArrayWillChange | IArrayWillSplice) => { // console.log(c.type) return null @@ -195,7 +195,7 @@ test("typing", () => { // console.log(d.type) }) - var ar2: IObservableArray = observable([1, 2]) + const ar2: IObservableArray = observable([1, 2]) ar2.intercept((c: IArrayWillChange | IArrayWillSplice) => { // console.log(c.type) return null @@ -204,7 +204,7 @@ test("typing", () => { // console.log(d.type) }) - var x: IObservableValue = observable.box(3) + const x: IObservableValue = observable.box(3) }) const state: any = observable({ @@ -247,9 +247,9 @@ test("box", () => { } } - var box = new Box() + const box = new Box() - var ar: number[] = [] + const ar: number[] = [] autorun(() => { ar.push(box.width) @@ -292,7 +292,7 @@ test("atom clock example", done => { class Clock { atom: IAtom - intervalHandler: number | null = null + intervalHandler: NodeJS.Timeout | null = null currentDateTime: string | undefined = undefined constructor() { @@ -457,11 +457,11 @@ test("issue 191 - shared initializers (ts)", () => { @observable array = [2] } - var t1 = new Test() + const t1 = new Test() t1.obj.a = 2 t1.array.push(3) - var t2 = new Test() + const t2 = new Test() t2.obj.a = 3 t2.array.push(4) @@ -684,12 +684,12 @@ test.skip("observable performance", () => { const objs: any[] = [] const start = Date.now() - for (var i = 0; i < AMOUNT; i++) objs.push(new A()) + for (let i = 0; i < AMOUNT; i++) objs.push(new A()) console.log("created in ", Date.now() - start) - for (var j = 0; j < 4; j++) { - for (var i = 0; i < AMOUNT; i++) { + for (let j = 0; j < 4; j++) { + for (let i = 0; i < AMOUNT; i++) { const obj = objs[i] obj.a += 3 obj.b *= 4 @@ -813,7 +813,7 @@ test("enumerability", () => { // not initialized yet let ownProps = Object.keys(a) let props: string[] = [] - for (var key in a) props.push(key) + for (const key in a) props.push(key) t.deepEqual(ownProps, [ "a" // yeej! @@ -841,7 +841,7 @@ test("enumerability", () => { ownProps = Object.keys(a) props = [] - for (var key in a) props.push(key) + for (const key in a) props.push(key) t.deepEqual(ownProps, ["a"]) @@ -867,7 +867,7 @@ test("issue 285 (typescript)", () => { } } - var todo = new Todo("Something to do") + const todo = new Todo("Something to do") t.deepEqual(toJS(todo), { id: 1, @@ -1291,9 +1291,9 @@ test("computed comparer works with decorate (TS)", () => { test("computed comparer works with decorate (TS) - 2", () => { const sameTime = (from: Time, to: Time) => from.hour === to.hour && from.minute === to.minute class Time { - hour: number - minute: number - readonly time: number + hour!: number + minute!: number + readonly time!: number constructor(hour: number, minute: number) { extendObservable( @@ -1552,8 +1552,6 @@ test("promised when can be cancelled", async () => { }) test("it should support asyncAction as decorator (ts)", async () => { - const values = [] - mobx.configure({ enforceActions: "observed" }) class X { @@ -1586,14 +1584,13 @@ test("flow support async generators", async () => { yield 3 } - let steps = 0 const start = mobx.flow(async function*() { let total = 0 for await (const number of someNumbers()) { total += number } return total - }) + } as any) // TODO: fix typings const p = start() const res = await p @@ -1612,14 +1609,13 @@ test("flow support throwing async generators", async () => { throw "OOPS" } - let steps = 0 const start = mobx.flow(async function*() { let total = 0 for await (const number of someNumbers()) { total += number } return total - }) + } as any) // TODO: fix typings const p = start() try { diff --git a/test/base/untracked.js b/test/base/untracked.js index 504334371..b2d674b4a 100644 --- a/test/base/untracked.js +++ b/test/base/untracked.js @@ -1,11 +1,11 @@ -var m = require("../../src/mobx.ts") +const m = require("../../src/mobx.ts") test("untracked 1", function() { - var cCalcs = 0, + let cCalcs = 0, dCalcs = 0 - var a = m.observable.box(1) - var b = m.observable.box(2) - var c = m.computed(function() { + const a = m.observable.box(1) + const b = m.observable.box(2) + const c = m.computed(function() { cCalcs++ return ( a.get() + @@ -14,9 +14,9 @@ test("untracked 1", function() { }) ) }) - var result + let result - var d = m.autorun(function() { + m.autorun(function() { dCalcs++ result = c.get() }) diff --git a/test/mixed-versions/state-sharing.js b/test/mixed-versions/state-sharing.js index 0789884c0..bf9f41545 100644 --- a/test/mixed-versions/state-sharing.js +++ b/test/mixed-versions/state-sharing.js @@ -3,23 +3,19 @@ const child_process = require("child_process") function testOutput(cmd, expected) { it("Global state sharing: " + cmd, done => { - const output = child_process.exec( - "node -e '" + cmd + "'", - { cwd: __dirname }, - (e, stdout, stderr) => { - if (e) { - if (!expected) done.fail(e) - else { - expect("" + e).toContain(expected) - done() - } - } else { - expect(stdout.toString()).toBe("") - expect(stderr.toString()).toBe(expected) + child_process.exec("node -e '" + cmd + "'", { cwd: __dirname }, (e, stdout, stderr) => { + if (e) { + if (!expected) done.fail(e) + else { + expect("" + e).toContain(expected) done() } + } else { + expect(stdout.toString()).toBe("") + expect(stderr.toString()).toBe(expected) + done() } - ) + }) }) } diff --git a/test/perf/index.js b/test/perf/index.js index 4f145d09a..5a10503fe 100644 --- a/test/perf/index.js +++ b/test/perf/index.js @@ -1,8 +1,8 @@ -var start = Date.now() +const start = Date.now() if (process.env.PERSIST) { - var fs = require("fs") - var logFile = __dirname + "/perf.txt" + const fs = require("fs") + const logFile = __dirname + "/perf.txt" // clear previous results if (fs.existsSync(logFile)) fs.unlinkSync(logFile) diff --git a/test/perf/perf.js b/test/perf/perf.js index 23f9eeeda..b02ee7477 100644 --- a/test/perf/perf.js +++ b/test/perf/perf.js @@ -1,8 +1,8 @@ -var test = require("tape") -var mobx = require("../../lib/mobx.js") -var observable = mobx.observable -var computed = mobx.computed -var log = require("./index.js").logMeasurement +const test = require("tape") +const mobx = require("../../lib/mobx.js") +const observable = mobx.observable +const computed = mobx.computed +const log = require("./index.js").logMeasurement function gc() { if (typeof global.gc === "function") global.gc() @@ -22,11 +22,11 @@ results of this test: */ test("one observes ten thousand that observe one", function(t) { gc() - var a = observable.box(2) + const a = observable.box(2) // many observers that listen to one.. - var observers = [] - for (var i = 0; i < 10000; i++) { + const observers = [] + for (let i = 0; i < 10000; i++) { ;(function(idx) { observers.push( computed(function() { @@ -36,25 +36,25 @@ test("one observes ten thousand that observe one", function(t) { })(i) } - var bCalcs = 0 + // let bCalcs = 0 // one observers that listens to many.. - var b = computed(function() { - var res = 0 - for (var i = 0; i < observers.length; i++) res += observers[i].get() - bCalcs += 1 + const b = computed(function() { + let res = 0 + for (let i = 0; i < observers.length; i++) res += observers[i].get() + // bCalcs += 1 return res }) - var start = now() + const start = now() mobx.observe(b, voidObserver, true) // start observers t.equal(99990000, b.get()) - var initial = now() + const initial = now() a.set(3) t.equal(149985000, b.get()) // yes, I verified ;-). //t.equal(2, bCalcs); - var end = now() + const end = now() log( "One observers many observes one - Started/Updated in " + @@ -68,8 +68,8 @@ test("one observes ten thousand that observe one", function(t) { test("five hundrend properties that observe their sibling", function(t) { gc() - var observables = [observable.box(1)] - for (var i = 0; i < 500; i++) { + const observables = [observable.box(1)] + for (let i = 0; i < 500; i++) { ;(function(idx) { observables.push( computed(function() { @@ -79,16 +79,16 @@ test("five hundrend properties that observe their sibling", function(t) { })(i) } - var start = now() + const start = now() - var last = observables[observables.length - 1] + const last = observables[observables.length - 1] mobx.observe(last, voidObserver) t.equal(501, last.get()) - var initial = now() + const initial = now() observables[0].set(2) t.equal(502, last.get()) - var end = now() + const end = now() log( "500 props observing sibling - Started/Updated in " + @@ -102,20 +102,20 @@ test("five hundrend properties that observe their sibling", function(t) { test("late dependency change", function(t) { gc() - var values = [] - for (var i = 0; i < 100; i++) values.push(observable.box(0)) + const values = [] + for (let i = 0; i < 100; i++) values.push(observable.box(0)) - var sum = computed(function() { - var sum = 0 - for (var i = 0; i < 100; i++) sum += values[i].get() + const sum = computed(function() { + let sum = 0 + for (let i = 0; i < 100; i++) sum += values[i].get() return sum }) mobx.observe(sum, voidObserver, true) - var start = new Date() + const start = new Date() - for (var i = 0; i < 10000; i++) values[99].set(i) + for (let i = 0; i < 10000; i++) values[99].set(i) t.equal(sum.get(), 9999) log("Late dependency change - Updated in " + (new Date() - start) + "ms.") @@ -124,11 +124,11 @@ test("late dependency change", function(t) { test("lots of unused computables", function(t) { gc() - var a = observable.box(1) + const a = observable.box(1) // many observers that listen to one.. - var observers = [] - for (var i = 0; i < 10000; i++) { + const observers = [] + for (let i = 0; i < 10000; i++) { ;(function(idx) { observers.push( computed(function() { @@ -139,14 +139,14 @@ test("lots of unused computables", function(t) { } // one observers that listens to many.. - var b = computed(function() { - var res = 0 - for (var i = 0; i < observers.length; i++) res += observers[i].get() + const b = computed(function() { + let res = 0 + for (let i = 0; i < observers.length; i++) res += observers[i].get() return res }) - var sum = 0 - var subscription = mobx.observe( + let sum = 0 + const subscription = mobx.observe( b, function(e) { sum = e.newValue @@ -159,12 +159,12 @@ test("lots of unused computables", function(t) { // unsubscribe, nobody should listen to a() now! subscription() - var start = now() + const start = now() a.set(3) t.equal(sum, 49995000) // unchanged! - var end = now() + const end = now() log("Unused computables - Updated in " + (end - start) + " ms.") t.end() @@ -172,20 +172,20 @@ test("lots of unused computables", function(t) { test("many unreferenced observables", function(t) { gc() - var a = observable.box(3) - var b = observable.box(6) - var c = observable.box(7) - var d = computed(function() { + const a = observable.box(3) + const b = observable.box(6) + const c = observable.box(7) + const d = computed(function() { return a.get() * b.get() * c.get() }) t.equal(d.get(), 126) t.equal(d.dependenciesState, -1) - var start = now() - for (var i = 0; i < 10000; i++) { + const start = now() + for (let i = 0; i < 10000; i++) { c.set(i) d.get() } - var end = now() + const end = now() log("Unused observables - Updated in " + (end - start) + " ms.") @@ -194,11 +194,11 @@ test("many unreferenced observables", function(t) { test("array reduce", function(t) { gc() - var aCalc = 0 - var ar = observable([]) - var b = observable.box(1) + let aCalc = 0 + const ar = observable([]) + const b = observable.box(1) - var sum = computed(function() { + const sum = computed(function() { aCalc++ return ar.reduce(function(a, c) { return a + c * b.get() @@ -206,23 +206,23 @@ test("array reduce", function(t) { }) mobx.observe(sum, voidObserver) - var start = now() + const start = now() - for (var i = 0; i < 1000; i++) ar.push(i) + for (let i = 0; i < 1000; i++) ar.push(i) t.equal(499500, sum.get()) t.equal(1001, aCalc) aCalc = 0 - var initial = now() + const initial = now() - for (var i = 0; i < 1000; i++) ar[i] = ar[i] * 2 + for (let i = 0; i < 1000; i++) ar[i] = ar[i] * 2 b.set(2) t.equal(1998000, sum.get()) t.equal(1000, aCalc) - var end = now() + const end = now() log("Array reduce - Started/Updated in " + (initial - start) + "/" + (end - initial) + " ms.") t.end() @@ -230,35 +230,35 @@ test("array reduce", function(t) { test("array classic loop", function(t) { gc() - var ar = observable([]) - var aCalc = 0 - var b = observable.box(1) - var sum = computed(function() { - var s = 0 + const ar = observable([]) + let aCalc = 0 + const b = observable.box(1) + const sum = computed(function() { + let s = 0 aCalc++ - for (var i = 0; i < ar.length; i++) s += ar[i] * b.get() + for (let i = 0; i < ar.length; i++) s += ar[i] * b.get() return s }) mobx.observe(sum, voidObserver, true) // calculate - var start = now() + const start = now() t.equal(1, aCalc) - for (var i = 0; i < 1000; i++) ar.push(i) + for (let i = 0; i < 1000; i++) ar.push(i) t.equal(499500, sum.get()) t.equal(1001, aCalc) - var initial = now() + const initial = now() aCalc = 0 - for (var i = 0; i < 1000; i++) ar[i] = ar[i] * 2 + for (let i = 0; i < 1000; i++) ar[i] = ar[i] * 2 b.set(2) t.equal(1998000, sum.get()) t.equal(1000, aCalc) - var end = now() + const end = now() log("Array loop - Started/Updated in " + (initial - start) + "/" + (end - initial) + " ms.") t.end() @@ -267,13 +267,13 @@ test("array classic loop", function(t) { function order_system_helper(t, usebatch, keepObserving) { gc() t.equal(mobx._isComputingDerivation(), false) - var orders = observable([]) - var vat = observable.box(2) + const orders = observable([]) + const vat = observable.box(2) - var totalAmount = computed(function() { - var sum = 0, + const totalAmount = computed(function() { + let sum = 0, l = orders.length - for (var i = 0; i < l; i++) sum += orders[i].total.get() + for (let i = 0; i < l; i++) sum += orders[i].total.get() return sum }) @@ -310,16 +310,16 @@ function order_system_helper(t, usebatch, keepObserving) { ) } - var disp + let disp if (keepObserving) disp = mobx.observe(totalAmount, voidObserver) - var start = now() + const start = now() function setup() { - for (var i = 0; i < 100; i++) { - var c = new Order(i % 2 == 0) + for (let i = 0; i < 100; i++) { + const c = new Order(i % 2 == 0) orders.push(c) - for (var j = 0; j < 100; j++) c.lines.unshift(new OrderLine(c, 5, 5)) + for (let j = 0; j < 100; j++) c.lines.unshift(new OrderLine(c, 5, 5)) } } @@ -328,10 +328,10 @@ function order_system_helper(t, usebatch, keepObserving) { t.equal(totalAmount.get(), 375000) - var initial = now() + const initial = now() function update() { - for (var i = 0; i < 50; i++) orders[i].includeVat.set(!orders[i].includeVat.get()) + for (let i = 0; i < 50; i++) orders[i].includeVat.set(!orders[i].includeVat.get()) vat.set(3) } @@ -342,7 +342,7 @@ function order_system_helper(t, usebatch, keepObserving) { if (keepObserving) disp() - var end = now() + const end = now() log( "Order system batched: " + usebatch + @@ -376,20 +376,20 @@ test("order system batched lazy", function(t) { test("create array", function(t) { gc() - var a = [] - for (var i = 0; i < 1000; i++) a.push(i) - var start = now() - for (var i = 0; i < 1000; i++) observable.array(a) + const a = [] + for (let i = 0; i < 1000; i++) a.push(i) + const start = now() + for (let i = 0; i < 1000; i++) observable.array(a) log("\nCreate array - Created in " + (now() - start) + "ms.") t.end() }) test("create array (fast)", function(t) { gc() - var a = [] - for (var i = 0; i < 1000; i++) a.push(i) - var start = now() - for (var i = 0; i < 1000; i++) mobx.observable.array(a, { deep: false }) + const a = [] + for (let i = 0; i < 1000; i++) a.push(i) + const start = now() + for (let i = 0; i < 1000; i++) mobx.observable.array(a, { deep: false }) log("\nCreate array (non-recursive) Created in " + (now() - start) + "ms.") t.end() }) @@ -397,16 +397,16 @@ test("create array (fast)", function(t) { test("observe and dispose", t => { gc() - var start = now() - var a = mobx.observable.box(1) - var observers = [] - var MAX = 50000 + const start = now() + const a = mobx.observable.box(1) + const observers = [] + const MAX = 50000 - for (var i = 0; i < MAX * 2; i++) observers.push(mobx.autorun(() => a.get())) + for (let i = 0; i < MAX * 2; i++) observers.push(mobx.autorun(() => a.get())) a.set(2) // favorable order // + unfavorable order - for (var i = 0; i < MAX; i++) { + for (let i = 0; i < MAX; i++) { observers[i]() observers[observers.length - 1 - i]() } @@ -428,7 +428,7 @@ test("sort", t => { } }) } - var items = mobx.observable([]) + const items = mobx.observable([]) function sortFn(l, r) { items.length // screw all optimizations! @@ -443,40 +443,40 @@ test("sort", t => { return 0 } - var sorted = mobx.computed(() => { + const sorted = mobx.computed(() => { items.slice().sort(sortFn) }) - var start = now() - var MAX = 100000 + let start = now() + const MAX = 100000 - var ar = mobx.autorun(() => sorted.get()) + const ar = mobx.autorun(() => sorted.get()) mobx.transaction(() => { - for (var i = 0; i < MAX; i++) items.push(new Item(i % 10, i % 3, i % 7)) + for (let i = 0; i < MAX; i++) items.push(new Item(i % 10, i % 3, i % 7)) }) log("expensive sort: created " + (now() - start)) - var start = now() + start = now() - for (var i = 0; i < 5; i++) { + for (let i = 0; i < 5; i++) { items[i * 1000].a = 7 items[i * 1100].b = 5 items[i * 1200].c = 9 } log("expensive sort: updated " + (now() - start)) - var start = now() + start = now() ar() log("expensive sort: disposed" + (now() - start)) - var plain = mobx.toJS(items, false) + const plain = mobx.toJS(items, false) t.equal(plain.length, MAX) - var start = now() - for (var i = 0; i < 5; i++) { + start = now() + for (let i = 0; i < 5; i++) { plain[i * 1000].a = 7 plain.sort(sortFn) plain[i * 1100].b = 5 @@ -492,13 +492,13 @@ test("sort", t => { test("computed temporary memoization", t => { "use strict" gc() - var computeds = [] + const computeds = [] for (let i = 0; i < 40; i++) { computeds.push( mobx.computed(() => (i ? computeds[i - 1].get() + computeds[i - 1].get() : 1)) ) } - var start = now() + const start = now() t.equal(computeds[27].get(), 134217728) log("computed memoization " + (now() - start) + "ms") @@ -507,38 +507,37 @@ test("computed temporary memoization", t => { test("Map: initializing", function(t) { gc() - var iterationsCount = 100000 - var map - var i + const iterationsCount = 100000 + let i - var start = Date.now() + const start = Date.now() for (i = 0; i < iterationsCount; i++) { - map = mobx.observable.map() + mobx.observable.map() } - var end = Date.now() + const end = Date.now() log("Initilizing " + iterationsCount + " maps: " + (end - start) + " ms.") t.end() }) test("Map: looking up properties", function(t) { gc() - var iterationsCount = 1000 - var propertiesCount = 100 - var map = mobx.observable.map() - var i - var p + const iterationsCount = 1000 + const propertiesCount = 100 + const map = mobx.observable.map() + let i + let p for (p = 0; p < propertiesCount; p++) { map.set("" + p, p) } - var start = Date.now() + const start = Date.now() for (i = 0; i < iterationsCount; i++) { for (p = 0; p < propertiesCount; p++) { map.get("" + p) } } - var end = Date.now() + const end = Date.now() log( "Looking up " + @@ -554,13 +553,13 @@ test("Map: looking up properties", function(t) { test("Map: setting and deleting properties", function(t) { gc() - var iterationsCount = 1000 - var propertiesCount = 100 - var map = mobx.observable.map() - var i - var p + const iterationsCount = 1000 + const propertiesCount = 100 + const map = mobx.observable.map() + let i + let p - var start = Date.now() + const start = Date.now() for (i = 0; i < iterationsCount; i++) { for (p = 0; p < propertiesCount; p++) { map.set("" + p, i) @@ -569,7 +568,7 @@ test("Map: setting and deleting properties", function(t) { map.delete("" + p, i) } } - var end = Date.now() + const end = Date.now() log( "Setting and deleting " + diff --git a/test/tsconfig.json b/test/tsconfig.json deleted file mode 100644 index 769570768..000000000 --- a/test/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "lib": ["esnext"], - "noImplicitAny": true, - "sourceMap": false, - "experimentalDecorators": true, - "strict":true, - "downlevelIteration": true - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f7f8bb72a..4dec622da 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,4 @@ { - "version": "2.0.10", "compilerOptions": { "rootDir": "src", "target": "es6", @@ -17,11 +16,8 @@ "noUnusedParameters": false, "noImplicitAny": false, "noImplicitThis": false, - "lib": [ - "es6" - ] + "experimentalDecorators": true, + "lib": ["es6"] }, - "include": [ - "src/**/*.ts" - ] + "include": ["src/**/*.ts"] } diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 000000000..a5546a8d9 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "lib": ["esnext"], + "noUnusedLocals": false + }, + "include": ["src/**/*.ts", "test/**/*.ts"] +} diff --git a/yarn.lock b/yarn.lock index 14d07957c..e45ad94fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,76 +5,90 @@ "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.48" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.48.tgz#ff1c11060a7c1206e0b81e95286cfc2ca3ac405f" - dependencies: - "@babel/highlight" "7.0.0-beta.48" - -"@babel/core@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" +"@babel/core@^7.1.0", "@babel/core@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helpers" "^7.1.0" - "@babel/parser" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" convert-source-map "^1.1.0" - debug "^3.1.0" - json5 "^0.5.0" - lodash "^4.17.10" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" jsesc "^2.5.1" - lodash "^4.17.10" + lodash "^4.17.11" source-map "^0.5.0" trim-right "^1.0.1" "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== dependencies: "@babel/types" "^7.0.0" "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== dependencies: "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" + integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef" + integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" + integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.0" + lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== dependencies: "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" @@ -82,6 +96,7 @@ "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== dependencies: "@babel/helper-get-function-arity" "^7.0.0" "@babel/template" "^7.1.0" @@ -90,57 +105,66 @@ "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" + integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== dependencies: "@babel/types" "^7.0.0" "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" + integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.11" "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== dependencies: "@babel/types" "^7.0.0" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" + integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== dependencies: - lodash "^4.17.10" + lodash "^4.17.11" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-wrap-function" "^7.1.0" @@ -148,575 +172,1052 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== dependencies: "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" "@babel/helper-wrap-function@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/template" "^7.1.0" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helpers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.0.tgz#429bf0f0020be56a4242883432084e3d70a8a141" - dependencies: - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.2.0" -"@babel/highlight@7.0.0-beta.48": - version "7.0.0-beta.48" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.48.tgz#2f225dc995899858f27858d9011fdb75f70bcf96" +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== -"@babel/plugin-proposal-async-generator-functions@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" +"@babel/plugin-proposal-class-properties@^7.3.4": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" -"@babel/plugin-proposal-decorators@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.0.tgz#bb39ae934318e4560db2d724b0fca8da0299b120" +"@babel/plugin-proposal-decorators@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" + integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.1.0" + "@babel/plugin-syntax-decorators" "^7.2.0" -"@babel/plugin-proposal-json-strings@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" +"@babel/plugin-proposal-object-rest-spread@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" + integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" + integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" - -"@babel/plugin-syntax-async-generators@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + regexpu-core "^4.5.4" -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-decorators@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.1.0.tgz#2fa7c1a7905a299c9853ebcef340306675f9cbdc" +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" +"@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" +"@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" + integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/plugin-transform-classes@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" +"@babel/plugin-transform-classes@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz#adc7a1137ab4287a555d429cc56ecde8f40c062c" + integrity sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" + "@babel/helper-define-map" "^7.4.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" +"@babel/plugin-transform-destructuring@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz#1a95f5ca2bf2f91ef0648d5de38a8d472da4350f" + integrity sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" +"@babel/plugin-transform-dotall-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" + integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" -"@babel/plugin-transform-duplicate-keys@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" +"@babel/plugin-transform-for-of@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz#c36ff40d893f2b8352202a2558824f70cd75e9fe" + integrity sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" +"@babel/plugin-transform-function-name@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz#130c27ec7fb4f0cba30e958989449e5ec8d22bbd" + integrity sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== dependencies: - "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" + integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== + dependencies: + "@babel/helper-module-transforms" "^7.4.3" + "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" +"@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" + integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== dependencies: - "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-umd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" + integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" +"@babel/plugin-transform-parameters@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz#e5ff62929fdf4cf93e58badb5e2430303003800d" + integrity sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA== dependencies: - "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-call-delegate" "^7.4.0" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== dependencies: - regenerator-transform "^0.13.3" + "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" +"@babel/plugin-transform-regenerator@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz#2a697af96887e2bbf5d303ab0221d139de5e739c" + integrity sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" +"@babel/plugin-transform-runtime@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz#4d6691690ecdc9f5cb8c3ab170a1576c1f556371" + integrity sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg== dependencies: + "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" +"@babel/plugin-transform-unicode-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz#3868703fc0e8f443dda65654b298df576f7b863b" + integrity sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" -"@babel/preset-env@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" +"@babel/preset-env@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" + integrity sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.1.0" - "@babel/plugin-proposal-json-strings" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.1.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.1.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-dotall-regex" "^7.0.0" - "@babel/plugin-transform-duplicate-keys" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.1.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.1.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/plugin-transform-modules-systemjs" "^7.0.0" - "@babel/plugin-transform-modules-umd" "^7.1.0" - "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.1.0" - "@babel/plugin-transform-parameters" "^7.1.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typeof-symbol" "^7.0.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - browserslist "^4.1.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.3" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.3" + "@babel/plugin-transform-dotall-regex" "^7.4.3" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.3" + "@babel/plugin-transform-function-name" "^7.4.3" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.3" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.3" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.3" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.3" + "@babel/types" "^7.4.0" + browserslist "^4.5.2" + core-js-compat "^3.0.0" invariant "^2.2.2" js-levenshtein "^1.1.3" - semver "^5.3.0" + semver "^5.5.0" -"@babel/template@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" +"@babel/runtime@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc" + integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" -"@babel/traverse@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" + "@babel/generator" "^7.4.0" "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - debug "^3.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/types@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== dependencies: esutils "^2.0.2" - lodash "^4.17.10" + lodash "^4.17.11" to-fast-properties "^2.0.0" -"@types/jest@^21.1.9": - version "21.1.10" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-21.1.10.tgz#dcacb5217ddf997a090cc822bba219b4b2fd7984" +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" -"@types/node@^7.0.22": - version "7.0.65" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.65.tgz#c160979ff66c4842adc76cc181a11b5e8722d13d" +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" + integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.7.0" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + jest-watcher "^24.7.1" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" -"@typescript-eslint/eslint-plugin@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.3.0.tgz#e64c859a3eec10d96731eb5f72b5f48796a2f9ad" - integrity sha512-s+vjO9+PvYS2A6FnQC/imyEDOkrEKIzSpPf2OEGnkKqa5+1d0cuXgCi/oROtuBht2/u/iK22nrYcO/Ei4R8F/g== +"@jest/environment@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" + integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== + dependencies: + "@jest/fake-timers" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + +"@jest/fake-timers@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" + integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== + dependencies: + "@jest/types" "^24.7.0" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + +"@jest/reporters@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" + integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" + integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" + integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== + dependencies: + "@jest/test-result" "^24.7.1" + jest-haste-map "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + +"@jest/transform@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" + integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.7.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.7.1" + jest-regex-util "^24.3.0" + jest-util "^24.7.1" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.7.0": + version "24.7.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" + integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/yargs" "^12.0.9" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== dependencies: - "@typescript-eslint/parser" "1.3.0" + any-observable "^0.3.0" + +"@types/babel__core@^7.1.0": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" + integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz#1eb8c033e98cf4e1a4cedcaf8bcafe8cb7591e85" + integrity sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg== + +"@types/jest-diff@*": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" + integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== + +"@types/jest@^24.0.11": + version "24.0.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340" + integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ== + dependencies: + "@types/jest-diff" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*", "@types/node@^11.11.3", "@types/node@^11.13.5": + version "11.13.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" + integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + +"@typescript-eslint/eslint-plugin@^1.4.2": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz#a5ff3128c692393fb16efa403ec7c8a5593dab0f" + integrity sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ== + dependencies: + "@typescript-eslint/parser" "1.6.0" + "@typescript-eslint/typescript-estree" "1.6.0" requireindex "^1.2.0" tsutils "^3.7.0" -"@typescript-eslint/parser@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.3.0.tgz#e61e795aa050351b7312a757e0864b6d90b84078" - integrity sha512-Q5cz9nyEQyRrtItRElvQXdNs0Xja1xvOdphDQR7N6MqUdi4juWVNxHKypdHQCx9OcEBev6pWHOda8lwg/2W9/g== +"@typescript-eslint/parser@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.6.0.tgz#f01189c8b90848e3b8e45a6cdad27870529d1804" + integrity sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw== dependencies: - "@typescript-eslint/typescript-estree" "1.3.0" + "@typescript-eslint/typescript-estree" "1.6.0" eslint-scope "^4.0.0" eslint-visitor-keys "^1.0.0" -"@typescript-eslint/typescript-estree@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.3.0.tgz#1d1f36680e5c32c3af38c1180153f018152f65f9" - integrity sha512-h6UxHSmBUopFcxHg/eryrA+GwHMbh7PxotMbkq9p2f3nX60CKm5Zc0VN8krBD3IS5KqsK0iOz24VpEWrP+JZ2Q== +"@typescript-eslint/typescript-estree@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz#6cf43a07fee08b8eb52e4513b428c8cdc9751ef0" + integrity sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA== dependencies: lodash.unescape "4.0.1" semver "5.5.0" -JSONStream@^1.0.3: - version "1.3.2" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: - mime-types "~2.1.11" + mime-types "~2.1.18" negotiator "0.6.1" -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - dependencies: - acorn "^4.0.3" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + version "4.3.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.1.tgz#deb149c59276657ebd40ba2ba849ddd529763ccf" + integrity sha512-gJSiKY8dBIjV/0jagZIFBdVMtfQyA5QHCvAT48H2q8REQoW8Fs5AOjqBql1LgSXgrMWdevcE+8cdZ33NtVbIBA== dependencies: - acorn "^5.0.0" + acorn "^6.0.1" + acorn-walk "^6.0.1" acorn-jsx@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.0.0, acorn@^5.3.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" - -acorn@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" +acorn-walk@^6.0.1, acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== -acorn@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818" - integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw== - -ajv-keywords@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" +acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== -ajv@^5.1.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv@^5.1.5: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.0.tgz#c1735024c5da2ef75cc190713073d44f098bf486" - dependencies: - co "^4.6.0" - fast-deep-equal "^0.1.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" +ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^6.5.3, ajv@^6.6.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.8.1.tgz#0890b93742985ebf8973cd365c5b23920ce3cb20" - integrity sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ== +ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== dependencies: - string-width "^2.0.0" - -ansi-escapes@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + string-width "^3.0.0" -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - -ansi-escapes@^3.2.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -724,57 +1225,59 @@ ansi-escapes@^3.2.0: ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" -app-root-path@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" - -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: - default-require-extensions "^1.0.0" + default-require-extensions "^2.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" @@ -782,508 +1285,183 @@ are-we-there-yet@~1.1.2: argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert@^1.1.1, assert@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - -astw@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" - dependencies: - acorn "^4.0.3" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" - dependencies: - lodash "^4.14.0" - -async@^2.1.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.2.1, aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-evaluate-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz#95d98c4ea36150483db2e7d3ec9e1954a72629cb" - -babel-helper-flip-expressions@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz#77f6652f9de9c42401d827bd46ebd2109e3ef18a" - -babel-helper-is-nodes-equiv@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684" - -babel-helper-is-void-0@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz#72f21a3abba0bef3837f9174fca731aed9a02888" - -babel-helper-mark-eval-scopes@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz#4554345edf9f2549427bd2098e530253f8af2992" - -babel-helper-remove-or-void@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" - -babel-helper-to-multiple-sequence-expressions@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz#5f1b832b39e4acf954e9137f0251395c71196b35" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-jest@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" - dependencies: - babel-plugin-istanbul "^4.1.6" - babel-preset-jest "^23.2.0" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" - -babel-plugin-jest-hoist@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" - -babel-plugin-jest-hoist@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" - -babel-plugin-minify-builtins@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz#4f21a7dcb51f91a04ea71d47ff0e8e3b05fec021" - dependencies: - babel-helper-evaluate-path "^0.1.0" - -babel-plugin-minify-constant-folding@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz#57bd172adf8b8d74ad7c99612eb950414ebea3ca" - dependencies: - babel-helper-evaluate-path "^0.1.0" - -babel-plugin-minify-dead-code-elimination@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz#774f536f347b98393a27baa717872968813c342c" - dependencies: - babel-helper-mark-eval-scopes "^0.1.1" - babel-helper-remove-or-void "^0.1.1" - lodash.some "^4.6.0" - -babel-plugin-minify-flip-comparisons@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz#e286b40b7599b18dfea195071e4279465cfc1884" - dependencies: - babel-helper-is-void-0 "^0.1.1" - -babel-plugin-minify-guarded-expressions@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz#dfc3d473b0362d9605d3ce0ac1e22328c60d1007" +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: - babel-helper-flip-expressions "^0.1.2" + array-uniq "^1.0.1" -babel-plugin-minify-infinity@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz#5f1cf67ddedcba13c8a00da832542df0091a1cd4" - -babel-plugin-minify-mangle-names@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz#bfa24661a6794fb03833587e55828b65449e06fe" - dependencies: - babel-helper-mark-eval-scopes "^0.1.1" +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -babel-plugin-minify-numeric-literals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz#d4b8b0c925f874714ee33ee4b26678583d7ce7fb" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -babel-plugin-minify-replace@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz#b90b9e71ab4d3b36325629a91beabe13b0b16ac1" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -babel-plugin-minify-simplify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz#a968f1658fdeb2fc759e81fe331d89829df0f6b9" +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: - babel-helper-flip-expressions "^0.1.2" - babel-helper-is-nodes-equiv "^0.0.1" - babel-helper-to-multiple-sequence-expressions "^0.1.1" + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" -babel-plugin-minify-type-constructors@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz#db53c5b76cb8e2fcd45d862f17104c78761337ee" +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== dependencies: - babel-helper-is-void-0 "^0.1.1" + safer-buffer "~2.1.0" -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -babel-plugin-transform-es2015-modules-commonjs@^6.26.2: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" + util "0.10.3" -babel-plugin-transform-inline-consecutive-adds@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz#5442e9f1c19c78a7899f8a4dee6fd481f61001f5" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -babel-plugin-transform-member-expression-literals@^6.8.4: - version "6.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.4.tgz#05679bc40596b91293401959aa1620ab1b2be437" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== -babel-plugin-transform-merge-sibling-variables@^6.8.5: - version "6.8.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.5.tgz#03abdf107c61241913eb268ddede6d5bc541862c" +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -babel-plugin-transform-minify-booleans@^6.8.2: - version "6.8.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.2.tgz#8451579f706e702c1e1ab2756de5c8ea369cf07c" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -babel-plugin-transform-property-literals@^6.8.4: - version "6.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.4.tgz#6ad311110b80a192a56efb5ddf4fe3ca6f7a61da" +async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - esutils "^2.0.2" - -babel-plugin-transform-regexp-constructors@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz#312ab7487cc88a1c62ee25ea1b6087e89b87799c" + lodash "^4.17.11" -babel-plugin-transform-remove-console@^6.8.4: - version "6.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.4.tgz#41fddac19a729a4c3dd7ef2964eac07b096f9a8f" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -babel-plugin-transform-remove-debugger@^6.8.4: - version "6.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.4.tgz#f85704a08adaa71b55d77005b5b94e9b9df21f6e" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-plugin-transform-remove-undefined@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz#e1ebf51110f6b1e0665f28382ef73f95e5023652" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -babel-plugin-transform-simplify-comparison-operators@^6.8.4: - version "6.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.4.tgz#2aa24a262d664c8cb3e125a306c798d7a2de08d5" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-jest@^24.5.0, babel-jest@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" + integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== + dependencies: + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" +babel-plugin-istanbul@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.2.tgz#d8c2e2e83f72695d6bfdcd297719c66161d5f0f9" + integrity sha512-U3ZVajC+Z69Gim7ZzmD4Wcsq76i/1hqDamBfowc1tWzWjybRy70iWfngP2ME+1CrgcgZ/+muIbPY/Yi0dxdIkQ== dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-undefined-to-void@^6.8.2: - version "6.8.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.2.tgz#fe2b1d294eb05e87524eb93724dea6e2c3d66fa1" + find-up "^3.0.0" + istanbul-lib-instrument "^3.2.0" + test-exclude "^5.2.2" -babel-preset-babili@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz#ad9d6651002f5bc3f07cab300781167f54724bf2" - dependencies: - babel-plugin-minify-builtins "^0.1.3" - babel-plugin-minify-constant-folding "^0.1.3" - babel-plugin-minify-dead-code-elimination "^0.1.7" - babel-plugin-minify-flip-comparisons "^0.1.2" - babel-plugin-minify-guarded-expressions "^0.1.2" - babel-plugin-minify-infinity "^0.1.2" - babel-plugin-minify-mangle-names "^0.1.3" - babel-plugin-minify-numeric-literals "^0.1.1" - babel-plugin-minify-replace "^0.1.2" - babel-plugin-minify-simplify "^0.1.2" - babel-plugin-minify-type-constructors "^0.1.2" - babel-plugin-transform-inline-consecutive-adds "^0.1.2" - babel-plugin-transform-member-expression-literals "^6.8.4" - babel-plugin-transform-merge-sibling-variables "^6.8.5" - babel-plugin-transform-minify-booleans "^6.8.2" - babel-plugin-transform-property-literals "^6.8.4" - babel-plugin-transform-regexp-constructors "^0.1.1" - babel-plugin-transform-remove-console "^6.8.4" - babel-plugin-transform-remove-debugger "^6.8.4" - babel-plugin-transform-remove-undefined "^0.1.2" - babel-plugin-transform-simplify-comparison-operators "^6.8.4" - babel-plugin-transform-undefined-to-void "^6.8.2" - lodash.isplainobject "^4.0.6" - -babel-preset-jest@^22.4.3: - version "22.4.4" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" - dependencies: - babel-plugin-jest-hoist "^22.4.4" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-preset-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" - dependencies: - babel-plugin-jest-hoist "^23.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" + "@types/babel__traverse" "^7.0.6" -babili-webpack-plugin@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/babili-webpack-plugin/-/babili-webpack-plugin-0.1.2.tgz#164ac03d5932f6a52143e7ffc06f2711c651b6f2" +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== dependencies: - babel-core "^6.24.1" - babel-preset-babili "^0.1.4" - webpack-sources "^1.0.1" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.6.0" balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1294,59 +1472,96 @@ base@^0.11.1: pascalcase "^0.1.1" bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" +bfj@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" + integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== + dependencies: + bluebird "^3.5.1" + check-types "^7.3.0" + hoopy "^0.1.2" + tryer "^1.0.0" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bluebird@^3.5.1, bluebird@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" + integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.7" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46" + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boxen@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" +boxen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-2.1.0.tgz#8d576156e33fc26a34d6be8635fd16b1d745f0b2" + integrity sha512-luq3RQOt2U5sUX+fiu+qnT+wWnHDcATLpEe63jvge6GUZO99AKbVRfp97d2jgLvq1iQa0ORzaAm4lGVG52ZSlw== dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" + ansi-align "^3.0.0" + camelcase "^5.0.0" + chalk "^2.4.1" cli-boxes "^1.0.0" - string-width "^2.0.0" + string-width "^3.0.0" term-size "^1.2.0" widest-line "^2.0.0" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1362,62 +1577,63 @@ braces@^2.3.1: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browser-pack@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531" +brotli-size@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-0.0.3.tgz#1d3855b38f182591a6f69da1516131676e5f62f2" + integrity sha512-bBIdd8uUGxKGldAVykxOqPegl+HlIm4FpXJamwWw5x77WCE8jO7AhXFE1YXOhOB28gS+2pTQete0FqRE6U5hQQ== dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.7.1" - defined "^1.0.0" - through2 "^2.0.0" - umd "^3.0.0" + duplexer "^0.1.1" + iltorb "^2.0.5" browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-resolve@^1.11.0, browser-resolve@^1.11.2, browser-resolve@^1.7.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== browser-resolve@^1.11.3: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: - buffer-xor "^1.0.2" + buffer-xor "^1.0.3" cipher-base "^1.0.0" create-hash "^1.1.0" - evp_bytestokey "^1.0.0" + evp_bytestokey "^1.0.3" inherits "^2.0.1" + safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1425,6 +1641,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1434,121 +1651,117 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.1.4, browserify-zlib@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: - pako "~0.2.0" + pako "~1.0.5" -browserify@^12.0.1: - version "12.0.2" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-12.0.2.tgz#57f21e5e6e308ff5987c4dafd44840b2b98f7a19" +browserslist@^4.0.0, browserslist@^4.5.2, browserslist@^4.5.4: + version "4.5.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.5.tgz#fe1a352330d2490d5735574c149a85bc18ef9b82" + integrity sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA== dependencies: - JSONStream "^1.0.3" - assert "~1.3.0" - browser-pack "^6.0.1" - browser-resolve "^1.11.0" - browserify-zlib "~0.1.2" - buffer "^3.4.3" - concat-stream "~1.5.1" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.0" - domain-browser "~1.1.0" - duplexer2 "~0.1.2" - events "~1.1.0" - glob "^5.0.15" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "~0.0.0" - inherits "~2.0.1" - insert-module-globals "^7.0.0" - isarray "0.0.1" - labeled-stream-splicer "^2.0.0" - module-deps "^4.0.2" - os-browserify "~0.1.1" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "^1.4.3" - stream-browserify "^2.0.0" - stream-http "^2.0.0" - string_decoder "~0.10.0" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "~0.0.0" - url "~0.11.0" - util "~0.10.1" - vm-browserify "~0.0.1" - xtend "^4.0.0" + caniuse-lite "^1.0.30000960" + electron-to-chromium "^1.3.124" + node-releases "^1.1.14" -browserslist@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: - caniuse-lite "^1.0.30000884" - electron-to-chromium "^1.3.62" - node-releases "^1.0.0-alpha.11" + fast-json-stable-stringify "2.x" bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= dependencies: node-int64 "^0.4.0" -buffer-from@^1.0.0: +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-xor@^1.0.2: +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-2.0.0.tgz#60b7ef5ae6546bd7deefa74b08b62a43a232648e" +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -bytes@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^11.0.2, cacache@^11.2.0: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1560,59 +1773,76 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cached-path-relative@^1.0.0: +call-me-maybe@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= callsites@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" - integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^4.0.0, camelcase@^4.1.0: +camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30000884: - version "1.0.30000885" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" +camelcase@^5.0.0, camelcase@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== dependencies: - rsvp "^3.3.3" + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000960: + version "1.0.30000962" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000962.tgz#6c10c3ab304b89bea905e66adf98c0905088ee44" + integrity sha512-WXYsW38HK+6eaj5IZR16Rn91TGhU3OhbwjKZvJ4HN/XBIABLKfbij9Mnd3pM0VEwZSlltWjoWg3I8FQ0DGgNOA== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1620,15 +1850,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.1.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1642,43 +1864,64 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^1.4.3, chokidar@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" +check-types@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" + integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== + +chokidar@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.1" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chownr@^1.0.1, chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-job-number@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ci-job-number/-/ci-job-number-0.3.0.tgz#34bdd114b0dece1960287bd40a57051041a2a800" + integrity sha1-NL3RFLDezhlgKHvUClcFEEGiqAA= cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== + safe-buffer "^5.0.1" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1688,27 +1931,19 @@ class-utils@^0.3.5: cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= -cli-cursor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - dependencies: - restore-cursor "^1.0.1" - -cli-cursor@^2.1.0: +cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= dependencies: slice-ansi "0.0.4" string-width "^1.0.1" @@ -1718,25 +1953,10 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1745,185 +1965,253 @@ cliui@^4.0.0: co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -colors@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.0.tgz#5f20c9fef6945cb1134260aab33bfbdc8295e04e" +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combine-source-map@~0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== dependencies: - convert-source-map "~1.1.0" - inline-source-map "~0.6.0" - lodash.memoize "~3.0.3" - source-map "~0.5.3" + color-name "^1.0.0" + simple-swizzle "^0.2.2" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" +color@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" + integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" -commander@^2.9.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" +commander@^2.14.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compression-webpack-plugin@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc" + integrity sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q== + dependencies: + cacache "^11.2.0" + find-cache-dir "^2.0.0" + neo-async "^2.5.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + webpack-sources "^1.0.1" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@~1.5.0, concat-stream@~1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -constants-browserify@^1.0.0, constants-browserify@~1.0.0: +constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.0: +convert-source-map@^1.1.0, convert-source-map@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -convert-source-map@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" + integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== + dependencies: + browserslist "^4.5.4" + core-js "3.0.1" + core-js-pure "3.0.1" + semver "^6.0.0" + +core-js-pure@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" + integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.6" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" +core-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" + integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37" - dependencies: - graceful-fs "^4.1.2" - js-yaml "^3.4.3" - minimist "^1.2.0" - object-assign "^4.0.1" - os-homedir "^1.0.1" - parse-json "^2.2.0" - pinkie-promise "^2.0.0" - require-from-string "^1.1.0" - -coveralls@^2.11.4: - version "2.13.3" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7" +cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7, cosmiconfig@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" + integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== dependencies: - js-yaml "3.6.1" - lcov-parse "0.0.10" - log-driver "1.2.5" - minimist "1.2.0" - request "2.79.0" + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.0" + parse-json "^4.0.0" -cpx@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" +coveralls@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.3.tgz#83b1c64aea1c6afa69beaf50b55ac1bc4d13e2b8" + integrity sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg== dependencies: - babel-runtime "^6.9.2" - chokidar "^1.6.0" - duplexer "^0.1.1" - glob "^7.0.5" - glob2base "^0.0.12" - minimatch "^3.0.2" - mkdirp "^0.5.1" - resolve "^1.1.7" - safe-buffer "^5.0.1" - shell-quote "^1.6.1" - subarg "^1.0.0" + growl "~> 1.10.0" + js-yaml "^3.11.0" + lcov-parse "^0.0.10" + log-driver "^1.2.7" + minimist "^1.2.0" + request "^2.86.0" create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - ripemd160 "^2.0.0" + md5.js "^1.3.4" + ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1935,12 +2223,13 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -1951,15 +2240,10 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.0.0: +crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -1973,170 +2257,347 @@ crypto-browserify@^3.0.0: randombytes "^2.0.0" randomfill "^1.0.3" -crypto-browserify@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.0: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== -"cssstyle@>= 0.3.1 < 0.4.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== dependencies: cssom "0.3.x" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" date-fns@^1.27.2: - version "1.28.5" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" - dependencies: - ms "2.0.0" - -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" -debug@^4.0.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1: +decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-assign@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" + integrity sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI= dependencies: is-obj "^1.0.0" deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= -deep-extend@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= dependencies: - strip-bom "^2.0.0" + strip-bom "^3.0.0" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0, defined@~1.0.0: +defined@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@1.1.0, depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - -deps-sort@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" - dependencies: - JSONStream "^1.0.3" - shasum "^1.0.0" - subarg "^1.0.0" - through2 "^2.0.0" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2144,92 +2605,133 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= -detective@^4.0.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" - dependencies: - acorn "^5.2.1" - defined "^1.0.0" - -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" -domain-browser@^1.1.1, domain-browser@~1.1.0: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" +dom-serializer@0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" -domexception@^1.0.0: +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== dependencies: webidl-conversions "^4.0.2" -duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: - readable-stream "^2.0.2" + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.5.6: - version "2.5.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.6.tgz#479636bfa3fe3b1debd52087f0acb204b4f19c88" +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== -electron-to-chromium@^1.3.62: - version "1.3.70" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.70.tgz#ded377256d92d81b4257d36c65aa890274afcfd2" +electron-to-chromium@^1.3.124: + version "1.3.125" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.125.tgz#dbde0e95e64ebe322db0eca764d951f885a5aff2" + integrity sha512-XxowpqQxJ4nDwUXHtVtmEhRqBpm2OnjBomZmZtHD0d2Eo0244+Ojezhk3sD/MBSSe2nxCdGQFRXHIsf/LUTL9A== elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2239,123 +2741,91 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -enhanced-resolve@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.5" + once "^1.4.0" -envify@^4.1.0: +enhanced-resolve@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: - esprima "^4.0.0" - through "~2.3.4" + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" -errno@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: - prr "~0.0.0" + prr "~1.0.1" -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.0, es-abstract@^1.5.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" +es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - es-to-primitive "^1.1.1" + es-to-primitive "^1.2.0" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" + has "^1.0.3" + is-callable "^1.1.4" is-regex "^1.0.4" + object-keys "^1.0.12" -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.23" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" + is-symbol "^1.0.2" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== dependencies: esprima "^3.1.3" estraverse "^4.2.0" @@ -2364,19 +2834,10 @@ escodegen@^1.9.0: optionalDependencies: source-map "~0.6.1" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== +eslint-scope@^4.0.0, eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2391,35 +2852,35 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^5.13.0: - version "5.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.13.0.tgz#ce71cc529c450eed9504530939aa97527861ede9" - integrity sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg== +eslint@^5.15.2: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: "@babel/code-frame" "^7.0.0" - ajv "^6.5.3" + ajv "^6.9.1" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^4.0.1" - doctrine "^2.1.0" - eslint-scope "^4.0.0" + doctrine "^3.0.0" + eslint-scope "^4.0.3" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^5.0.0" + espree "^5.0.1" esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.7.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^6.1.0" - js-yaml "^3.12.0" + inquirer "^6.2.2" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.5" + lodash "^4.17.11" minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" @@ -2430,29 +2891,27 @@ eslint@^5.13.0: semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" - table "^5.0.2" + table "^5.2.3" text-table "^0.2.0" -espree@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" - integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: - acorn "^6.0.2" + acorn "^6.0.7" acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: version "1.0.1" @@ -2462,50 +2921,54 @@ esquery@^1.0.1: estraverse "^4.0.0" esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estree-walker@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" + integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -etag@~1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -events@^1.0.0, events@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: - create-hash "^1.1.1" + md5.js "^1.3.4" + safe-buffer "^5.1.1" -exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - dependencies: - merge "^1.1.3" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2515,23 +2978,28 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2541,83 +3009,78 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expect@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" - dependencies: - ansi-styles "^3.2.0" - jest-diff "^22.4.3" - jest-get-type "^22.4.3" - jest-matcher-utils "^22.4.3" - jest-message-util "^22.4.3" - jest-regex-util "^22.4.3" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" +expect@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" + integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== dependencies: + "@jest/types" "^24.7.0" ansi-styles "^3.2.0" - jest-diff "^23.6.0" - jest-get-type "^22.1.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" -express@^4.15.2: - version "4.15.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" +express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: - accepts "~1.3.3" + accepts "~1.3.5" array-flatten "1.1.1" + body-parser "1.18.3" content-disposition "0.5.2" - content-type "~1.0.2" + content-type "~1.0.4" cookie "0.3.1" cookie-signature "1.0.6" - debug "2.6.7" - depd "~1.1.0" - encodeurl "~1.0.1" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.8.0" - finalhandler "~1.0.3" - fresh "0.5.0" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" merge-descriptors "1.0.1" methods "~1.1.2" on-finished "~2.3.0" - parseurl "~1.3.1" + parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~1.1.4" - qs "6.4.0" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - send "0.15.3" - serve-static "1.12.3" - setprototypeof "1.0.3" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.0" - vary "~1.1.1" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.0.3" @@ -2628,15 +3091,10 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2650,41 +3108,56 @@ extglob@^2.0.4: extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz#5c6f4599aba6b333ee3342e2ed978672f1001f8d" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-json-stable-stringify@^2.0.0: +fast-glob@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: bser "^2.0.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" @@ -2696,194 +3169,228 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^2.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" +file-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" -fileset@^2.0.2: +fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" -filesize@^3.5.6: +filesize@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - -filesize@^3.5.9: - version "3.5.10" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89" +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: - debug "2.6.7" - encodeurl "~1.0.1" + debug "2.6.9" + encodeurl "~1.0.2" escape-html "~1.0.3" on-finished "~2.3.0" - parseurl "~1.3.1" - statuses "~1.3.1" + parseurl "~1.3.2" + statuses "~1.4.0" unpipe "~1.0.0" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: - locate-path "^2.0.0" + locate-path "^3.0.0" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== flow-bin@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.59.0.tgz#8c151ee7f09f1deed9bf0b9d1f2e8ab9d470f1bb" + integrity sha512-yJDRffvby5mCTkbwOdXwiGDjeea8Z+BPVuP53/tHqHIZC+KtQD790zopVf7mHk65v+wRn+TZ7tkRSNA9oDmyLg== -for-each@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +fn-name@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: - is-function "~1.0.0" + is-callable "^1.1.3" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -form-data@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817" +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" + inherits "^2.0.1" + readable-stream "^2.0.0" -fs-extra@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" - jsonfile "^3.0.0" + jsonfile "^4.0.0" universalify "^0.1.0" fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" +fsevents@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" + integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +g-status@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" + integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== + dependencies: + arrify "^1.0.1" + matcher "^1.0.0" + simple-git "^1.85.0" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -2894,64 +3401,69 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" + integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: - find-index "^0.1.1" + is-glob "^3.1.0" + path-dirname "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -2963,95 +3475,109 @@ glob@^7.0.0, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" +globals@^11.1.0, globals@^11.7.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== -globals@^11.1.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" -globals@^11.7.0: - version "11.10.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" - integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +"growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= -gzip-size@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" +gzip-size@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.0.tgz#2db0396c71f5c902d5cf6b52add5030b93c99bd2" + integrity sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ== dependencies: duplexer "^0.1.1" + pify "^4.0.1" -handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" +handlebars@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - async "^1.4.0" + neo-async "^2.6.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^5.1.0" + ajv "^6.5.5" har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3060,6 +3586,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3068,144 +3595,192 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.1, has@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" +has@^1.0.0, has@^1.0.1, has@^1.0.3, has@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - function-bind "^1.0.2" + function-bind "^1.1.1" -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" + safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" + minimalistic-assert "^1.0.1" -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" +hoopy@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== dependencies: whatwg-encoding "^1.0.1" -htmlescape@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" - -http-errors@~1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: - depd "1.1.0" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@0.0.1, https-browserify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -husky@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" +husky@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" + integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== + dependencies: + cosmiconfig "^5.0.7" + execa "^1.0.0" + find-up "^3.0.0" + get-stdin "^6.0.0" + is-ci "^2.0.0" + pkg-dir "^3.0.0" + please-upgrade-node "^3.1.1" + read-pkg "^4.0.1" + run-node "^1.0.0" + slash "^2.0.0" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== dependencies: - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" - -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.4: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.0.tgz#339dbbffb9f8729a243b701e1c29d4cc58c52f0e" + integrity sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ== dependencies: - safer-buffer ">= 2.1.2 < 3" + postcss "^7.0.14" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" -ignore@^4.0.6: +ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +iltorb@^2.0.5: + version "2.4.2" + resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-2.4.2.tgz#51e341045ad5181bf64832a569ec576e7df0faf2" + integrity sha512-RvsVTHt1Pw1/Zcepfd+3jinu38rO8IBFVONcroT9Dwrb5RSNE/CEX7uy1yZKN/kYCQB7FWx/oQgXhN9qAwZY9Q== + dependencies: + detect-libc "^1.0.3" + nan "^2.12.1" + npmlog "^4.1.2" + prebuild-install "^5.2.4" + which-pm-runs "^1.0.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" @@ -3214,34 +3789,38 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: - pkg-dir "^2.0.0" + pkg-dir "^3.0.0" resolve-cwd "^2.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d" + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3249,25 +3828,22 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inline-source-map@~0.6.0: - version "0.6.2" - resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" - dependencies: - source-map "~0.5.3" - -inquirer@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== +inquirer@^6.2.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -3280,101 +3856,119 @@ inquirer@^6.1.0: run-async "^2.2.0" rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^5.0.0" + strip-ansi "^5.1.0" through "^2.3.6" -insert-module-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.7.1" - concat-stream "~1.5.1" - is-buffer "^1.1.0" - lexical-scope "^1.2.0" - process "~0.11.0" - through2 "^2.0.0" - xtend "^4.0.0" - interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== -ipaddr.js@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.0, is-buffer@^1.1.5: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" -is-ci@^1.0.10: +is-color-stop@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= dependencies: - ci-info "^1.0.0" + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -3383,718 +3977,640 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: - is-extglob "^1.0.0" + is-extglob "^2.1.1" is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - -is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - -is-my-json-valid@^2.12.4: - version "2.17.2" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-obj@^1.0.0: +is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: - is-number "^4.0.0" + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= dependencies: has "^1.0.1" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@0.0.1, isarray@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istanbul-api@^1.3.1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" - dependencies: - async "^2.1.4" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.1" - istanbul-lib-hook "^1.2.2" - istanbul-lib-instrument "^1.10.2" - istanbul-lib-report "^1.1.5" - istanbul-lib-source-maps "^1.2.6" - istanbul-reports "^1.5.1" - js-yaml "^3.7.0" - mkdirp "^0.5.1" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-api@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.5.tgz#697b95ec69856c278aacafc0f86ee7392338d5b5" + integrity sha512-meYk1BwDp59Pfse1TvPrkKYgVqAufbdBLEVoqvu/hLLKSaQ054ZTksbNepyc223tMnWdm6AdK2URIJJRqdP87g== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.4" + istanbul-lib-hook "^2.0.6" + istanbul-lib-instrument "^3.2.0" + istanbul-lib-report "^2.0.7" + istanbul-lib-source-maps "^3.0.5" + istanbul-reports "^2.2.3" + js-yaml "^3.13.0" + make-dir "^2.1.0" + minimatch "^3.0.4" once "^1.4.0" -istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - -istanbul-lib-hook@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" - semver "^5.3.0" - -istanbul-lib-instrument@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== + +istanbul-lib-hook@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" - semver "^5.3.0" + append-transform "^1.0.0" -istanbul-lib-report@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== dependencies: - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" -istanbul-lib-source-maps@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" +istanbul-lib-report@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + supports-color "^6.0.0" -istanbul-lib-source-maps@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + debug "^4.1.1" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + rimraf "^2.6.2" + source-map "^0.6.1" -istanbul-reports@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" +istanbul-reports@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.3.tgz#14e0d00ecbfa9387757999cf36599b88e9f2176e" + integrity sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw== dependencies: - handlebars "^4.0.3" + handlebars "^4.1.0" -iterall@^1.0.2: +iterall@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== -jest-changed-files@^23.4.2: - version "23.4.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" +jest-changed-files@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" + integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== dependencies: + "@jest/types" "^24.7.0" + execa "^1.0.0" throat "^4.0.0" -jest-cli@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" +jest-cli@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" + integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== dependencies: - ansi-escapes "^3.0.0" + "@jest/core" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" chalk "^2.0.1" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^1.0.0" - is-ci "^1.0.10" - istanbul-api "^1.3.1" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^23.4.2" - jest-config "^23.6.0" - jest-environment-jsdom "^23.4.0" - jest-get-type "^22.1.0" - jest-haste-map "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - jest-resolve-dependencies "^23.6.0" - jest-runner "^23.6.0" - jest-runtime "^23.6.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - jest-watcher "^23.4.0" - jest-worker "^23.2.0" - micromatch "^2.3.11" - node-notifier "^5.2.1" - prompts "^0.1.9" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - yargs "^11.0.0" - -jest-config@^22.4.3, jest-config@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" - dependencies: + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" + integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.7.1" + "@jest/types" "^24.7.0" + babel-jest "^24.7.1" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^22.4.1" - jest-environment-node "^22.4.1" - jest-get-type "^22.1.0" - jest-jasmine2 "^22.4.4" - jest-regex-util "^22.1.0" - jest-resolve "^22.4.2" - jest-util "^22.4.1" - jest-validate "^22.4.4" - pretty-format "^22.4.0" - -jest-config@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" - dependencies: - babel-core "^6.0.0" - babel-jest "^23.6.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^23.4.0" - jest-environment-node "^23.4.0" - jest-get-type "^22.1.0" - jest-jasmine2 "^23.6.0" - jest-regex-util "^23.3.0" - jest-resolve "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - micromatch "^2.3.11" - pretty-format "^23.6.0" - -jest-diff@^22.4.0, jest-diff@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" - -jest-diff@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + jest-environment-jsdom "^24.7.1" + jest-environment-node "^24.7.1" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + micromatch "^3.1.10" + pretty-format "^24.7.0" + realpath-native "^1.1.0" + +jest-diff@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" + integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== dependencies: chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" -jest-docblock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== dependencies: detect-newline "^2.1.0" -jest-each@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" +jest-each@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" + integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== dependencies: + "@jest/types" "^24.7.0" chalk "^2.0.1" - pretty-format "^23.6.0" - -jest-environment-jsdom@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - jsdom "^11.5.1" - -jest-environment-jsdom@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" - dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" + jest-get-type "^24.3.0" + jest-util "^24.7.1" + pretty-format "^24.7.0" + +jest-environment-jsdom@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" + integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" jsdom "^11.5.1" -jest-environment-node@^22.4.1: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" - dependencies: - jest-mock "^22.4.3" - jest-util "^22.4.3" - -jest-environment-node@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" +jest-environment-node@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" + integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" -jest-get-type@^22.1.0, jest-get-type@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== -jest-haste-map@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" +jest-haste-map@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" + integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== dependencies: + "@jest/types" "^24.7.0" + anymatch "^2.0.0" fb-watchman "^2.0.0" - graceful-fs "^4.1.11" + graceful-fs "^4.1.15" invariant "^2.2.4" - jest-docblock "^23.2.0" - jest-serializer "^23.0.1" - jest-worker "^23.2.0" - micromatch "^2.3.11" - sane "^2.0.0" + jest-serializer "^24.4.0" + jest-util "^24.7.1" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" -jest-jasmine2@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" +jest-jasmine2@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" + integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" chalk "^2.0.1" co "^4.6.0" - expect "^22.4.0" - graceful-fs "^4.1.11" - is-generator-fn "^1.0.0" - jest-diff "^22.4.0" - jest-matcher-utils "^22.4.0" - jest-message-util "^22.4.0" - jest-snapshot "^22.4.0" - jest-util "^22.4.1" - source-map-support "^0.5.0" - -jest-jasmine2@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" - dependencies: - babel-traverse "^6.0.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^23.6.0" - is-generator-fn "^1.0.0" - jest-diff "^23.6.0" - jest-each "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - pretty-format "^23.6.0" - -jest-leak-detector@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" - dependencies: - pretty-format "^23.6.0" - -jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" - dependencies: - chalk "^2.0.1" - jest-get-type "^22.4.3" - pretty-format "^22.4.3" + expect "^24.7.1" + is-generator-fn "^2.0.0" + jest-each "^24.7.1" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + pretty-format "^24.7.0" + throat "^4.0.0" -jest-matcher-utils@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" +jest-leak-detector@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" + integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" + pretty-format "^24.7.0" -jest-message-util@^22.4.0, jest-message-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" +jest-matcher-utils@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" + integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== dependencies: - "@babel/code-frame" "^7.0.0-beta.35" chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" + jest-diff "^24.7.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" -jest-message-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" +jest-message-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" + integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== dependencies: - "@babel/code-frame" "^7.0.0-beta.35" + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/stack-utils" "^1.0.1" chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" + micromatch "^3.1.10" + slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" - -jest-mock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" - -jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" +jest-mock@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" + integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== + dependencies: + "@jest/types" "^24.7.0" -jest-regex-util@^23.3.0: - version "23.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-resolve-dependencies@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" - dependencies: - jest-regex-util "^23.3.0" - jest-snapshot "^23.6.0" +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== -jest-resolve@^22.4.2: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" +jest-resolve-dependencies@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" + integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" + "@jest/types" "^24.7.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.7.1" -jest-resolve@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" +jest-resolve@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" + integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== dependencies: + "@jest/types" "^24.7.0" browser-resolve "^1.11.3" chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-runner@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" - dependencies: + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" + integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.4.2" exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^23.6.0" - jest-docblock "^23.2.0" - jest-haste-map "^23.6.0" - jest-jasmine2 "^23.6.0" - jest-leak-detector "^23.6.0" - jest-message-util "^23.4.0" - jest-runtime "^23.6.0" - jest-util "^23.4.0" - jest-worker "^23.2.0" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-docblock "^24.3.0" + jest-haste-map "^24.7.1" + jest-jasmine2 "^24.7.1" + jest-leak-detector "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" - dependencies: - babel-core "^6.0.0" - babel-plugin-istanbul "^4.1.6" +jest-runtime@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" + integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.2" chalk "^2.0.1" - convert-source-map "^1.4.0" exit "^0.1.2" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.11" - jest-config "^23.6.0" - jest-haste-map "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - jest-resolve "^23.6.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^11.0.0" - -jest-serializer@^23.0.1: - version "23.0.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" - -jest-snapshot@^22.4.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" - dependencies: - chalk "^2.0.1" - jest-diff "^22.4.3" - jest-matcher-utils "^22.4.3" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^22.4.3" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== -jest-snapshot@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" +jest-snapshot@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" + integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== dependencies: - babel-types "^6.0.0" + "@babel/types" "^7.0.0" + "@jest/types" "^24.7.0" chalk "^2.0.1" - jest-diff "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-resolve "^23.6.0" + expect "^24.7.1" + jest-diff "^24.7.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^23.6.0" + pretty-format "^24.7.0" semver "^5.5.0" -jest-util@^22.4.1, jest-util@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^22.4.3" - mkdirp "^0.5.1" - source-map "^0.6.0" - -jest-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" +jest-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" + integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== dependencies: - callsites "^2.0.0" + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + callsites "^3.0.0" chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^23.4.0" + graceful-fs "^4.1.15" + is-ci "^2.0.0" mkdirp "^0.5.1" - slash "^1.0.0" + slash "^2.0.0" source-map "^0.6.0" -jest-validate@^22.4.4: - version "22.4.4" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" - dependencies: - chalk "^2.0.1" - jest-config "^22.4.4" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^22.4.0" - -jest-validate@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" +jest-validate@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" + integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== dependencies: + "@jest/types" "^24.7.0" + camelcase "^5.0.0" chalk "^2.0.1" - jest-get-type "^22.1.0" + jest-get-type "^24.3.0" leven "^2.1.0" - pretty-format "^23.6.0" + pretty-format "^24.7.0" -jest-watcher@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" +jest-watcher@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" + integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== dependencies: + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.9" ansi-escapes "^3.0.0" chalk "^2.0.1" + jest-util "^24.7.1" string-length "^2.0.0" -jest-worker@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" +jest-worker@^24.0.0, jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== dependencies: merge-stream "^1.0.1" + supports-color "^6.1.0" -jest@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" +jest@^24.5.0: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" + integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== dependencies: - import-local "^1.0.0" - jest-cli "^23.6.0" + import-local "^2.0.0" + jest-cli "^24.7.1" js-levenshtein@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.6.1, js-yaml@^3.4.3: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -js-yaml@^3.12.0: - version "3.12.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" - integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.7.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" +js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4102,57 +4618,54 @@ js-yaml@^3.7.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^11.5.1: - version "11.11.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== dependencies: - abab "^1.0.4" - acorn "^5.3.0" + abab "^2.0.0" + acorn "^5.5.3" acorn-globals "^4.1.0" array-equal "^1.0.0" cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.3.1 < 0.4.0" + cssstyle "^1.0.0" data-urls "^1.0.0" - domexception "^1.0.0" - escodegen "^1.9.0" + domexception "^1.0.1" + escodegen "^1.9.1" html-encoding-sniffer "^1.0.2" - left-pad "^1.2.0" - nwsapi "^2.0.0" + left-pad "^1.3.0" + nwsapi "^2.0.7" parse5 "4.0.0" pn "^1.1.0" - request "^2.83.0" + request "^2.87.0" request-promise-native "^1.0.5" sax "^1.2.4" symbol-tree "^3.2.2" - tough-cookie "^2.3.3" + tough-cookie "^2.3.4" w3c-hr-time "^1.0.1" webidl-conversions "^4.0.2" whatwg-encoding "^1.0.3" whatwg-mimetype "^2.1.0" whatwg-url "^6.4.1" - ws "^4.0.0" + ws "^5.2.0" xml-name-validator "^3.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-loader@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.4.1: version "0.4.1" @@ -4162,59 +4675,43 @@ json-schema-traverse@^0.4.1: json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stable-stringify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@2.x, json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - optionalDependencies: - graceful-fs "^4.1.6" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4224,91 +4721,110 @@ jsprim@^1.2.2: kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -kleur@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -labeled-stream-splicer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== dependencies: - inherits "^2.0.1" - isarray "~0.0.1" - stream-splicer "^2.0.0" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + lodash "^4.17.5" + webpack-sources "^1.1.0" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: - invert-kv "^1.0.0" + invert-kv "^2.0.0" -lcov-parse@0.0.10: +lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= -left-pad@^1.2.0: +left-pad@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -lexical-scope@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" - dependencies: - astw "^2.0.0" - -lint-staged@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.1.tgz#24423c8b7bd99d96e15acd1ac8cb392a78e58582" +lint-staged@^8.1.5: + version "8.1.5" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" + integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== dependencies: - app-root-path "^2.0.0" - cosmiconfig "^1.1.0" - execa "^0.7.0" - listr "^0.12.0" - lodash.chunk "^4.2.0" - minimatch "^3.0.0" + chalk "^2.3.1" + commander "^2.14.1" + cosmiconfig "^5.0.2" + debug "^3.1.0" + dedent "^0.7.0" + del "^3.0.0" + execa "^1.0.0" + find-parent-dir "^0.3.0" + g-status "^2.0.2" + is-glob "^4.0.0" + is-windows "^1.0.2" + listr "^0.14.2" + listr-update-renderer "^0.5.0" + lodash "^4.17.11" + log-symbols "^2.2.0" + micromatch "^3.1.8" npm-which "^3.0.1" p-map "^1.1.1" - staged-git-files "0.0.4" + path-is-inside "^1.0.2" + pify "^3.0.0" + please-upgrade-node "^3.0.2" + staged-git-files "1.1.2" + string-argv "^0.0.2" + stringify-object "^3.2.2" + yup "^0.26.10" listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= -listr-update-renderer@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" @@ -4316,209 +4832,231 @@ listr-update-renderer@^0.2.0: figures "^1.7.0" indent-string "^3.0.0" log-symbols "^1.0.2" - log-update "^1.0.2" + log-update "^2.3.0" strip-ansi "^3.0.1" -listr-verbose-renderer@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f" +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" + chalk "^2.4.1" + cli-cursor "^2.1.0" date-fns "^1.27.2" - figures "^1.7.0" + figures "^2.0.0" -listr@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" +listr@^0.14.2: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.2.0" - listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" - p-map "^1.1.1" - rxjs "^5.0.0-beta.11" - stream-to-observable "^0.1.0" - strip-ansi "^3.0.1" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" + parse-json "^4.0.0" + pify "^3.0.0" strip-bom "^3.0.0" loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: - big.js "^3.1.3" + big.js "^5.2.2" emojis-list "^2.0.0" - json5 "^0.5.0" + json5 "^1.0.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: - p-locate "^2.0.0" + p-locate "^3.0.0" path-exists "^3.0.0" -lodash._baseindexof@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - -lodash._cacheindexof@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash.chunk@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" - -lodash.intersection@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.intersection/-/lodash.intersection-3.2.0.tgz#e5b3611298a1187247b99eeadb385a3da018c570" - dependencies: - lodash._baseindexof "^3.0.0" - lodash._cacheindexof "^3.0.0" - lodash._createcache "^3.0.0" - lodash.restparam "^3.0.0" - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.memoize@~3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.some@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.unescape@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= -lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.4: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.5: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -log-driver@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= dependencies: chalk "^1.0.0" -log-update@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== dependencies: - ansi-escapes "^1.0.0" - cli-cursor "^1.0.2" + chalk "^2.0.1" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" lru-cache@^4.0.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +magic-string@^0.25.2: + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-error@1.x: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= dependencies: tmpl "1.0.x" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" +matcher@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" + integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== + dependencies: + escape-string-regexp "^1.0.4" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== dependencies: - mimic-fn "^1.0.0" + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4526,42 +5064,29 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= dependencies: readable-stream "^2.0.1" -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4578,115 +5103,139 @@ micromatch@^3.1.4, micromatch@^3.1.8: to-regex "^3.0.2" miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" +mime-db@~1.39.0: + version "1.39.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.39.0.tgz#f95a20275742f7d2ad0429acfe40f4233543780e" + integrity sha512-DTsrw/iWVvwHH+9Otxccdyy0Tgiil6TWK/xhfARJZF/QFhwOgZgOIvA2/VIGpM8U7Q8z5nDmdDWC6tuVMJNibw== -mime-types@~2.1.11, mime-types@~2.1.15: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" +mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.23" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.23.tgz#d4eacd87de99348a6858fe1e479aad877388d977" + integrity sha512-ROk/m+gMVSrRxTkMlaQOvFmFmYDc7sZgrjjM76abqmd2Cc5fCV7jAMA5XUccEtJ3cYiYdgixUVI+fApc2LkXlw== dependencies: - mime-db "~1.27.0" + mime-db "~1.39.0" -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@~1.2.0: +minimist@^1.1.1, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== dependencies: minipass "^2.2.1" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -module-deps@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" - dependencies: - JSONStream "^1.0.3" - browser-resolve "^1.7.0" - cached-path-relative "^1.0.0" - concat-stream "~1.5.0" - defined "^1.0.0" - detective "^4.0.0" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.1.3" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.1.1: version "2.1.1" @@ -4698,20 +5247,21 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -4719,233 +5269,298 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ncp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" +needle@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.0.tgz#ce3fea21197267bacb310705a7bbe24f2a3a3492" + integrity sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg== dependencies: - debug "^2.1.2" + debug "^4.1.0" iconv-lite "^0.4.4" sax "^1.2.4" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0, neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-abi@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643" + integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw== + dependencies: + semver "^5.4.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== dependencies: assert "^1.1.1" - browserify-zlib "^0.1.4" + browserify-zlib "^0.2.0" buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" path-browserify "0.0.0" - process "^0.11.0" + process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.0.5" + readable-stream "^2.3.3" stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" + util "^0.11.0" vm-browserify "0.0.4" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== dependencies: growly "^1.3.0" - semver "^5.4.1" + is-wsl "^1.1.0" + semver "^5.5.0" shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" - needle "^2.2.0" + needle "^2.2.1" nopt "^4.0.1" npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" tar "^4" -node-releases@^1.0.0-alpha.11: - version "1.0.0-alpha.11" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" +node-releases@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.15.tgz#9e76a73b0eca3bf7801addaa0e6ce90c795f2b9a" + integrity sha512-cKV097BQaZr8LTSRUa2+oc/aX5L8UkZtPQrMSTgiJEeaW7ymTDCoRaGCoaTqk0lqnalcoSHu4wjSl0Cmj2+bMw== dependencies: semver "^5.3.0" +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" npm-path@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== dependencies: which "^1.2.10" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" npm-which@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= dependencies: commander "^2.9.0" npm-path "^2.0.2" which "^1.2.10" -npmlog@^4.0.2: +npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.0.tgz#7c8faf4ad501e1d17a651ebc5547f966b547c5c7" +nwsapi@^2.0.7: + version "2.1.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" + integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" +object-inspect@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= dependencies: define-properties "^1.1.2" es-abstract "^1.5.1" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -4953,17 +5568,27 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -opener@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" +optimize-css-assets-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" + integrity sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A== + dependencies: + cssnano "^4.1.0" + last-call-webpack-plugin "^3.0.0" + optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -4976,42 +5601,26 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - -os-browserify@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -5019,107 +5628,144 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: - p-try "^1.0.0" + p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: - p-limit "^1.1.0" + p-limit "^2.0.0" p-map@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-try@^1.0.0: +p-reduce@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parent-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" - integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= dependencies: - callsites "^3.0.0" + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" -parents@^1.0.0, parents@^1.0.1: +parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - path-platform "~0.11.15" + callsites "^3.0.0" parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: - error-ex "^1.2.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parseurl@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" +parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0, path-browserify@~0.0.0: +path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -5129,35 +5775,27 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-platform@~0.11.15: - version "0.11.15" - resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: - pify "^2.0.0" + pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.12" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5168,163 +5806,581 @@ pbkdf2@^3.0.3: performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" + integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== + dependencies: + semver-compare "^1.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" + integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== dependencies: - find-up "^2.1.0" + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" + integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prebuild-install@^5.2.4: + version "5.2.5" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.5.tgz#c7485911fe98950b7f7cd15bb9daee11b875cc44" + integrity sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^2.0.1" + rc "^1.2.7" + simple-get "^2.7.0" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -prettier@^1.4.4: - version "1.12.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325" - -pretty-format@^22.4.0, pretty-format@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" +prettier@^1.16.4: + version "1.17.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" + integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== -pretty-format@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" +pretty-format@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" + integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== dependencies: - ansi-regex "^3.0.0" + "@jest/types" "^24.7.0" + ansi-regex "^4.0.0" ansi-styles "^3.2.0" + react-is "^16.8.4" -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -process@^0.11.0, process@~0.11.0: +process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -prompts@^0.1.9: - version "0.1.14" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== dependencies: - kleur "^2.0.1" - sisteransi "^0.1.1" + kleur "^3.0.2" + sisteransi "^1.0.0" -proxy-addr@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" +property-expr@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" + integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== + +proxy-addr@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== dependencies: - forwarded "~0.1.0" - ipaddr.js "1.3.0" + forwarded "~0.1.2" + ipaddr.js "1.9.0" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: +punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@~6.5.1: +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -querystring-es3@^0.2.0, querystring-es3@~0.2.0: +querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62" + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" @@ -5332,55 +6388,79 @@ randomfill@^1.0.3: range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -rc@^1.1.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "^0.5.1" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" -read-only-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" +react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== dependencies: - readable-stream "^2.0.2" + find-up "^3.0.0" + read-pkg "^3.0.0" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" +read-pkg-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-5.0.0.tgz#b6a6741cb144ed3610554f40162aa07a6db621b8" + integrity sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg== dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + find-up "^3.0.0" + read-pkg "^5.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= dependencies: - load-json-file "^1.0.0" normalize-package-data "^2.3.2" - path-type "^1.0.0" + parse-json "^4.0.0" + pify "^3.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" +read-pkg@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.0.0.tgz#75449907ece8dfb89cbc76adcba2665316e32b94" + integrity sha512-OWufaRc67oJjcgrxckW/qO9q22iYzyiONh8h+GMcnOvSHAmhV1Dr3x+gyRjP+Qxc5jKupkSfoCQLS/98rDPh9A== dependencies: - load-json-file "^2.0.0" normalize-package-data "^2.3.2" - path-type "^2.0.0" + parse-json "^4.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -5390,233 +6470,171 @@ readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.6: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@~2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" -realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== dependencies: util.promisify "^1.0.0" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" -regenerate-unicode-properties@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz#54f5891543468f36f2274b67c6bc4c033c27b308" - dependencies: - regenerate "^1.3.3" - -regenerate-unicode-properties@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== dependencies: regenerate "^1.4.0" -regenerate@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== -regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - dependencies: - private "^0.1.6" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== dependencies: - is-equal-shallow "^0.1.3" + private "^0.1.6" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp-tree@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" + integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.1.3.tgz#fb81616dbbc2a917a7419b33f8379144f51eb8d0" - dependencies: - regenerate "^1.3.3" - regenerate-unicode-properties "^5.1.1" - regjsgen "^0.3.0" - regjsparser "^0.2.1" - unicode-match-property-ecmascript "^1.0.3" - unicode-match-property-value-ecmascript "^1.0.1" - -regexpu-core@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== dependencies: regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" - regjsgen "^0.4.0" - regjsparser "^0.3.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" - -regjsgen@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.3.0.tgz#0ee4a3e9276430cda25f1e789ea6c15b87b0cb43" - -regjsgen@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + unicode-match-property-value-ecmascript "^1.1.0" -regjsparser@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.2.1.tgz#c3787553faf04e775c302102ef346d995000ec1c" - dependencies: - jsesc "~0.5.0" +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== dependencies: - lodash "^4.13.1" + lodash "^4.17.11" request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" -request@2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" +request@^2.86.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" - aws4 "^1.6.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" + form-data "~2.3.2" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" + mime-types "~2.1.19" + oauth-sign "~0.9.0" performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.1.0" + uuid "^3.3.2" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== requireindex@^1.2.0: version "1.2.0" @@ -5626,12 +6644,14 @@ requireindex@^1.2.0: resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-from@^4.0.0: version "4.0.0" @@ -5641,35 +6661,19 @@ resolve-from@^4.0.0: resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.3, resolve@^1.1.4, resolve@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -resolve@^1.1.6, resolve@^1.1.7: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" - -resolve@^1.3.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" @@ -5682,26 +6686,26 @@ restore-cursor@^2.0.0: resumer@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= dependencies: through "~2.3.4" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= -rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -5709,39 +6713,75 @@ rimraf@~2.6.2: glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: - hash-base "^2.0.0" + hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-filesize@^1.3.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-1.5.0.tgz#bb5841242d88be57f231c9e8a3a541925392178b" +rollup-plugin-filesize@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-6.0.1.tgz#71937b48a411374c76c4a7e6bbdb087780d8bd64" + integrity sha512-wtxHShJofSxJRuYGGxgwIJyxxW+Mgu/vGGcsOUJVN+US6jE+gQYphSS3H2PS2HCVfxDtERtL0gjptk1gYru9rA== dependencies: - boxen "^1.1.0" - colors "^1.1.2" + boxen "^2.0.0" + brotli-size "0.0.3" + colors "^1.3.2" deep-assign "^2.0.0" - filesize "^3.5.6" - gzip-size "^3.0.0" + filesize "^3.6.1" + gzip-size "^5.0.0" + terser "^3.10.0" -rollup-plugin-node-resolve@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.3.0.tgz#c26d110a36812cbefa7ce117cadcd3439aa1c713" +rollup-plugin-node-resolve@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz#638a373a54287d19fcc088fdd1c6fd8a58e4d90a" + integrity sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg== dependencies: - builtin-modules "^2.0.0" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" is-module "^1.0.0" - resolve "^1.1.6" + resolve "^1.10.0" + +rollup-plugin-replace@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" + integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + dependencies: + magic-string "^0.25.2" + rollup-pluginutils "^2.6.0" + +rollup-plugin-terser@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz#6f661ef284fa7c27963d242601691dc3d23f994e" + integrity sha512-wPANT5XKVJJ8RDUN0+wIr7UPd0lIXBo4UdJ59VmlPCtlFsE20AM+14pe+tk7YunCsWEiuzkDBY3QIkSCjtrPXg== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.0.0" + serialize-javascript "^1.6.1" + terser "^3.14.1" + +rollup-pluginutils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz#203706edd43dfafeaebc355d7351119402fc83ad" + integrity sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ== + dependencies: + estree-walker "^0.6.0" + micromatch "^3.1.10" -rollup@^0.41.6: - version "0.41.6" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" +rollup@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.10.1.tgz#aeb763bbe98f707dc6496708db88372fa66687e7" + integrity sha512-pW353tmBE7QP622ITkGxtqF0d5gSRCVPD9xqM+fcPjudeZfoXMFW2sCzsTe2TU/zU1xamIjiS9xuFCPVT9fESw== dependencies: - source-map-support "^0.4.0" + "@types/estree" "0.0.39" + "@types/node" "^11.13.5" + acorn "^6.1.1" -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" +rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== run-async@^2.2.0: version "2.3.0" @@ -5750,115 +6790,139 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rxjs@^5.0.0-beta.11: - version "5.4.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7" +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: - symbol-observable "^1.0.1" + aproba "^1.1.1" -rxjs@^6.4.0: +rxjs@^6.3.3, rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-buffer@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^2.0.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: + "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" -sax@^1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== -semver@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - -semver@^5.5.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== -send@0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: - debug "2.6.7" - depd "~1.1.0" + debug "2.6.9" + depd "~1.1.2" destroy "~1.0.4" - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.1" - mime "1.3.4" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" ms "2.0.0" on-finished "~2.3.0" range-parser "~1.2.0" - statuses "~1.3.1" + statuses "~1.4.0" -serializr@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/serializr/-/serializr-1.3.0.tgz#6c7f977461d54a24bb1f17a03ed0ce61d239b010" +serialize-javascript@^1.4.0, serialize-javascript@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + +serializr@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/serializr/-/serializr-1.5.1.tgz#8967c8af868f05d8ba6a651a9866c8797533e49b" + integrity sha512-ygrOOOB+eaYYiFCLSS1kzu2KtmhP1ZzLFsv+GPWIdhtuDMBTN3H0ldnswPLqIExrEyQWQhiExFlC9Gu8pCT9Uw== -serve-static@1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: - encodeurl "~1.0.1" + encodeurl "~1.0.2" escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.3" + parseurl "~1.3.2" + send "0.16.2" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -5868,6 +6932,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -5877,53 +6942,37 @@ set-value@^2.0.0: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" - dependencies: - inherits "^2.0.1" - -sha.js@~2.4.4: - version "2.4.9" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" -shasum@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" - dependencies: - json-stable-stringify "~0.0.0" - sha.js "~2.4.4" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -shell-quote@^1.4.3, shell-quote@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shelljs@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" +shelljs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -5932,37 +6981,80 @@ shelljs@^0.8.2: shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sisteransi@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= -size-limit@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-0.2.0.tgz#b0064c1375750a4033e4266824b602f4a3369258" +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== dependencies: - babili-webpack-plugin "^0.1.2" - bytes "^2.5.0" - chalk "^2.0.1" - gzip-size "^3.0.0" - memory-fs "^0.4.1" - webpack "^3.0.0" - webpack-bundle-analyzer "^2.8.2" - yargs "^8.0.2" + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-git@^1.85.0: + version "1.110.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" + integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== + dependencies: + debug "^4.0.1" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" -slash@^1.0.0: +sisteransi@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + +size-limit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-1.0.1.tgz#42c6ef9fe68adcab3627191396852e37f1df8593" + integrity sha512-E5pzKguJesgTTp5pen2W1TDFC95AoovRQNJ1CB4LVF3SBcyvCYUk4pQN67xUO3cItfphNrrXXgCBmzrbArZaHg== + dependencies: + bytes "^3.1.0" + chalk "^2.4.2" + ci-job-number "^0.3.0" + compression-webpack-plugin "^2.0.0" + cosmiconfig "^5.2.0" + css-loader "^2.1.1" + escape-string-regexp "^1.0.5" + file-loader "^3.0.1" + globby "^9.2.0" + gzip-size "^5.0.0" + memory-fs "^0.4.1" + optimize-css-assets-webpack-plugin "^5.0.1" + read-pkg-up "^5.0.0" + style-loader "^0.23.1" + webpack "^4.29.6" + webpack-bundle-analyzer "^3.2.0" + yargs "^13.2.2" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= -slice-ansi@^2.0.0: +slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== @@ -5974,6 +7066,7 @@ slice-ansi@^2.0.0: snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -5982,12 +7075,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -5998,48 +7093,26 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: atob "^2.1.1" decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.0: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" - dependencies: - source-map "^0.5.6" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-support@^0.5.0, source-map-support@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" -source-map-support@^0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" +source-map-support@^0.5.6, source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -6047,139 +7120,170 @@ source-map-support@^0.5.6: source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== -staged-git-files@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" +staged-git-files@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" + integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -stealthy-require@^1.1.0: +stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -stream-browserify@^2.0.0, stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" + end-of-stream "^1.1.0" + stream-shift "^1.0.0" -stream-http@^2.0.0, stream-http@^2.3.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.2.6" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" -stream-splicer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.2" +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= -stream-to-observable@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" +string-argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" + integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= dependencies: astral-regex "^1.0.0" strip-ansi "^4.0.0" -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -6188,156 +7292,225 @@ string-width@^1.0.1, string-width@^1.0.2: "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string.prototype.trim@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= dependencies: define-properties "^1.1.2" es-abstract "^1.5.0" function-bind "^1.0.2" -string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" +stringify-object@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== +strip-ansi@^5.0.0, strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^4.0.0" + ansi-regex "^4.1.0" -strip-bom@3.0.0, strip-bom@^3.0.0: +strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -subarg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== dependencies: - minimist "^1.1.0" + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - has-flag "^1.0.0" + has-flag "^3.0.0" -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" +supports-color@^6.0.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" -symbol-observable@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +svgo@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" + integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= -syntax-error@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1" - dependencies: - acorn "^4.0.3" +synchronous-promise@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" + integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== -table@^5.0.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/table/-/table-5.2.2.tgz#61d474c9e4d8f4f7062c98c7504acb3c08aa738f" - integrity sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ== +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== dependencies: - ajv "^6.6.1" + ajv "^6.9.1" lodash "^4.17.11" - slice-ansi "^2.0.0" - string-width "^2.1.1" + slice-ansi "^2.1.0" + string-width "^3.0.0" -tapable@^0.2.5, tapable@~0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tape@^4.2.2: - version "4.9.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a" +tape@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.10.1.tgz#f73be60888dcb120f08b57f947af65a829506a5f" + integrity sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w== dependencies: deep-equal "~1.0.1" defined "~1.0.0" - for-each "~0.3.2" + for-each "~0.3.3" function-bind "~1.1.1" - glob "~7.1.2" - has "~1.0.1" + glob "~7.1.3" + has "~1.0.3" inherits "~2.0.3" minimist "~1.2.0" - object-inspect "~1.5.0" - resolve "~1.5.0" + object-inspect "~1.6.0" + resolve "~1.10.0" resumer "~0.0.0" string.prototype.trim "~1.1.2" through "~2.3.8" -tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" +tar-fs@^1.13.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== dependencies: chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" + minipass "^2.3.4" + minizlib "^1.1.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" yallist "^3.0.2" @@ -6345,18 +7518,42 @@ tar@^4: term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= dependencies: execa "^0.7.0" -test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" +terser-webpack-plugin@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" + integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.10.0, terser@^3.14.1, terser@^3.16.1: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +test-exclude@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" + integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== dependencies: - arrify "^1.0.1" - micromatch "^3.1.8" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" text-table@^0.2.0: version "0.2.0" @@ -6366,30 +7563,33 @@ text-table@^0.2.0: throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" -"through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8: +through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timers-browserify@^1.0.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" - dependencies: - process "~0.11.0" - -timers-browserify@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6400,28 +7600,34 @@ tmp@^0.0.33: tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" @@ -6429,198 +7635,213 @@ to-regex-range@^2.1.0: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: + psl "^1.1.24" punycode "^1.4.1" tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: punycode "^2.1.0" trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -ts-jest@^22.0.0: - version "22.4.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.4.6.tgz#a5d7f5e8b809626d1f4143209d301287472ec344" - dependencies: - babel-core "^6.26.3" - babel-plugin-istanbul "^4.1.6" - babel-plugin-transform-es2015-modules-commonjs "^6.26.2" - babel-preset-jest "^22.4.3" - cpx "^1.5.0" - fs-extra "6.0.0" - jest-config "^22.4.3" - lodash "^4.17.10" - pkg-dir "^2.0.0" - source-map-support "^0.5.5" - yargs "^11.0.0" - -tslib@^1.7.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7" - -tslib@^1.8.1, tslib@^1.9.0: +tryer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-jest@^24.0.0: + version "24.0.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" + integrity sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tsutils@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5" - integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA== + version "3.10.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" + integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== dependencies: tslib "^1.8.1" -tty-browserify@0.0.0, tty-browserify@~0.0.0: +tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" - mime-types "~2.1.15" + mime-types "~2.1.18" -typedarray@~0.0.5: +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192" - integrity sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg== +typescript@^3.3.3333: + version "3.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.4.tgz#aac4a08abecab8091a75f10842ffa0631818f785" + integrity sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA== -uglify-es@^3.3.9: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" +uglify-js@^3.1.4: + version "3.5.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.5.tgz#9c5aaaf3a7586fbf559df31fa6d3bca1b3ba7e9b" + integrity sha512-e58FqZzPwaLODQetDQKlvErZaGkh1UmzP8YwU0aG65NLourKNtwVyDG8tkIyUU0vqWzxaikSvTaxrCSscmvqvQ== dependencies: - commander "~2.13.0" + commander "~2.20.0" source-map "~0.6.1" -uglify-js@^2.6, uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^0.4.4: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - -ultron@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.0.tgz#b07a2e6a541a815fc6a34ccd4533baec307ca864" - -umd@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" - -unicode-canonical-property-names-ecmascript@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz#f6119f417467593c0086357c85546b6ad5abc583" - unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - -unicode-match-property-ecmascript@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz#db9b1cb4ffc67e0c5583780b1b59370e4cbe97b9" - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.2" - unicode-property-aliases-ecmascript "^1.0.3" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" -unicode-match-property-value-ecmascript@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz#fea059120a016f403afd3bf586162b4db03e0604" - -unicode-match-property-value-ecmascript@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - -unicode-property-aliases-ecmascript@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz#ac3522583b9e630580f916635333e00c5ead690d" +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" set-value "^0.4.3" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@~1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -6631,353 +7852,397 @@ uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url@^0.11.0, url@~0.11.0: +url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0: +util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== dependencies: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" -util@0.10.3, util@^0.10.3, util@~0.10.1: +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" -uuid@^3.0.0, uuid@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@0.0.4, vm-browserify@~0.0.1: +vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" w3c-hr-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= dependencies: browser-process-hrtime "^0.1.2" -walker@~1.0.5: +walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - -watchpack@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: - async "^2.1.2" - chokidar "^1.4.3" + chokidar "^2.0.2" graceful-fs "^4.1.2" + neo-async "^2.5.0" webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -webpack-bundle-analyzer@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.8.2.tgz#8b6240c29a9d63bc72f09d920fb050adbcce9fe8" - dependencies: - acorn "^5.0.3" - chalk "^1.1.3" - commander "^2.9.0" - ejs "^2.5.6" - express "^4.15.2" - filesize "^3.5.9" - gzip-size "^3.0.0" - lodash "^4.17.4" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f" + integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA== + dependencies: + acorn "^6.0.7" + acorn-walk "^6.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.10" mkdirp "^0.5.1" - opener "^1.4.3" - ws "^2.3.1" + opener "^1.5.1" + ws "^6.0.0" -webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== dependencies: source-list-map "^2.0.0" - source-map "~0.5.3" + source-map "~0.6.1" -webpack@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.0.0.tgz#ee9bcebf21247f7153cb410168cab45e3a59d4d7" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^5.1.5" - ajv-keywords "^2.0.0" - async "^2.1.2" - enhanced-resolve "^3.0.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" +webpack@^4.29.6: + version "4.30.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.30.0.tgz#aca76ef75630a22c49fcc235b39b4c57591d33a9" + integrity sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^3.1.0" - tapable "~0.2.5" - uglifyjs-webpack-plugin "^0.4.4" - watchpack "^1.3.1" - webpack-sources "^1.0.1" - yargs "^6.0.0" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== dependencies: - iconv-lite "0.4.19" + iconv-lite "0.4.24" -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^6.4.0, whatwg-url@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.1" webidl-conversions "^4.0.2" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.10: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.12, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" +which@^1.2.10, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: string-width "^1.0.2 || 2" widest-line@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" signal-exit "^3.0.2" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" -ws@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-2.3.1.tgz#6b94b3e447cb6a363f785eaf94af6359e8e81c80" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== dependencies: - safe-buffer "~5.0.1" - ultron "~1.1.0" + async-limiter "~1.0.0" -ws@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" +ws@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== dependencies: async-limiter "~1.0.0" - safe-buffer "~5.1.0" xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: - camelcase "^3.0.0" + camelcase "^4.1.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" +yargs-parser@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b" + integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" + decamelize "^1.2.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^6.0.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" +yargs@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.2.tgz#0c101f580ae95cea7f39d927e7770e3fdc97f993" + integrity sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA== dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" + cliui "^4.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" + y18n "^4.0.0" + yargs-parser "^13.0.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" +yup@^0.26.10: + version "0.26.10" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" + integrity sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw== dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + "@babel/runtime" "7.0.0" + fn-name "~2.0.1" + lodash "^4.17.10" + property-expr "^1.5.0" + synchronous-promise "^2.0.5" + toposort "^2.0.2" From a5011ad9c329e363279da0a04fe4b54b8bec6879 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 4 Jun 2019 10:48:21 +0200 Subject: [PATCH 0065/1043] Warn instead of die on double disposals --- src/core/reaction.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/reaction.ts b/src/core/reaction.ts index 7aa4f7e8e..e98d92873 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -120,7 +120,8 @@ export class Reaction implements IDerivation, IReactionPublic { track(fn: () => void) { if (this.isDisposed) { - fail("Reaction already disposed") + return + // console.warn("Reaction already disposed") // Note: Not a warning / error in mobx 4 either } startBatch() const notify = isSpyEnabled() From b56ca5fcc86420cfbf8654a1e1837b1d34b2ce56 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 4 Jun 2019 11:02:06 +0200 Subject: [PATCH 0066/1043] Cherry-picked #1975: update size-limit --- .size-limit.json | 7 + package.json | 4 +- yarn.lock | 625 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 589 insertions(+), 47 deletions(-) create mode 100644 .size-limit.json diff --git a/.size-limit.json b/.size-limit.json new file mode 100644 index 000000000..1ec055dfa --- /dev/null +++ b/.size-limit.json @@ -0,0 +1,7 @@ +[ + { + "path": "lib/mobx.js", + "limit": "20 KB", + "running": false + } +] diff --git a/package.json b/package.json index 0ef6ec03d..233f09393 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "quick-build": "tsc --pretty", "small-build": "node scripts/build.js", "lint": "eslint src/**/*.ts", - "size": "size-limit --babili 20KB lib/mobx.js", + "size": "size-limit", "publish-script": "node scripts/publish.js" }, "repository": { @@ -72,7 +72,7 @@ "rollup-plugin-terser": "^4.0.4", "serializr": "^1.5.1", "shelljs": "^0.8.3", - "size-limit": "^1.0.0", + "size-limit": "^1.3.3", "tape": "^4.10.1", "ts-jest": "^24.0.0", "tslib": "^1.9.3", diff --git a/yarn.lock b/yarn.lock index e45ad94fd..86d51eb59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -686,6 +686,15 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@condenast/perf-timeline-cli@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@condenast/perf-timeline-cli/-/perf-timeline-cli-0.1.3.tgz#bd9de5760d6cf5eca153a54400ec747be8b254c9" + integrity sha512-NedubRAGM2qDpMPjNVXYJHHuVckNpclWuj7/CUARwNoxrqqfrGik9UZo6NZGl/7mTasFNjnW3fy0fomYER/qsg== + dependencies: + cli-logger "^0.5.40" + puppeteer "^1.2.0" + yargs "^11.1.0" + "@jest/console@^24.7.1": version "24.7.1" resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" @@ -929,6 +938,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" @@ -1185,6 +1199,13 @@ acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -1222,7 +1243,7 @@ ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-regex@^2.0.0: +ansi-regex@^2.0.0, ansi-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= @@ -1493,6 +1514,15 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bigrig@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bigrig/-/bigrig-1.3.0.tgz#1f2a4822082c514659d06d7873ff4386b0d179e5" + integrity sha1-HypIIggsUUZZ0G14c/9DhrDReeU= + dependencies: + cli-color "^1.1.0" + mkdirp "^0.5.1" + yargs "^3.29.0" + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -1802,6 +1832,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1918,6 +1953,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circular@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/circular/-/circular-1.0.5.tgz#7da77af98bbde9ce4b5b358cd556b5dded2d3149" + integrity sha1-fad6+Yu96c5LWzWM1Va13e0tMUk= + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1933,6 +1973,18 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cli-color@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" + integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== + dependencies: + ansi-regex "^2.1.1" + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + memoizee "^0.4.14" + timers-ext "^0.1.5" + cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -1940,6 +1992,19 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-logger@^0.5.40: + version "0.5.40" + resolved "https://registry.yarnpkg.com/cli-logger/-/cli-logger-0.5.40.tgz#097f0e11b072c7c698a26c47f588a29c20b48b0b" + integrity sha1-CX8OEbByx8aYomxH9YiinCC0iws= + dependencies: + circular "^1.0.5" + cli-util "~1.1.27" + +cli-regexp@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-regexp/-/cli-regexp-0.1.2.tgz#6bcd93b09fb2ed1025d30a1155d5997954a53512" + integrity sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI= + cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" @@ -1948,11 +2013,27 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" +cli-util@~1.1.27: + version "1.1.27" + resolved "https://registry.yarnpkg.com/cli-util/-/cli-util-1.1.27.tgz#42d69e36a040a321fc9cf851c1513cadc5093054" + integrity sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ= + dependencies: + cli-regexp "~0.1.0" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1962,6 +2043,15 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2071,7 +2161,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: +concat-stream@1.6.2, concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -2167,7 +2257,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7, cosmiconfig@^5.2.0: +cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7: version "5.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.0.tgz#45038e4d28a7fe787203aede9c25bca4a08b12c8" integrity sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g== @@ -2177,6 +2267,16 @@ cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7, cosmiconfig@^5.2.0: js-yaml "^3.13.0" parse-json "^4.0.0" +cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + coveralls@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.3.tgz#83b1c64aea1c6afa69beaf50b55ac1bc4d13e2b8" @@ -2435,6 +2535,13 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2482,7 +2589,7 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -2579,6 +2686,19 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -2812,6 +2932,54 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.50" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.6" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2927,6 +3095,17 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" +estimo@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/estimo/-/estimo-0.1.9.tgz#76875dc8e3f8c7b4d0e11ad0bccae1f6e3b5368a" + integrity sha512-8154FqD1aaJuj95BKazdywVmPa8IIKOVDE7s9MFZI6s4QDbTZv+ITI39BMNwdzg8zcQ0/utAvzfzSJI6/4HcrA== + dependencies: + "@condenast/perf-timeline-cli" "^0.1.3" + bigrig "^1.3.0" + cross-spawn "^6.0.5" + nanoid "^2.0.1" + yargs "^13.2.2" + estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -2947,6 +3126,14 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -3105,6 +3292,16 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -3149,6 +3346,13 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3234,6 +3438,13 @@ find-parent-dir@^0.3.0: resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3241,6 +3452,13 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" + integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q== + dependencies: + locate-path "^5.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -3528,6 +3746,14 @@ gzip-size@^5.0.0: duplexer "^0.1.1" pify "^4.0.1" +gzip-size@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + handlebars@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" @@ -3698,6 +3924,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + husky@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" @@ -3871,6 +4105,11 @@ invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -4065,6 +4304,11 @@ is-path-cwd@^1.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= +is-path-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" + integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== + is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" @@ -4072,6 +4316,13 @@ is-path-in-cwd@^1.0.0: dependencies: is-path-inside "^1.0.0" +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -4079,6 +4330,13 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4086,7 +4344,7 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-promise@^2.1.0: +is-promise@^2.1, is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= @@ -4755,6 +5013,13 @@ last-call-webpack-plugin@^3.0.0: lodash "^4.17.5" webpack-sources "^1.1.0" +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" @@ -4884,6 +5149,14 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: emojis-list "^2.0.0" json5 "^1.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -4892,6 +5165,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4945,7 +5225,7 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4967,6 +5247,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + magic-string@^0.25.2: version "0.25.2" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" @@ -4982,6 +5269,13 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + make-error@1.x: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" @@ -5044,6 +5338,13 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + mem@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" @@ -5053,7 +5354,21 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: +memoizee@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -5127,6 +5442,11 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@^2.0.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" + integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -5213,7 +5533,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.1, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -5252,6 +5572,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== +nanoid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.3.tgz#dde999e173bc9d7bd2ee2746b89909ade98e075e" + integrity sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -5298,6 +5623,11 @@ neo-async@^2.5.0, neo-async@^2.6.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +next-tick@1, next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -5396,7 +5726,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -5491,7 +5821,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -5611,6 +5941,22 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" @@ -5655,13 +6001,27 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.0.0: +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: p-try "^2.0.0" +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -5669,6 +6029,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -5684,6 +6051,11 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -5803,6 +6175,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -6244,7 +6621,7 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -6262,6 +6639,15 @@ prompts@^2.0.1: kleur "^3.0.2" sisteransi "^1.0.0" +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + property-expr@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" @@ -6275,6 +6661,11 @@ proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.9.0" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6350,6 +6741,20 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer@^1.2.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.17.0.tgz#371957d227a2f450fa74b78e78a2dadb2be7f14f" + integrity sha512-3EXZSximCzxuVKpIHtyec8Wm2dWZn1fc5tQi34qWfiUgubEVYHjUvr0GOJojqf3mifI6oyKnCdrGxaOI+lWReA== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -6410,11 +6815,21 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-is@^16.8.4: +react-is@^16.8.1, react-is@^16.8.4: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== +react@16.8.6: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" + integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + read-pkg-up@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" @@ -6423,13 +6838,14 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-5.0.0.tgz#b6a6741cb144ed3610554f40162aa07a6db621b8" - integrity sha512-XBQjqOBtTzyol2CpsQOw8LHV0XbDZVG7xMMjmXAJomlVY03WOBRmYgDJETlvcg0H63AJvPRwT7GFi5rvOzUOKg== +read-pkg-up@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" + integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== dependencies: - find-up "^3.0.0" - read-pkg "^5.0.0" + find-up "^4.0.0" + read-pkg "^5.1.1" + type-fest "^0.5.0" read-pkg@^3.0.0: version "3.0.0" @@ -6449,13 +6865,15 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -read-pkg@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.0.0.tgz#75449907ece8dfb89cbc76adcba2665316e32b94" - integrity sha512-OWufaRc67oJjcgrxckW/qO9q22iYzyiONh8h+GMcnOvSHAmhV1Dr3x+gyRjP+Qxc5jKupkSfoCQLS/98rDPh9A== +read-pkg@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" + integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== dependencies: - normalize-package-data "^2.3.2" + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" parse-json "^4.0.0" + type-fest "^0.4.1" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" @@ -6705,7 +7123,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -6846,6 +7264,14 @@ sax@^1.2.4, sax@~1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@^0.13.6: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -7021,28 +7447,30 @@ sisteransi@^1.0.0: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== -size-limit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-1.0.1.tgz#42c6ef9fe68adcab3627191396852e37f1df8593" - integrity sha512-E5pzKguJesgTTp5pen2W1TDFC95AoovRQNJ1CB4LVF3SBcyvCYUk4pQN67xUO3cItfphNrrXXgCBmzrbArZaHg== +size-limit@^1.3.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-1.3.5.tgz#29b6dd0354afa2911ad4092a795266221e5860cd" + integrity sha512-OswnALGfujpnI2tkJl982QVjsXsNTo5MypobMciZaoPMyDzvKLurTDGCvsgcEcIb4fWXAc6yMMm7kuGcKs/GfA== dependencies: bytes "^3.1.0" chalk "^2.4.2" ci-job-number "^0.3.0" compression-webpack-plugin "^2.0.0" - cosmiconfig "^5.2.0" + cosmiconfig "^5.2.1" css-loader "^2.1.1" - escape-string-regexp "^1.0.5" + del "^4.1.1" + estimo "^0.1.9" file-loader "^3.0.1" globby "^9.2.0" - gzip-size "^5.0.0" - memory-fs "^0.4.1" + gzip-size "^5.1.1" + make-dir "^3.0.0" optimize-css-assets-webpack-plugin "^5.0.1" - read-pkg-up "^5.0.0" + react "16.8.6" + read-pkg-up "^6.0.0" style-loader "^0.23.1" - webpack "^4.29.6" - webpack-bundle-analyzer "^3.2.0" - yargs "^13.2.2" + webpack "^4.32.2" + webpack-bundle-analyzer "^3.3.2" + yargs "^13.2.4" slash@^2.0.0: version "2.0.0" @@ -7297,7 +7725,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -7352,7 +7780,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -7585,6 +8013,14 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + timsort@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" @@ -7731,6 +8167,16 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -7966,7 +8412,7 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-bundle-analyzer@^3.2.0: +webpack-bundle-analyzer@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f" integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA== @@ -7993,10 +8439,10 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.29.6: - version "4.30.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.30.0.tgz#aca76ef75630a22c49fcc235b39b4c57591d33a9" - integrity sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg== +webpack@^4.32.2: + version "4.32.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" + integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== dependencies: "@webassemblyjs/ast" "1.8.5" "@webassemblyjs/helper-module-context" "1.8.5" @@ -8084,6 +8530,11 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -8117,6 +8568,15 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8145,7 +8605,7 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.0.0: +ws@^6.0.0, ws@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== @@ -8162,6 +8622,11 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -8200,6 +8665,39 @@ yargs-parser@^13.0.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" + integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + yargs@^12.0.2: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" @@ -8235,6 +8733,43 @@ yargs@^13.2.2: y18n "^4.0.0" yargs-parser "^13.0.0" +yargs@^13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^3.29.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" + yup@^0.26.10: version "0.26.10" resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" From 36f51a0a82784841c733f29ee8a1c105f4b90373 Mon Sep 17 00:00:00 2001 From: Terence Bezman Date: Wed, 8 May 2019 12:03:24 -0700 Subject: [PATCH 0067/1043] cherry picked #1960: improve property descriptor type for flow --- flow-typed/mobx.js | 333 +++++++++++++++++++++++---------------------- 1 file changed, 174 insertions(+), 159 deletions(-) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index 1528b3f94..d7d9abd10 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -3,31 +3,31 @@ export type IObservableMapInitialValues = IMapEntries | KeyValueMap | IMap export interface IMobxConfigurationOptions { - +enforceActions?: boolean | "strict" | "never" | "always" | "observed", - computedRequiresReaction?: boolean, - isolateGlobalState?: boolean, - disableErrorBoundaries?: boolean, - arrayBuffer?: number, - reactionScheduler?: (f: () => void) => void + +enforceActions?: boolean | "strict" | "never" | "always" | "observed"; + computedRequiresReaction?: boolean; + isolateGlobalState?: boolean; + disableErrorBoundaries?: boolean; + arrayBuffer?: number; + reactionScheduler?: (f: () => void) => void; } declare export function configure(options: IMobxConfigurationOptions): void export interface IAutorunOptions { - delay?: number, - name?: string, - scheduler?: (callback: () => void) => any, - onError?: (error: any) => void + delay?: number; + name?: string; + scheduler?: (callback: () => void) => any; + onError?: (error: any) => void; } export interface IReactionOptions extends IAutorunOptions { - fireImmediately?: boolean, - equals?: IEqualsComparer + fireImmediately?: boolean; + equals?: IEqualsComparer; } export interface IInterceptable { - interceptors: IInterceptor[] | any, - intercept(handler: IInterceptor): Lambda + interceptors: IInterceptor[] | any; + intercept(handler: IInterceptor): Lambda; } export type IEqualsComparer = (a: T, b: T) => boolean @@ -39,130 +39,137 @@ export type IMapEntry = [K, V] export type IMapEntries = IMapEntry[] export interface IMap { - clear(): void, - delete(key: K): boolean, - forEach(callbackfn: (value: V, index: K, map: IMap) => void, thisArg?: any): void, - get(key: K): V | any, - has(key: K): boolean, - set(key: K, value?: V): any, - size: number + clear(): void; + delete(key: K): boolean; + forEach(callbackfn: (value: V, index: K, map: IMap) => void, thisArg?: any): void; + get(key: K): V | any; + has(key: K): boolean; + set(key: K, value?: V): any; + size: number; } declare export function isObservableMap(x: any): boolean export interface IComputedValueOptions { + get?: () => T; + set?: (value: T) => void; + name?: string; + equals?: IEqualsComparer; + context?: any; +} + +type PropertyDescriptor = { + enumerable?: boolean, + configurable?: boolean, + writable?: boolean, + value?: T, get?: () => T, - set?: (value: T) => void, - name?: string, - equals?: IEqualsComparer, - context?: any + set?: (value: T) => void } -declare type PropertyDescriptor = any - export interface IComputed { - (func: () => T, setter?: (value: T) => void): IComputedValue, - (func: () => T, options: IComputedValueOptions): IComputedValue, - (target: Object, key: string, baseDescriptor?: PropertyDescriptor): void, - struct(target: Object, key: string, baseDescriptor?: PropertyDescriptor): void + (func: () => T, setter?: (value: T) => void): IComputedValue; + (func: () => T, options: IComputedValueOptions): IComputedValue; + (target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): void; + struct(target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): void; } export interface IDependencyTree { - name: string, - dependencies?: IDependencyTree[] + name: string; + dependencies?: IDependencyTree[]; } export interface IObserverTree { - name: string, - observers?: IObserverTree[] + name: string; + observers?: IObserverTree[]; } export interface IAtom { - reportObserved: () => void, - reportChanged: () => void + reportObserved: () => void; + reportChanged: () => void; } export interface IComputedValue { - get(): T, - set(value: T): void, - observe(listener: (newValue: T, oldValue: T) => void, fireImmediately?: boolean): Lambda + get(): T; + set(value: T): void; + observe(listener: (newValue: T, oldValue: T) => void, fireImmediately?: boolean): Lambda; } export interface IObservable {} export interface IDepTreeNode { - name: string, - observing?: IObservable[] + name: string; + observing?: IObservable[]; } export interface IDerivation { - name: string + name: string; } export interface IReactionPublic { - dispose: () => void, - trace: (enterBreakPoint?: boolean) => void + dispose: () => void; + trace: (enterBreakPoint?: boolean) => void; } declare export class IListenable { - observe(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda + observe(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda; } export interface IObservableArray extends Array { - spliceWithArray(index: number, deleteCount?: number, newItems?: T[]): T[], + spliceWithArray(index: number, deleteCount?: number, newItems?: T[]): T[]; observe( listener: (changeData: IArrayChange | IArraySplice) => void, fireImmediately?: boolean - ): Lambda, - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda, - intercept(handler: IInterceptor | IArraySplice>): Lambda, - intercept(handler: IInterceptor | IArraySplice>): Lambda, - clear(): T[], - replace(newItems: T[]): T[], + ): Lambda; + intercept(handler: IInterceptor | IArrayWillSplice>): Lambda; + intercept(handler: IInterceptor | IArraySplice>): Lambda; + intercept(handler: IInterceptor | IArraySplice>): Lambda; + clear(): T[]; + replace(newItems: T[]): T[]; find( predicate: (item: T, index: number, array: Array) => boolean, thisArg?: any, fromIndex?: number - ): T | any, + ): T | any; findIndex( predicate: (item: T, index: number, array: Array) => boolean, thisArg?: any, fromIndex?: number - ): number, - remove(value: T): boolean + ): number; + remove(value: T): boolean; } export interface IArrayChange { - type: "update", - object: IObservableArray, - index: number, - newValue: T, - oldValue: T + type: "update"; + object: IObservableArray; + index: number; + newValue: T; + oldValue: T; } export interface IArraySplice { - type: "splice", - object: IObservableArray, - index: number, - added: T[], - addedCount: number, - removed: T[], - removedCount: number + type: "splice"; + object: IObservableArray; + index: number; + added: T[]; + addedCount: number; + removed: T[]; + removedCount: number; } export interface IArrayWillChange { - type: "update", - object: IObservableArray, - index: number, - newValue: T + type: "update"; + object: IObservableArray; + index: number; + newValue: T; } export interface IArrayWillSplice { - type: "splice", - object: IObservableArray, - index: number, - added: T[], - removedCount: number + type: "splice"; + object: IObservableArray; + index: number; + added: T[]; + removedCount: number; } export type KeyValueMap = { @@ -170,70 +177,70 @@ export type KeyValueMap = { } export interface IMapChange { - object: ObservableMap, - type: "update" | "add" | "delete", - name: K, - newValue?: any, - oldValue?: any + object: ObservableMap; + type: "update" | "add" | "delete"; + name: K; + newValue?: any; + oldValue?: any; } export interface IMapWillChange { - object: ObservableMap, - type: "update" | "add" | "delete", - name: K, - newValue?: any + object: ObservableMap; + type: "update" | "add" | "delete"; + name: K; + newValue?: any; } export interface IObservableObject {} export interface IObjectChange { - name: string, - object: any, - type: "update" | "add" | "remove", - oldValue?: any, - newValue: any + name: string; + object: any; + type: "update" | "add" | "remove"; + oldValue?: any; + newValue: any; } export interface IObjectWillChange { - object: any, - type: "update" | "add" | "remove", - name: string, - newValue: any + object: any; + type: "update" | "add" | "remove"; + name: string; + newValue: any; } export interface IValueWillChange { - object: any, - type: "update", - newValue: T + object: any; + type: "update"; + newValue: T; } export interface IValueDidChange extends IValueWillChange { - oldValue: ?T + oldValue: ?T; } export interface IObservableValue { - get(): T, - set(value: T): void, - intercept(handler: IInterceptor>): Lambda, - observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda + get(): T; + set(value: T): void; + intercept(handler: IInterceptor>): Lambda; + observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda; } export interface IEnhancer { - (newValue: T, oldValue: T | void, name: string): T + (newValue: T, oldValue: T | void, name: string): T; } export interface IObservableFactory { // observable overloads - (target: Object, key: string, baseDescriptor?: PropertyDescriptor): any, - (value: Array): IObservableArray, - (value: null | void): IObservableValue, - (value: null | void): IObservableValue, - (value: IMap): ObservableMap, - (value: T): T + (target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): any; + (value: Array): IObservableArray; + (value: null | void): IObservableValue; + (value: null | void): IObservableValue; + (value: IMap): ObservableMap; + (value: T): T; } export type IObservableDecorator = { - (target: Object, property: string, descriptor?: PropertyDescriptor): void, + (target: Object, property: string, descriptor?: PropertyDescriptor<*>): void, enhancer: IEnhancer } @@ -244,58 +251,66 @@ export type CreateObservableOptions = { } declare export class IObservableFactories { - box(value?: T, options?: CreateObservableOptions): IObservableValue, - array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray, + box(value?: T, options?: CreateObservableOptions): IObservableValue; + array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray; map( initialValues?: IObservableMapInitialValues, options?: CreateObservableOptions - ): ObservableMap, - object(props: T, options?: CreateObservableOptions): T & IObservableObject, - ref(target: Object, property?: string, descriptor?: PropertyDescriptor): IObservableDecorator, + ): ObservableMap; + object(props: T, options?: CreateObservableOptions): T & IObservableObject; + ref( + target: Object, + property?: string, + descriptor?: PropertyDescriptor<*> + ): IObservableDecorator; shallow( target: Object, property?: string, - descriptor?: PropertyDescriptor - ): IObservableDecorator, - deep(target: Object, property?: string, descriptor?: PropertyDescriptor): IObservableDecorator + descriptor?: PropertyDescriptor<*> + ): IObservableDecorator; + deep( + target: Object, + property?: string, + descriptor?: PropertyDescriptor<*> + ): IObservableDecorator; } export interface Lambda { - (): void, - name?: string + (): void; + name?: string; } export interface IActionFactory { - (a1: any, a2?: any, a3?: any, a4?: any, a6?: any): any, - bound(target: Object, propertyKey: string, descriptor?: PropertyDescriptor): void + (a1: any, a2?: any, a3?: any, a4?: any, a6?: any): any; + bound(target: Object, propertyKey: string, descriptor?: PropertyDescriptor<*>): void; } declare export class ObservableMap { - constructor(initialData?: IMapEntries | KeyValueMap, valueModeFunc?: Function): this, - has(key: K): boolean, - set(key: K, value: V): void, - delete(key: K): boolean, - get(key: K): V, - keys(): Iterator, - values(): Iterator, - entries(): IMapEntries & Iterator>, - forEach(callback: (value: V, key: K, object: KeyValueMap) => void, thisArg?: any): void, - merge(other: ObservableMap | KeyValueMap): ObservableMap, - clear(): void, - replace(other: ObservableMap | KeyValueMap): ObservableMap, - size: number, - toJS(): Map, - toPOJO(): KeyValueMap, - toJSON(): KeyValueMap, - toString(): string, - observe(listener: (changes: IMapChange) => void, fireImmediately?: boolean): Lambda, - intercept(handler: IInterceptor>): Lambda + constructor(initialData?: IMapEntries | KeyValueMap, valueModeFunc?: Function): this; + has(key: K): boolean; + set(key: K, value: V): void; + delete(key: K): boolean; + get(key: K): V; + keys(): Iterator; + values(): Iterator; + entries(): IMapEntries & Iterator>; + forEach(callback: (value: V, key: K, object: KeyValueMap) => void, thisArg?: any): void; + merge(other: ObservableMap | KeyValueMap): ObservableMap; + clear(): void; + replace(other: ObservableMap | KeyValueMap): ObservableMap; + size: number; + toJS(): Map; + toPOJO(): KeyValueMap; + toJSON(): KeyValueMap; + toString(): string; + observe(listener: (changes: IMapChange) => void, fireImmediately?: boolean): Lambda; + intercept(handler: IInterceptor>): Lambda; } declare export function action( targetOrName: any, propertyKeyOrFuc?: any, - descriptor?: PropertyDescriptor + descriptor?: PropertyDescriptor<*> ): any declare export function action(name: string, func: T): T declare export function action(func: T): T @@ -314,9 +329,9 @@ declare export function reaction( ): () => void export interface IWhenOptions { - name?: string, - timeout?: number, - onError?: (error: any) => void + name?: string; + timeout?: number; + onError?: (error: any) => void; } declare export function when( @@ -329,7 +344,7 @@ declare export function when(cond: () => boolean, options?: IWhenOptions): Promi declare export function computed( target: any, key?: string, - baseDescriptor?: PropertyDescriptor + baseDescriptor?: PropertyDescriptor<*> ): any declare export function extendObservable( @@ -401,8 +416,8 @@ declare export function observe( ): Lambda export interface ToJSOptions { - detectCycles?: boolean, - exportMapsAsObjects?: boolean + detectCycles?: boolean; + exportMapsAsObjects?: boolean; } declare export function toJS(source: T, options?: ToJSOptions): T @@ -420,18 +435,18 @@ declare export function isObservableObject(thing: T): boolean declare export function isArrayLike(x: any): boolean declare export class Reaction { - name: string, - isDisposed: boolean, - constructor(name: string, onInvalidate: () => void): this, - schedule(): void, - isScheduled(): boolean, - track(fn: () => void): void, - dispose(): void, + name: string; + isDisposed: boolean; + constructor(name: string, onInvalidate: () => void): this; + schedule(): void; + isScheduled(): boolean; + track(fn: () => void): void; + dispose(): void; getDisposer(): Lambda & { $mosbservable: Reaction - }, - toString(): string, - trace(enterBreakPoint?: boolean): void + }; + toString(): string; + trace(enterBreakPoint?: boolean): void; } declare export function createAtom( From f3e30652545086834b0245024a693f5d5180041a Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 4 Jun 2019 11:32:32 +0200 Subject: [PATCH 0068/1043] better implementation of getPlainObjectKeys (only enumerables) --- src/utils/utils.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index c0c76ec8d..ca9aaa18d 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -151,19 +151,17 @@ export function isES6Set(thing): thing is Set { } /** - * Returns the following: own keys, prototype keys & own symbol keys. + * Returns the following: own keys, prototype keys & own symbol keys, if they are enumerable. */ export function getPlainObjectKeys(object) { - return unique( - ([] as PropertyKey[]).concat.apply( - [], - [ - Object.keys(object), - Object.keys(Object.getPrototypeOf(object)), - Object.getOwnPropertySymbols(object) - ] - ) - ) + const enumerables = new Set() + for (let key in object) enumerables.add(key) // *all* enumerables + Object.getOwnPropertySymbols(object).forEach(k => { + if (Object.getOwnPropertyDescriptor(object, k)!.enumerable) enumerables.add(k) + }) // *own* symbols + // Note: this implementation is missing enumerable, inherited, symbolic property names! That would however pretty expensive to add, + // as there is no efficient iterator that returns *all* properties + return Array.from(enumerables) } export function stringifyKey(key: any): string { From d8ac62144077c8276391513b89a1a9211c79cd77 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 4 Jun 2019 12:33:35 +0200 Subject: [PATCH 0069/1043] Published version 5.10.0 --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b70481d..d56843e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ +# 5.10.0 / 4.10.0 + +* Added support for symbol named properties in maps and objects. Fixes [#1809](https://github.com/mobxjs/mobx/issues/1809) and [#1925](https://github.com/mobxjs/mobx/issues/1925) through [#1944](https://github.com/mobxjs/mobx/pull/1944) by [@loklaan](https://github.com/loklaan) * Added `set` support for `observable.set`, see [#1945](https://github.com/mobxjs/mobx/pull/1945) by [xaviergonz](https://github.com/xaviergonz) +* Fixed events for arrays using the wrong object, [#1964](https://github.com/mobxjs/mobx/pull/1964) by [xaviergonz](https://github.com/xaviergonz) +* Improved flow typings [#1960](https://github.com/mobxjs/mobx/pull/1960) by [@tbezman](https://github.com/tbezman) +* Updated tooling, [#1949](https://github.com/mobxjs/mobx/pull/1949) and [#1931](https://github.com/mobxjs/mobx/pull/1931) by [xaviergonz](https://github.com/xaviergonz) # 5.9.4 / 4.9.4 diff --git a/package.json b/package.json index 233f09393..a5a35f993 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.9.4", + "version": "5.10.0", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", From 585c5532669496489e40850aff1e52bc42fa0bd5 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sun, 9 Jun 2019 09:36:52 +0200 Subject: [PATCH 0070/1043] Fix array update proxy (#1985) * fix array proxy for update * revert wrong formatting * revert wrong formatting * add unit test --- src/types/observablearray.ts | 2 +- test/base/intercept.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 5759f7298..f7a5293d6 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -444,7 +444,7 @@ const arrayExtensions = { if (hasInterceptors(adm)) { const change = interceptChange>(adm as any, { type: "update", - object: this.proxy, + object: adm.proxy as any, // since "this" is the real array we need to pass its proxy index, newValue }) diff --git a/test/base/intercept.js b/test/base/intercept.js index c13843c93..8eb01e5a2 100644 --- a/test/base/intercept.js +++ b/test/base/intercept.js @@ -18,6 +18,7 @@ test("intercept observable value", () => { expect(a.get()).toBe(3) d = intercept(a, c => { + expect(c.object).toBe(a) if (c.newValue % 2 === 0) { throw "value should be odd!" } @@ -34,6 +35,7 @@ test("intercept observable value", () => { d() d = intercept(a, c => { + expect(c.object).toBe(a) c.newValue *= 2 return c }) @@ -42,6 +44,7 @@ test("intercept observable value", () => { expect(a.get()).toBe(12) intercept(a, c => { + expect(c.object).toBe(a) c.newValue += 1 return c }) @@ -64,6 +67,7 @@ test("intercept array", () => { d() d = intercept(a, c => { + expect(c.object).toBe(a) if (c.type === "splice") { c.added.push(c.added[0] * 2) c.removedCount = 1 @@ -87,6 +91,7 @@ test("intercept object", () => { }) intercept(a, change => { + expect(change.object).toBe(a) change.newValue *= 3 return change }) @@ -121,6 +126,7 @@ test("intercept object", () => { test("intercept property additions", () => { const a = m.observable({}) const d4 = intercept(a, change => { + expect(change.object).toBe(a) if (change.type === "add") { return null } @@ -144,6 +150,7 @@ test("intercept map", () => { }) intercept(a, c => { + expect(c.object).toBe(a) c.newValue *= 3 return c }) @@ -161,6 +168,7 @@ test("intercept map", () => { expect(a.get("b")).toBe(16) const d3 = intercept(a, c => { + expect(c.object).toBe(a) expect(c.name).toBe("b"), expect(c.object).toBe(a) expect(c.type).toBe("update") return null @@ -174,6 +182,7 @@ test("intercept map", () => { expect(a.get("b")).toBe(22) const d4 = intercept(a, c => { + expect(c.object).toBe(a) if (c.type === "delete") return null return c }) From 1cacbbbf9a9238d1c8a748b02a9ece1560b1f0e7 Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Sun, 9 Jun 2019 09:42:22 +0200 Subject: [PATCH 0071/1043] updated changelog for 5.10.1 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d56843e87..7ca6cf102 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 5.10.1 + +* Fixed a recent regression where array update events would send undefined as `change.object` through [#1985](https://github.com/mobxjs/mobx/pull/1985) by [xaviergonz](https://github.com/xaviergonz) + # 5.10.0 / 4.10.0 * Added support for symbol named properties in maps and objects. Fixes [#1809](https://github.com/mobxjs/mobx/issues/1809) and [#1925](https://github.com/mobxjs/mobx/issues/1925) through [#1944](https://github.com/mobxjs/mobx/pull/1944) by [@loklaan](https://github.com/loklaan) From 64911895ae59bd85e864fd3e21a382b0d04a134d Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Sun, 9 Jun 2019 09:47:49 +0200 Subject: [PATCH 0072/1043] Published version 5.10.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5a35f993..b6c0f098f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.10.0", + "version": "5.10.1", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", From 4c6b113d0a5345160c723d210b19b4a4843b0098 Mon Sep 17 00:00:00 2001 From: chenqiangsheng <466712071@qq.com> Date: Mon, 10 Jun 2019 16:20:22 +0800 Subject: [PATCH 0073/1043] modify types --- src/core/atom.ts | 3 ++- src/types/observableobject.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/atom.ts b/src/core/atom.ts index 85a37f9e9..4aa3256f6 100644 --- a/src/core/atom.ts +++ b/src/core/atom.ts @@ -1,6 +1,7 @@ import { IDerivationState, IObservable, + IDerivation, createInstanceofPredicate, endBatch, getNextId, @@ -23,7 +24,7 @@ export interface IAtom extends IObservable { export class Atom implements IAtom { isPendingUnobservation = false // for effective unobserving. BaseAtom has true, for extra optimization, so its onBecomeUnobserved never gets called, because it's not needed isBeingObserved = false - observers = new Set() + observers = new Set() diffValue = 0 lastAccessedBy = 0 diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 594a9e0d7..bef78cdf1 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -87,7 +87,7 @@ export class ObservableObjectAdministration public name: string, public defaultEnhancer: IEnhancer ) { - this.keysAtom = new Atom(name + ".keys") + this.keysAtom = new Atom(name + ".keys") as IAtom } read(key: PropertyKey) { From 56063d5f02e07f692312213dc04f3e98fd83e19c Mon Sep 17 00:00:00 2001 From: Pavel Pustovalov Date: Wed, 12 Jun 2019 15:35:11 +0300 Subject: [PATCH 0074/1043] Use circleci instead of travis for ci (#1996) --- .circleci/config.yml | 138 +++++++++++++++++++++++++++++++++++++++++++ .editorconfig | 4 +- .travis.yml | 12 ---- README.md | 4 +- package.json | 10 ++-- 5 files changed, 147 insertions(+), 21 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 .travis.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..a0b6dddef --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,138 @@ +version: 2.1 + +executors: + my-executor: + docker: + - image: circleci/node:11 + environment: + CI: true + working_directory: ~/mobx + +jobs: + build: + executor: my-executor + steps: + - checkout + + - restore_cache: + name: restore .cache/yarn + keys: + - yarn-cache-{{ arch }} + - restore_cache: + name: restore node_modules + keys: + - node-modules-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }} + - node-modules-{{ arch }}-{{ .Branch }} + - node-modules-{{ arch }} + + - run: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn + + - save_cache: + name: cache .cache/yarn + key: yarn-cache-{{ arch }} + paths: + - ~/.cache/yarn + - save_cache: + name: cache node_modules + key: node-modules-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }} + paths: + - node_modules + + - run: yarn small-build + + - persist_to_workspace: + root: . + paths: + - ./* + + test-all: + executor: my-executor + steps: + - attach_workspace: + at: . + + - run: yarn test:all + + test-performance: + executor: my-executor + steps: + - attach_workspace: + at: . + + - run: + command: time node --expose-gc test/perf/index.js + environment: + PERSIST: true + + test-coverage: + executor: my-executor + steps: + - attach_workspace: + at: . + + - run: yarn test -i --coverage + - persist_to_workspace: + root: . + paths: + - ./coverage + + test-webpack: + executor: my-executor + steps: + - attach_workspace: + at: . + + - run: yarn test:webpack + + test-size: + executor: my-executor + steps: + - attach_workspace: + at: . + + - run: yarn size + + # upload coverage + upload-coveralls: + executor: my-executor + steps: + - attach_workspace: + at: . + + # only run coveralls if the token is present (it is not present for fork PRs for security reasons) + - run: + name: upload coveralls + command: | + if [[ -v COVERALLS_REPO_TOKEN ]] + then + cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js + echo "Coveralls info uploaded" + else + echo "Warning - Coveralls info could NOT be uploaded since the COVERALLS_REPO_TOKEN was not available" + fi + +workflows: + version: 2 + build-and-test: + jobs: + - build + + - test-all: + requires: + - build + - test-performance: + requires: + - build + - test-coverage: + requires: + - build + - test-webpack: + requires: + - build + - test-size: + requires: + - build + + - upload-coveralls: + requires: + - test-coverage diff --git a/.editorconfig b/.editorconfig index 7419bd422..8ef6aaa7b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,6 +6,6 @@ charset = utf-8 indent_style = space tab_width = 4 -[{package.json,.travis.yml}] +[{package.json}] indent_style = space -indent_size = 2 \ No newline at end of file +indent_size = 2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9e2b5a608..000000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -install: - - yarn install --frozen-lockfile -script: - - CI=true yarn test:travis - - cat ./coverage/lcov.info|./node_modules/coveralls/bin/coveralls.js -node_js: - - 10 -addons: - apt: - packages: - - xvfb diff --git a/README.md b/README.md index 3e09f763f..5845f0a94 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ _Simple, scalable state management_ -[![Build Status](https://travis-ci.org/mobxjs/mobx.svg?branch=master)](https://travis-ci.org/mobxjs/mobx) +[![CircleCI](https://circleci.com/gh/mobxjs/mobx.svg?style=svg)](https://circleci.com/gh/mobxjs/mobx) [![Coverage Status](https://coveralls.io/repos/mobxjs/mobx/badge.svg?branch=master&service=github)](https://coveralls.io/github/mobxjs/mobx?branch=master) [![Join the chat at https://gitter.im/mobxjs/mobx](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mobxjs/mobx?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Discuss MobX on Hashnode](https://hashnode.github.io/badges/mobx.svg)](https://hashnode.com/n/mobx) @@ -321,7 +321,7 @@ And finally, kudos to all the people that believed in, tried, validated and even * Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. * Use `yarn test` to run the basic test suite. -* Use `yarn test:travis` for the test suite with coverage. +* Use `yarn test:ci` for the test suite with coverage. * and `yarn test:performance` for the performance tests. * Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. diff --git a/package.json b/package.json index b6c0f098f..ededfc066 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,13 @@ "test": "jest", "watch": "jest --watch", "test:mixed-versions": "jest --testRegex mixed-versions", - "test:all": "yarn lint && yarn small-build && yarn jest -i && yarn test:flow && yarn test:mixed-versions", + "test:all": "yarn lint && yarn jest -i && yarn test:flow && yarn test:mixed-versions", "test:webpack": "node scripts/webpack-regression-tests.js", "test:flow": "node_modules/.bin/flow check", - "test:performance": "npm run small-build && PERSIST=true time node --expose-gc test/perf/index.js", - "test:travis": "yarn test:all && yarn test:performance && yarn test -i --coverage && yarn test:webpack && yarn size", + "test:performance": "PERSIST=true time node --expose-gc test/perf/index.js", + "test:ci": "yarn test:all && yarn test:performance && yarn test -i --coverage && yarn test:webpack && yarn size", "prettier": "prettier \"**/*.js\" \"**/*.jsx\" \"**/*.tsx\" \"**/*.ts\"", - "_prepublish": "npm run small-build", + "_prepublish": "yarn small-build", "quick-build": "tsc --pretty", "small-build": "node scripts/build.js", "lint": "eslint src/**/*.ts", @@ -130,4 +130,4 @@ "pre-commit": "lint-staged" } } -} \ No newline at end of file +} From 38f2c5104a17cf923f5cb264630f62fe298030f8 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 17 Jun 2019 19:55:50 +0200 Subject: [PATCH 0075/1043] Updated changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ca6cf102..f7eb98d2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 4.11.0 + +**BREAKING CHANGE** + +Reverted the support of Symbols in general in MobX 4, as it gives to many potential build errors and increases the system requirements for MobX 4 (which was an oversight in 4.10.0). Apologies for the breaking change (lack of new major version numbers). If lock files are properly used however, no harm should be caused by this change. + +* Reverted `Symbol` support in observable maps and objects. Reverts [#1944](https://github.com/mobxjs/mobx/pull/1944) through [#1988](https://github.com/mobxjs/mobx/pull/1988). Fixes [#1986](https://github.com/mobxjs/mobx/issues/1986), [#1987](https://github.com/mobxjs/mobx/issues/1987) + # 5.10.1 * Fixed a recent regression where array update events would send undefined as `change.object` through [#1985](https://github.com/mobxjs/mobx/pull/1985) by [xaviergonz](https://github.com/xaviergonz) From 6f095ed0330d5ee2433fc87359ebd44ded630e26 Mon Sep 17 00:00:00 2001 From: Jilles Soeters Date: Wed, 19 Jun 2019 03:08:31 -0700 Subject: [PATCH 0076/1043] Adds computedConfigurable (#2014) --- src/api/configure.ts | 5 +++++ src/core/globalstate.ts | 8 +++++++- src/types/observableobject.ts | 2 +- test/base/strict-mode.js | 22 ++++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/api/configure.ts b/src/api/configure.ts index f01e7cd55..e99328107 100644 --- a/src/api/configure.ts +++ b/src/api/configure.ts @@ -9,6 +9,7 @@ import { export function configure(options: { enforceActions?: boolean | "strict" | "never" | "always" | "observed" computedRequiresReaction?: boolean + computedConfigurable?: boolean isolateGlobalState?: boolean disableErrorBoundaries?: boolean reactionScheduler?: (f: () => void) => void @@ -16,6 +17,7 @@ export function configure(options: { const { enforceActions, computedRequiresReaction, + computedConfigurable, disableErrorBoundaries, reactionScheduler } = options @@ -52,6 +54,9 @@ export function configure(options: { if (computedRequiresReaction !== undefined) { globalState.computedRequiresReaction = !!computedRequiresReaction } + if (computedConfigurable !== undefined) { + globalState.computedConfigurable = !!computedConfigurable + } if (disableErrorBoundaries !== undefined) { if (disableErrorBoundaries === true) console.warn( diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index a0cb6e445..ee129aeaa 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -101,6 +101,12 @@ export class MobXGlobals { */ computedRequiresReaction = false + /** + * Allows overwriting of computed properties, useful in tests but not prod as it can cause + * memory leaks. See https://github.com/mobxjs/mobx/issues/1867 + */ + computedConfigurable = false + /* * Don't catch and rethrow exceptions. This is useful for inspecting the state of * the stack when an exception occurs while debugging. @@ -108,7 +114,7 @@ export class MobXGlobals { disableErrorBoundaries = false /* - * If true, we are already handling an exception in an action. Any errors in reactions should be supressed, as + * If true, we are already handling an exception in an action. Any errors in reactions should be supressed, as * they are not the cause, see: https://github.com/mobxjs/mobx/issues/1836 */ suppressReactionErrors = false diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 594a9e0d7..3dd5f98ab 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -385,7 +385,7 @@ export function generateComputedPropConfig(propName) { return ( computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = { - configurable: false, // See https://github.com/mobxjs/mobx/issues/1867, for computeds, we don't want reconfiguration, as this will potentially leak memory! + configurable: globalState.computedConfigurable, enumerable: false, get() { return getAdministrationForComputedPropOwner(this).read(propName) diff --git a/test/base/strict-mode.js b/test/base/strict-mode.js index 57362742a..17bcf982e 100644 --- a/test/base/strict-mode.js +++ b/test/base/strict-mode.js @@ -249,3 +249,25 @@ test("#1869", function() { }).toThrow("Since strict-mode is enabled") mobx._resetGlobalState() // should preserve strict mode }) + +test("allow overwriting computed if configured", function() { + try { + mobx.configure({ computedConfigurable: true }) + const x = mobx.observable({ + v: 2, + get multiplied() { + return x * 2 + } + }) + mobx.decorate(x, { multiplied: mobx.computed }) + + expect(() => { + Object.defineProperty(x, "multiplied", { + value: 12 + }) + }).not.toThrow() + expect(x.multiplied).toBe(12) + } finally { + mobx.configure({ computedConfigurable: false }) + } +}) From 3a4d981087d305d832f33063131fe645e8c03b68 Mon Sep 17 00:00:00 2001 From: Jilles Soeters Date: Wed, 19 Jun 2019 03:10:10 -0700 Subject: [PATCH 0077/1043] Adds computedConfigurable to changelog (#2013) * Adds computedConfigurable to changelog * Update for MobX 5 * Adds MobX 5 PR to changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7eb98d2e..7a689e90f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 5.11.0 / 4.12.0 + +* Added `computedConfigurable` config [#2011](https://github.com/mobxjs/mobx/pull/2011), [#2013](https://github.com/mobxjs/mobx/pull/2014) + # 4.11.0 **BREAKING CHANGE** From 286056add6b115adb9fc15aa9304e4e02de993d9 Mon Sep 17 00:00:00 2001 From: itamar sharify Date: Wed, 19 Jun 2019 15:55:46 +0300 Subject: [PATCH 0078/1043] Add stale bot config (#2016) * Add stale bot config * remove unused labels * set stale only for issues * add labels and changes days count --- .github/stale.yaml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/stale.yaml diff --git a/.github/stale.yaml b/.github/stale.yaml new file mode 100644 index 000000000..bf0db2d9a --- /dev/null +++ b/.github/stale.yaml @@ -0,0 +1,32 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 14 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 4 +# Issues with these labels will never be considered stale +exemptLabels: + - bug + - has PR + - discuss + - enhancement + - candidate-for-next-version + - ready-to-be-implemented-by-volunteer + - needs investigation + - breaking-change + - bug + - help wanted + - pinned + - waiting-for-standardized-decorators +# Label to use when marking an issue as stale +staleLabel: stale +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false +# Limit to only `issues` or `pulls` +only: issues +# Comment to post when removing the stale label. +unmarkComment: > + This issue has been automatically unmarked as stale. Please disregard previous warnings. \ No newline at end of file From 14bfbcdb2756d8cdf72ae0601ed0774de64c751e Mon Sep 17 00:00:00 2001 From: itamar sharify Date: Wed, 19 Jun 2019 17:38:47 +0300 Subject: [PATCH 0079/1043] rename faulty file extension name in #2016 (#2017) --- .github/{stale.yaml => stale.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{stale.yaml => stale.yml} (100%) diff --git a/.github/stale.yaml b/.github/stale.yml similarity index 100% rename from .github/stale.yaml rename to .github/stale.yml From b6da43ce5eefe03582a497ce28638a384415a961 Mon Sep 17 00:00:00 2001 From: Kobi Date: Wed, 19 Jun 2019 23:16:03 +0300 Subject: [PATCH 0080/1043] fix(extendObservable): use regular `for` on array of keys (#1998) * fix(extendObservable): use regular on array of keys * forof --- src/api/extendobservable.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/api/extendobservable.ts b/src/api/extendobservable.ts index b1ca91cef..e4b4b81a3 100644 --- a/src/api/extendobservable.ts +++ b/src/api/extendobservable.ts @@ -67,8 +67,7 @@ export function extendObservableObjectWithProperties( ) if (decorators) { const keys = getPlainObjectKeys(decorators) - for (let i in keys) { - const key = keys[i] + for (const key of keys) { if (!(key in properties!)) fail( `Trying to declare a decorator for unspecified property '${stringifyKey( @@ -81,8 +80,7 @@ export function extendObservableObjectWithProperties( startBatch() try { const keys = getPlainObjectKeys(properties) - for (let i in keys) { - const key = keys[i] + for (const key of keys) { const descriptor = Object.getOwnPropertyDescriptor(properties, key)! if (process.env.NODE_ENV !== "production") { if (Object.getOwnPropertyDescriptor(target, key)) @@ -100,8 +98,8 @@ export function extendObservableObjectWithProperties( decorators && key in decorators ? decorators[key] : descriptor.get - ? computedDecorator - : defaultDecorator + ? computedDecorator + : defaultDecorator if (process.env.NODE_ENV !== "production" && typeof decorator !== "function") fail(`Not a valid decorator for '${stringifyKey(key)}', got: ${decorator}`) From 1188f26417478089af47f29424132c77b8b8e326 Mon Sep 17 00:00:00 2001 From: Sjoerd de Jong Date: Mon, 24 Jun 2019 16:07:59 +0200 Subject: [PATCH 0081/1043] Typings improvement (#2018) --- src/api/object-api.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/object-api.ts b/src/api/object-api.ts index a38081fd3..5e1416085 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -42,7 +42,7 @@ export function keys(obj: any): any { export function values(map: ObservableMap): ReadonlyArray export function values(set: ObservableSet): ReadonlyArray export function values(ar: IObservableArray): ReadonlyArray -export function values(obj: T): ReadonlyArray +export function values(obj: T): ReadonlyArray export function values(obj: any): string[] { if (isObservableObject(obj)) { return keys(obj).map(key => obj[key]) @@ -65,7 +65,7 @@ export function values(obj: any): string[] { export function entries(map: ObservableMap): ReadonlyArray<[K, T]> export function entries(set: ObservableSet): ReadonlyArray<[T, T]> export function entries(ar: IObservableArray): ReadonlyArray<[number, T]> -export function entries(obj: T): ReadonlyArray<[string, any]> +export function entries(obj: T): ReadonlyArray<[string, T extends object ? T[keyof T] : any]> export function entries(obj: any): any { if (isObservableObject(obj)) { return keys(obj).map(key => [key, obj[key]]) From edfdf85a7e5407ed1219e868c2b9d7774681e48b Mon Sep 17 00:00:00 2001 From: jillesme Date: Wed, 3 Jul 2019 15:28:19 -0700 Subject: [PATCH 0082/1043] Published version 5.11.0 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ededfc066..0092f3630 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.10.1", + "version": "5.11.0", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", @@ -130,4 +130,4 @@ "pre-commit": "lint-staged" } } -} +} \ No newline at end of file From e7e03e5e324111a2a9518968e7e30d222e4c9b6d Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 4 Jul 2019 17:45:08 +0200 Subject: [PATCH 0083/1043] Updated sponsors section --- README.md | 106 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 5845f0a94..371b3d3a1 100644 --- a/README.md +++ b/README.md @@ -12,60 +12,64 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). +**🥇Gold sponsors (\$250+ pm):**
    Mendix -Coinbase +Auction Frontier + +**🥈Silver sponsors (\$100+ pm):**
    Facebook Open Source Canva -Algolia Guilded -Auction Frontier mantro GmbH -talentplot CodeFirst Blokt -Faire + +**🥉Bronze sponsors:**
    +Coinbase +Algolia +talentplot # Installation -* Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. -* CDN: - * https://unpkg.com/mobx/lib/mobx.umd.js - * https://cdnjs.com/libraries/mobx +- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. +- CDN: + - https://unpkg.com/mobx/lib/mobx.umd.js + - https://cdnjs.com/libraries/mobx _Tip: Consider using the faster and smaller ES6 build if targetting a modern environment: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ # Browser support -| MobX version | Actively supported | Supported browsers | GitHub branch | -| ------------ | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| MobX version | Actively supported | Supported browsers | GitHub branch | +| ------------ | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | | 5.\* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower | `master` | -| 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | -| 1-3.\* | No | Any ES5 compliant browser | No active branch | +| 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | +| 1-3.\* | No | Any ES5 compliant browser | No active branch | -* MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). -* MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). +- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). +- MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). ## Translations -* [中文](http://cn.mobx.js.org) +- [中文](http://cn.mobx.js.org) ## Getting started -* Egghead.io course -* [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) -* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) -* [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -* [How to (not) use decorators](https://mobx.js.org/best/decorators.html) -* Videos: - * [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - * [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - * LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - * [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - * [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -* [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) -* More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) +- Egghead.io course +- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- [How to (not) use decorators](https://mobx.js.org/best/decorators.html) +- Videos: + - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +- [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) ## Introduction @@ -168,7 +172,9 @@ class TodoListView extends Component { return (
      - {this.props.todoList.todos.map(todo => )} + {this.props.todoList.todos.map(todo => ( + + ))}
    Tasks left: {this.props.todoList.unfinishedTodoCount}
    @@ -223,9 +229,9 @@ For an in-depth explanation about how MobX determines to which observables needs Unlike many flux frameworks, MobX is unopinionated about how user events should be handled. -* This can be done in a Flux like manner. -* Or by processing events using RxJS. -* Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. +- This can be done in a Flux like manner. +- Or by processing events using RxJS. +- Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. In the end it all boils down to: somehow the state should be updated. @@ -294,12 +300,12 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Further resources and documentation -* [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) -* [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) -* [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -* [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) -* [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) -* [Related projects](http://mobxjs.github.io/mobx/faq/related.html) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) +- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) +- [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) +- [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- [Related projects](http://mobxjs.github.io/mobx/faq/related.html) ## What others are saying... @@ -319,11 +325,11 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Contributing -* Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -* Use `yarn test` to run the basic test suite. -* Use `yarn test:ci` for the test suite with coverage. -* and `yarn test:performance` for the performance tests. -* Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. +- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. +- Use `yarn test` to run the basic test suite. +- Use `yarn test:ci` for the test suite with coverage. +- and `yarn test:performance` for the performance tests. +- Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. # MobX 4 vs MobX 5 @@ -331,8 +337,8 @@ The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do p The most notable limitations of MobX 4: -* Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. -* Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. +- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. +- Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). @@ -342,9 +348,9 @@ MobX ships with [flow typings](flow-typed/mobx.js). Flow will automatically incl To use the [flow typings](flow-typed/mobx.js) shipped with MobX: -* In `.flowconfig`, you **cannot** ignore `node_modules`. -* In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -* You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). +- In `.flowconfig`, you **cannot** ignore `node_modules`. +- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. +- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). ## Donating From 152f2833cbb4e49eda9569218447a874b24e5c97 Mon Sep 17 00:00:00 2001 From: Pavel Mayorov Date: Mon, 8 Jul 2019 16:07:20 +0500 Subject: [PATCH 0084/1043] use onBecomeUnobserved for ObservableMap._hasMap gc, fixes #2031 --- src/types/observablemap.ts | 31 ++++++++++++++++++------------- test/base/map.js | 23 ++++++++++++++++++++++- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 07aed5d36..f4b558310 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -31,6 +31,7 @@ import { stringifyKey, transaction, untracked, + onBecomeUnobserved, globalState } from "../internal" @@ -108,8 +109,22 @@ export class ObservableMap } has(key: K): boolean { - if (this._hasMap.has(key)) return this._hasMap.get(key)!.get() - return this._updateHasMapEntry(key, false).get() + if (!globalState.trackingDerivation) return this._has(key) + + let entry = this._hasMap.get(key) + if (!entry) { + // todo: replace with atom (breaking change) + const newEntry = (entry = new ObservableValue( + this._has(key), + referenceEnhancer, + `${this.name}.${stringifyKey(key)}?`, + false + )) + this._hasMap.set(key, newEntry) + onBecomeUnobserved(newEntry, () => this._hasMap.delete(key)) + } + + return entry.get() } set(key: K, value: V) { @@ -170,21 +185,11 @@ export class ObservableMap return false } - private _updateHasMapEntry(key: K, value: boolean): ObservableValue { - // optimization; don't fill the hasMap if we are not observing, or remove entry if there are no observers anymore + private _updateHasMapEntry(key: K, value: boolean) { let entry = this._hasMap.get(key) if (entry) { entry.setNewValue(value) - } else { - entry = new ObservableValue( - value, - referenceEnhancer, - `${this.name}.${stringifyKey(key)}?`, - false - ) - this._hasMap.set(key, entry) } - return entry } private _updateValue(key: K, newValue: V | undefined) { diff --git a/test/base/map.js b/test/base/map.js index 3b81a725c..45e653055 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -227,7 +227,28 @@ test("cleanup", function() { disposer() expect(aValue).toBe(2) expect(observable.observers.size).toBe(0) - expect(x._hasMap.get("a").observers.size).toBe(0) + expect(x._hasMap.has("a")).toBe(false) +}) + +test("getAtom encapsulation leak test", function() { + const x = map({}) + + let disposer = autorun(function() { + x.has("a") + }) + + let atom = mobx.getAtom(x, "a") + + disposer() + + expect(x._hasMap.get("a")).toBe(undefined) + + disposer = autorun(function() { + x.has("a") + atom && atom.reportObserved() + }) + + expect(x._hasMap.get("a")).not.toBe(atom) }) test("strict", function() { From 2cb14d0979b1e3d4deb1a45fdd2a60196f27be81 Mon Sep 17 00:00:00 2001 From: farwayer Date: Sun, 14 Jul 2019 00:17:29 +0300 Subject: [PATCH 0085/1043] clarify React Native runtime support --- CHANGELOG.md | 9 ++++++++- README.md | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a689e90f..a193fdc3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,7 +155,14 @@ MobX 5 is the first MobX version fully leveraging Proxies. This has two big adva ### The system requirements to run MobX has been upped -* MobX 5 can only be used on environments that support `Proxies`. In practice this means, no Internet Explorer (Edge is fine). No nodejs < 6. React Native on Android only when JavaScript core is [upgraded](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). All modern browsers are supported. +* MobX 5 can only be used on environments that support `Proxies`. In practice this means: + - no Internet Explorer (Edge is fine) + - Node.js >= 6 +React Native: + - iOS >= 10 + - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) + - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) +All modern browsers are supported. * Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. * If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. * The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. diff --git a/README.md b/README.md index 371b3d3a1..d3a025bb9 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,14 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.\* | No | Any ES5 compliant browser | No active branch | -- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). +- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). In practice this means: + - no Internet Explorer (Edge is fine) + - Node.js >= 6 +React Native: + - iOS >= 10 + - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) + - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) +All modern browsers are supported. - MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). ## Translations From b1861d7838847260b06e22ca03afef5da54ae8ad Mon Sep 17 00:00:00 2001 From: Darko Kukovec Date: Wed, 17 Jul 2019 09:30:45 +0200 Subject: [PATCH 0086/1043] Fix typo in sponsors.md (#2045) --- sponsors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sponsors.md b/sponsors.md index 4397529b7..f2f1a3add 100644 --- a/sponsors.md +++ b/sponsors.md @@ -20,7 +20,7 @@ Want to make a one-time contribution? https://mobxjs.github.io/mobx/donate.html * Constantine Genchevsky * Dane Hitchcox * Daniel Nakov -* Dardo Kukovec +* Darko Kukovec * Derek Knox * Dominik Nowik * Dong Woo Gim @@ -80,4 +80,4 @@ Patrons: * Kim Joar Bekkelund * Tőrös Egon Richárd * Lucas Nascimento -* Jason Hendriksen \ No newline at end of file +* Jason Hendriksen From 5ff67e813792093761bdff294ba7803c1d77633c Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 17 Jul 2019 21:45:47 +0200 Subject: [PATCH 0087/1043] added test and fix for #2044 --- src/types/observablearray.ts | 330 ++++++++++++++++++----------------- test/base/array.js | 24 ++- 2 files changed, 190 insertions(+), 164 deletions(-) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index f7a5293d6..f3c04a21c 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -102,6 +102,10 @@ const arrayTraps = { arrayExtensions.set.call(target, name, value) return true } + if (typeof name === "symbol") { + target[name] = value + return true + } if (!isNaN(name)) { arrayExtensions.set.call(target, parseInt(name), value) return true @@ -305,175 +309,175 @@ class ObservableArrayAdministration } const arrayExtensions = { - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { - return this[$mobx].intercept(handler) - }, - - observe( - listener: (changeData: IArrayChange | IArraySplice) => void, - fireImmediately = false - ): Lambda { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.observe(listener, fireImmediately) - }, - - clear(): any[] { - return this.splice(0) - }, - - replace(newItems: any[]) { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(0, adm.values.length, newItems) - }, - - /** - * Converts this array back to a (shallow) javascript structure. - * For a deep clone use mobx.toJS - */ - toJS(): any[] { - return (this as any).slice() - }, - - toJSON(): any[] { - // Used by JSON.stringify - return this.toJS() - }, - - /* - * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) - * since these functions alter the inner structure of the array, the have side effects. - * Because the have side effects, they should not be used in computed function, - * and for that reason the do not call dependencyState.notifyObserved - */ - splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - switch (arguments.length) { - case 0: - return [] - case 1: - return adm.spliceWithArray(index) - case 2: - return adm.spliceWithArray(index, deleteCount) - } - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { - const adm: ObservableArrayAdministration = this[$mobx] - return adm.spliceWithArray(index, deleteCount, newItems) - }, - - push(...items: any[]): number { - const adm: ObservableArrayAdministration = this[$mobx] - adm.spliceWithArray(adm.values.length, 0, items) - return adm.values.length - }, - - pop() { - return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] - }, - - shift() { - return this.splice(0, 1)[0] - }, - - unshift(...items: any[]): number { - const adm = this[$mobx] - adm.spliceWithArray(0, 0, items) - return adm.values.length - }, - - reverse(): any[] { - // reverse by default mutates in place before returning the result - // which makes it both a 'derivation' and a 'mutation'. - // so we deviate from the default and just make it an dervitation - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" - ) - } - const clone = (this).slice() - return clone.reverse.apply(clone, arguments) - }, - - sort(compareFn?: (a: any, b: any) => number): any[] { - // sort by default mutates in place before returning the result - // which goes against all good practices. Let's not change the array in place! - if (process.env.NODE_ENV !== "production") { - console.warn( - "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" - ) - } - const clone = (this).slice() - return clone.sort.apply(clone, arguments) - }, - - remove(value: any): boolean { - const adm: ObservableArrayAdministration = this[$mobx] - const idx = adm.dehanceValues(adm.values).indexOf(value) - if (idx > -1) { - this.splice(idx, 1) - return true - } - return false - }, - - get(index: number): any | undefined { - const adm: ObservableArrayAdministration = this[$mobx] - if (adm) { - if (index < adm.values.length) { - adm.atom.reportObserved() - return adm.dehanceValue(adm.values[index]) + intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { + return this[$mobx].intercept(handler) + }, + + observe( + listener: (changeData: IArrayChange | IArraySplice) => void, + fireImmediately = false + ): Lambda { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.observe(listener, fireImmediately) + }, + + clear(): any[] { + return this.splice(0) + }, + + replace(newItems: any[]) { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(0, adm.values.length, newItems) + }, + + /** + * Converts this array back to a (shallow) javascript structure. + * For a deep clone use mobx.toJS + */ + toJS(): any[] { + return (this as any).slice() + }, + + toJSON(): any[] { + // Used by JSON.stringify + return this.toJS() + }, + + /* + * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) + * since these functions alter the inner structure of the array, the have side effects. + * Because the have side effects, they should not be used in computed function, + * and for that reason the do not call dependencyState.notifyObserved + */ + splice(index: number, deleteCount?: number, ...newItems: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + switch (arguments.length) { + case 0: + return [] + case 1: + return adm.spliceWithArray(index) + case 2: + return adm.spliceWithArray(index, deleteCount) } - console.warn( - `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ - adm.values.length - }). Please check length first. Out of bound indices will not be tracked by MobX` - ) - } - return undefined - }, - - set(index: number, newValue: any) { - const adm: ObservableArrayAdministration = this[$mobx] - const values = adm.values - if (index < values.length) { - // update at index in range - checkIfStateModificationsAreAllowed(adm.atom) - const oldValue = values[index] - if (hasInterceptors(adm)) { - const change = interceptChange>(adm as any, { - type: "update", - object: adm.proxy as any, // since "this" is the real array we need to pass its proxy - index, - newValue - }) - if (!change) return - newValue = change.newValue + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + spliceWithArray(index: number, deleteCount?: number, newItems?: any[]): any[] { + const adm: ObservableArrayAdministration = this[$mobx] + return adm.spliceWithArray(index, deleteCount, newItems) + }, + + push(...items: any[]): number { + const adm: ObservableArrayAdministration = this[$mobx] + adm.spliceWithArray(adm.values.length, 0, items) + return adm.values.length + }, + + pop() { + return this.splice(Math.max(this[$mobx].values.length - 1, 0), 1)[0] + }, + + shift() { + return this.splice(0, 1)[0] + }, + + unshift(...items: any[]): number { + const adm = this[$mobx] + adm.spliceWithArray(0, 0, items) + return adm.values.length + }, + + reverse(): any[] { + // reverse by default mutates in place before returning the result + // which makes it both a 'derivation' and a 'mutation'. + // so we deviate from the default and just make it an dervitation + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" + ) } - newValue = adm.enhancer(newValue, oldValue) - const changed = newValue !== oldValue - if (changed) { - values[index] = newValue - adm.notifyArrayChildUpdate(index, newValue, oldValue) + const clone = (this).slice() + return clone.reverse.apply(clone, arguments) + }, + + sort(compareFn?: (a: any, b: any) => number): any[] { + // sort by default mutates in place before returning the result + // which goes against all good practices. Let's not change the array in place! + if (process.env.NODE_ENV !== "production") { + console.warn( + "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" + ) + } + const clone = (this).slice() + return clone.sort.apply(clone, arguments) + }, + + remove(value: any): boolean { + const adm: ObservableArrayAdministration = this[$mobx] + const idx = adm.dehanceValues(adm.values).indexOf(value) + if (idx > -1) { + this.splice(idx, 1) + return true + } + return false + }, + + get(index: number): any | undefined { + const adm: ObservableArrayAdministration = this[$mobx] + if (adm) { + if (index < adm.values.length) { + adm.atom.reportObserved() + return adm.dehanceValue(adm.values[index]) + } + console.warn( + `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${ + adm.values.length + }). Please check length first. Out of bound indices will not be tracked by MobX` + ) + } + return undefined + }, + + set(index: number, newValue: any) { + const adm: ObservableArrayAdministration = this[$mobx] + const values = adm.values + if (index < values.length) { + // update at index in range + checkIfStateModificationsAreAllowed(adm.atom) + const oldValue = values[index] + if (hasInterceptors(adm)) { + const change = interceptChange>(adm as any, { + type: "update", + object: adm.proxy as any, // since "this" is the real array we need to pass its proxy + index, + newValue + }) + if (!change) return + newValue = change.newValue + } + newValue = adm.enhancer(newValue, oldValue) + const changed = newValue !== oldValue + if (changed) { + values[index] = newValue + adm.notifyArrayChildUpdate(index, newValue, oldValue) + } + } else if (index === values.length) { + // add a new item + adm.spliceWithArray(index, 0, [newValue]) + } else { + // out of bounds + throw new Error( + `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` + ) } - } else if (index === values.length) { - // add a new item - adm.spliceWithArray(index, 0, [newValue]) - } else { - // out of bounds - throw new Error( - `[mobx.array] Index out of bounds, ${index} is larger than ${values.length}` - ) } } -} -/** - * Wrap function from prototype - * Without this, everything works as well, but this works - * faster as everything works on unproxied values - */ + /** + * Wrap function from prototype + * Without this, everything works as well, but this works + * faster as everything works on unproxied values + */ ;[ "concat", "every", diff --git a/test/base/array.js b/test/base/array.js index c6f1b083d..4e211f8fc 100644 --- a/test/base/array.js +++ b/test/base/array.js @@ -1,7 +1,7 @@ "use strict" const mobx = require("../../src/mobx.ts") -const { observable, when, _getAdministration } = mobx +const { observable, when, _getAdministration, reaction } = mobx const iterall = require("iterall") test("test1", function() { @@ -498,3 +498,25 @@ test("dehances last value on shift/pop", () => { expect(x2.pop()).toBe(10) expect(x2.pop()).toBe(6) }) + +test("#2044 symbol key on array", () => { + const x = observable([1, 2]) + const s = Symbol("test") + x[s] = 3 + expect(x[s]).toBe(3) + + let reacted = false + const d = reaction( + () => x[s], + () => { + reacted = true + } + ) + + x[s] = 4 + expect(x[s]).toBe(4) + + // although x[s] can be stored, it won't be reactive! + expect(reacted).toBe(false) + d() +}) From 9302c44e7419697b109efbda52b12314aa52950a Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 17 Jul 2019 21:49:45 +0200 Subject: [PATCH 0088/1043] Make it possible to store other non-numeric keys as well, while we are at it. --- src/types/observablearray.ts | 12 ++++-------- test/base/array.js | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index f3c04a21c..460e82825 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -96,21 +96,17 @@ const arrayTraps = { set(target, name, value): boolean { if (name === "length") { target[$mobx].setArrayLength(value) - return true } if (typeof name === "number") { arrayExtensions.set.call(target, name, value) - return true } - if (typeof name === "symbol") { + if (typeof name === "symbol" || isNaN(name)) { target[name] = value - return true - } - if (!isNaN(name)) { + } else { + // numeric string arrayExtensions.set.call(target, parseInt(name), value) - return true } - return false + return true }, preventExtensions(target) { fail(`Observable arrays cannot be frozen`) diff --git a/test/base/array.js b/test/base/array.js index 4e211f8fc..ad4f3e91b 100644 --- a/test/base/array.js +++ b/test/base/array.js @@ -520,3 +520,25 @@ test("#2044 symbol key on array", () => { expect(reacted).toBe(false) d() }) + +test("#2044 non-symbol key on array", () => { + const x = observable([1, 2]) + const s = "test" + x[s] = 3 + expect(x[s]).toBe(3) + + let reacted = false + const d = reaction( + () => x[s], + () => { + reacted = true + } + ) + + x[s] = 4 + expect(x[s]).toBe(4) + + // although x[s] can be stored, it won't be reactive! + expect(reacted).toBe(false) + d() +}) From e262f2e22fb53659d5768a69bbd74f4795f39aad Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 17 Jul 2019 22:04:29 +0200 Subject: [PATCH 0089/1043] Added reproduction for #2021, reused tests from #2023 --- test/base/array.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/test/base/array.js b/test/base/array.js index ad4f3e91b..6249cd25a 100644 --- a/test/base/array.js +++ b/test/base/array.js @@ -542,3 +542,49 @@ test("#2044 non-symbol key on array", () => { expect(reacted).toBe(false) d() }) + +describe("extended array prototype", () => { + const extensionKey = "__extension" + + // A single setup/teardown for all tests because we're pretending to do a + // singular global (dirty) change to the "environment". + beforeAll(() => { + Array.prototype[extensionKey] = () => {} + }) + afterAll(() => { + delete Array.prototype[extensionKey] + }) + + test("creating an observable should work", () => { + const a = mobx.observable({ b: "b" }) + }) + + test("extending an observable should work", () => { + const a = { b: "b" } + const c = mobx.extendObservable(a, {}) + }) +}) + +test("reproduce #2021", () => { + expect.assertions(1) + try { + Array.prototype.extension = function() { + console.log("I'm the extension!", this.length) + } + + class Test { + @observable + data = null + } + + const test = new Test() + + mobx.autorun(() => { + if (test.data) expect(test.data.someStr).toBe("123") + }) + + test.data = { someStr: "123" } + } finally { + delete Array.prototype.extension + } +}) From ade07854fdb13f976a8872a4129db1710ff7c478 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 17 Jul 2019 22:08:39 +0200 Subject: [PATCH 0090/1043] Updated changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a689e90f..1015c0758 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 5.13.0 / 4.13.0 + +* Fixed potential memory leak in observable maps, when non-primitive values are used as keys. Fixes [#2031](https://github.com/mobxjs/mobx/issues/2031) through [#2032](https://github.com/mobxjs/mobx/pull/2032). +* Added support to store additional non-observable(!) fields (string or symbol based) on array, to better reflect behavior of MobX 4. Fixes [#2044](https://github.com/mobxjs/mobx/issues/2044) through [#2046](https://github.com/mobxjs/mobx/pull/2046) + # 5.11.0 / 4.12.0 * Added `computedConfigurable` config [#2011](https://github.com/mobxjs/mobx/pull/2011), [#2013](https://github.com/mobxjs/mobx/pull/2014) From c20b1c22806278c5fa4503a572be7c1ff2236ab5 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 17 Jul 2019 22:20:04 +0200 Subject: [PATCH 0091/1043] Published version 5.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0092f3630..ff539c664 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.11.0", + "version": "5.13.0", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", From 5cd8a4053e45b12bb53bdeeeb628a4a54628284b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 19 Jul 2019 21:12:29 +0200 Subject: [PATCH 0092/1043] Make sure extendObservable doesn't accept non-plain objects as properties See: https://github.com/mobxjs/mobx/issues/2021#issuecomment-512589859 --- src/api/extendobservable.ts | 3 +++ test/base/observables.js | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/api/extendobservable.ts b/src/api/extendobservable.ts index e4b4b81a3..301782b63 100644 --- a/src/api/extendobservable.ts +++ b/src/api/extendobservable.ts @@ -17,6 +17,7 @@ import { initializeInstance } from "../internal" import { IObservableDecorator } from "./observabledecorator" +import { isPlainObject } from "../utils/utils" export function extendObservable( target: A, @@ -83,6 +84,8 @@ export function extendObservableObjectWithProperties( for (const key of keys) { const descriptor = Object.getOwnPropertyDescriptor(properties, key)! if (process.env.NODE_ENV !== "production") { + if (!isPlainObject(properties)) + fail(`'extendObservabe' only accepts plain objects as second argument`) if (Object.getOwnPropertyDescriptor(target, key)) fail( `'extendObservable' can only be used to introduce new properties. Use 'set' or 'decorate' instead. The property '${stringifyKey( diff --git a/test/base/observables.js b/test/base/observables.js index 16be63683..376865f66 100644 --- a/test/base/observables.js +++ b/test/base/observables.js @@ -2080,3 +2080,14 @@ test("tuples", () => { expect(myStuff.map(x => x * 2)).toEqual([4, 34]) }) + +test("extendObservable should not accept complex objects as second argument", () => { + class X { + x = 3 + } + expect(() => { + extendObservable({}, new X()) + }).toThrowErrorMatchingInlineSnapshot( + `"[mobx] 'extendObservabe' only accepts plain objects as second argument"` + ) +}) From ef73718e728f139b15cbbe34b00674a5450f50a8 Mon Sep 17 00:00:00 2001 From: Sebastien Guillemot Date: Sat, 20 Jul 2019 18:45:44 +0900 Subject: [PATCH 0093/1043] Fix flow definition for Flow 103 (#2050) --- flow-typed/mobx.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index d7d9abd10..1c739a1ac 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -127,12 +127,12 @@ export interface IObservableArray extends Array { clear(): T[]; replace(newItems: T[]): T[]; find( - predicate: (item: T, index: number, array: Array) => boolean, + predicate: (item: T, index: number, array: Array) => mixed, thisArg?: any, fromIndex?: number ): T | any; findIndex( - predicate: (item: T, index: number, array: Array) => boolean, + predicate: (item: T, index: number, array: Array) => mixed, thisArg?: any, fromIndex?: number ): number; From 18bb7557ac7e6985fb7f3423c24f75a7c31843bd Mon Sep 17 00:00:00 2001 From: Daniel K Date: Sun, 21 Jul 2019 13:34:48 +0200 Subject: [PATCH 0094/1043] Create lock.yml (#2054) --- .github/lock.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/lock.yml diff --git a/.github/lock.yml b/.github/lock.yml new file mode 100644 index 000000000..4309df031 --- /dev/null +++ b/.github/lock.yml @@ -0,0 +1,26 @@ +# Configuration for Lock Threads - https://github.com/dessant/lock-threads + +# Number of days of inactivity before a closed issue or pull request is locked +daysUntilLock: 60 + +# Skip issues and pull requests created before a given timestamp. Timestamp must +# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable +skipCreatedBefore: false + +# Issues and pull requests with these labels will be ignored. Set to `[]` to disable +exemptLabels: [] + +# Label to add before locking, such as `outdated`. Set to `false` to disable +lockLabel: false + +# Comment to post before locking. Set to `false` to disable +lockComment: > + This thread has been automatically locked since there has not been + any recent activity after it was closed. Please open a new issue for + related bugs or questions. + +# Assign `resolved` as the reason for locking. Set to `false` to disable +setLockReason: true + +# Limit to only `issues` or `pulls` +only: issues From 24e524ff6b07cda164d8db17f5029edcd0b71afd Mon Sep 17 00:00:00 2001 From: Daniel K Date: Sun, 21 Jul 2019 19:30:34 +0200 Subject: [PATCH 0095/1043] Update lock.yml --- .github/lock.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/lock.yml b/.github/lock.yml index 4309df031..23ddfcbe9 100644 --- a/.github/lock.yml +++ b/.github/lock.yml @@ -5,7 +5,7 @@ daysUntilLock: 60 # Skip issues and pull requests created before a given timestamp. Timestamp must # follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable -skipCreatedBefore: false +skipCreatedBefore: 2019-01-01 # Issues and pull requests with these labels will be ignored. Set to `[]` to disable exemptLabels: [] From 3cb84b49ccdc7a6ed7fcf3ccc7f356d251c6c99f Mon Sep 17 00:00:00 2001 From: haimrait Date: Thu, 25 Jul 2019 19:28:08 +0300 Subject: [PATCH 0096/1043] fix issues 1980 and 2003 (#2057) * fix issues 1980 and 2003 * Update CHANGELOG.md Add changelog for fixes 1980 and 2003 issues. --- CHANGELOG.md | 1 + src/types/observablemap.ts | 25 +++++++++++++++++++------ src/utils/utils.ts | 12 ++++++++++++ test/base/map.js | 13 ++++++++++++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1015c0758..322750bcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # 5.13.0 / 4.13.0 +* Fixed bug that observable map replace function breaks entities order. related issues:[#1980](https://github.com/mobxjs/mobx/issues/1980) and [#2003](https://github.com/mobxjs/mobx/issues/2003) * Fixed potential memory leak in observable maps, when non-primitive values are used as keys. Fixes [#2031](https://github.com/mobxjs/mobx/issues/2031) through [#2032](https://github.com/mobxjs/mobx/pull/2032). * Added support to store additional non-observable(!) fields (string or symbol based) on array, to better reflect behavior of MobX 4. Fixes [#2044](https://github.com/mobxjs/mobx/issues/2044) through [#2046](https://github.com/mobxjs/mobx/pull/2046) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index f4b558310..8ac5df527 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -11,7 +11,6 @@ import { createInstanceofPredicate, deepEnhancer, fail, - getMapLikeKeys, getNextId, getPlainObjectKeys, hasInterceptors, @@ -32,7 +31,8 @@ import { transaction, untracked, onBecomeUnobserved, - globalState + globalState, + convertToMap } from "../internal" export interface IKeyValueMap { @@ -335,11 +335,24 @@ export class ObservableMap // grab all the keys that are present in the new map but not present in the current map // and delete them from the map, then merge the new map // this will cause reactions only on changed values - const newKeys = (getMapLikeKeys(values) as any) as K[] + const replacementMap = convertToMap(values) + const orderedData = new Map() const oldKeys = Array.from(this.keys()) - const missingKeys = oldKeys.filter(k => newKeys.indexOf(k) === -1) - missingKeys.forEach(k => this.delete(k)) - this.merge(values) + + for (let i = 0; i < oldKeys.length; i++) { + const oldKey = oldKeys[i] + // delete missing key + if (!replacementMap.has(oldKey)) { + this.delete(oldKey) + } + } + // set new keys in the right order + replacementMap.forEach((value, key) => { + this.set(key, value) + orderedData.set(key, this._data.get(key)) + }) + // use data with correct order + this._data = orderedData }) return this } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index ca9aaa18d..7998ca39f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -88,6 +88,18 @@ export function isPlainObject(value) { return proto === Object.prototype || proto === null } +export function convertToMap(dataStructure) { + if (isES6Map(dataStructure) || isObservableMap(dataStructure)) { + return dataStructure + } else if (Array.isArray(dataStructure)) { + return new Map(dataStructure) + } else if (isPlainObject(dataStructure)) { + return new Map(Object.entries(dataStructure)) + } else { + return fail(`Cannot convert to map from '${dataStructure}'`) + } +} + export function makeNonEnumerable(object: any, propNames: PropertyKey[]) { for (let i = 0; i < propNames.length; i++) { addHiddenProp(object, propNames[i], object[propNames[i]]) diff --git a/test/base/map.js b/test/base/map.js index 45e653055..9439f5ca2 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -618,11 +618,22 @@ test("issue 1243, .replace should not trigger change on unchanged values", () => expect(() => { m.replace("not-an-object") - }).toThrow(/Cannot get keys from 'not-an-object'/) + }).toThrow(/Cannot convert to map from 'not-an-object'/) d() }) +test("#1980 .replace should not breaks entities order!", () => { + const original = mobx.observable.map([["a", "first"], ["b", "second"]]) + const replacement = new Map([["b", "first"], ["a", "second"]]) + original.replace(replacement) + const newKeys = Array.from(replacement) + const originalKeys = Array.from(replacement) + for (let i = 0; i < newKeys.length; i++) { + expect(newKeys[i]).toEqual(originalKeys[i]) + } +}) + test("#1258 cannot replace maps anymore", () => { const items = mobx.observable.map() items.replace(mobx.observable.map()) From 1c8707e71995df34666628bb2ab3f37aed0ca7b3 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jul 2019 20:55:37 +0200 Subject: [PATCH 0097/1043] Fixed some additional compile errors --- src/api/tojs.ts | 5 +---- src/core/reaction.ts | 1 - src/types/observableobject.ts | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/api/tojs.ts b/src/api/tojs.ts index db76fa06e..f8aa9b428 100644 --- a/src/api/tojs.ts +++ b/src/api/tojs.ts @@ -1,14 +1,11 @@ import { - $mobx, keys, isObservable, isObservableArray, isObservableValue, isObservableMap, isObservableSet, - getPlainObjectKeys, - mobxDidRunLazyInitializersSymbol, - mobxPendingDecorators + getPlainObjectKeys } from "../internal" export type ToJSOptions = { diff --git a/src/core/reaction.ts b/src/core/reaction.ts index e98d92873..bfd0fcbd8 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -1,6 +1,5 @@ import { $mobx, - fail, IDerivation, IDerivationState, IObservable, diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 05db9de62..3dd5f98ab 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -87,7 +87,7 @@ export class ObservableObjectAdministration public name: string, public defaultEnhancer: IEnhancer ) { - this.keysAtom = new Atom(name + ".keys") as IAtom + this.keysAtom = new Atom(name + ".keys") } read(key: PropertyKey) { From 59f10ba058435561878209273f4c54ce91a43295 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jul 2019 20:55:48 +0200 Subject: [PATCH 0098/1043] Made sure tsc is run in CI --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ff539c664..2e7f9b3ae 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test": "jest", "watch": "jest --watch", "test:mixed-versions": "jest --testRegex mixed-versions", - "test:all": "yarn lint && yarn jest -i && yarn test:flow && yarn test:mixed-versions", + "test:all": "yarn tsc --noEmit && yarn lint && yarn jest -i && yarn test:flow && yarn test:mixed-versions", "test:webpack": "node scripts/webpack-regression-tests.js", "test:flow": "node_modules/.bin/flow check", "test:performance": "PERSIST=true time node --expose-gc test/perf/index.js", From b09333c1459755ac2ff9171d37be73ecc5121259 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jul 2019 21:11:12 +0200 Subject: [PATCH 0099/1043] Some additional clarifications --- CHANGELOG.md | 9 +-------- README.md | 12 ++++-------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33caab907..ee6587d8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -161,14 +161,7 @@ MobX 5 is the first MobX version fully leveraging Proxies. This has two big adva ### The system requirements to run MobX has been upped -* MobX 5 can only be used on environments that support `Proxies`. In practice this means: - - no Internet Explorer (Edge is fine) - - Node.js >= 6 -React Native: - - iOS >= 10 - - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) - - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) -All modern browsers are supported. +* MobX 5 can only be used on environments that support `Proxies`. See the [browser support](https://github.com/mobxjs/mobx#browser-support) for details. * Since MobX no longer runs on older browsers, the compilation target has been upgraded to ES2015 syntax supporting browsers. This means that MobX is not loadable on older browsers without down compilation to ES5. * If for whatever reason your project cannot meet this requirements, please stick to MobX 4. It will be actively maintained. All current features of MobX 5 are expressable in MobX 4 as well, but it means that for example to use dynamic objects some [additional APIs](https://mobx.js.org/refguide/object-api.html) are needed. * The performance footprint of MobX 5 should be pretty similar to MobX 4. In our performance tests we saw some minor improvements in memory footprint, but overall it should be pretty comparable. diff --git a/README.md b/README.md index d3a025bb9..44fabea78 100644 --- a/README.md +++ b/README.md @@ -48,15 +48,11 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env | 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | | 1-3.\* | No | Any ES5 compliant browser | No active branch | -- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). In practice this means: - - no Internet Explorer (Edge is fine) - - Node.js >= 6 -React Native: - - iOS >= 10 - - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) - - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) -All modern browsers are supported. +- All modern browsers are supported. +- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). In practice this means: - no Internet Explorer (Edge is fine) - Node.js >= 6 + React Native: - iOS >= 10 - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) (Use MobX 4 instead) - MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). +- The latest versions of libraries like mobx-react, mobx-react-lite, mobx-state-tree etc are kept compatible with both MobX 4 and 5. ## Translations From ef0876e6c4efac852115d84e150b19d5cb3fc019 Mon Sep 17 00:00:00 2001 From: Daniel K Date: Sat, 27 Jul 2019 12:41:25 +0200 Subject: [PATCH 0100/1043] Revert "fix issues 1980 and 2003 (#2057)" (#2059) This reverts commit 3cb84b49ccdc7a6ed7fcf3ccc7f356d251c6c99f. --- CHANGELOG.md | 1 - src/types/observablemap.ts | 25 ++++++------------------- src/utils/utils.ts | 12 ------------ test/base/map.js | 13 +------------ 4 files changed, 7 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee6587d8a..f6c6bc47c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # 5.13.0 / 4.13.0 -* Fixed bug that observable map replace function breaks entities order. related issues:[#1980](https://github.com/mobxjs/mobx/issues/1980) and [#2003](https://github.com/mobxjs/mobx/issues/2003) * Fixed potential memory leak in observable maps, when non-primitive values are used as keys. Fixes [#2031](https://github.com/mobxjs/mobx/issues/2031) through [#2032](https://github.com/mobxjs/mobx/pull/2032). * Added support to store additional non-observable(!) fields (string or symbol based) on array, to better reflect behavior of MobX 4. Fixes [#2044](https://github.com/mobxjs/mobx/issues/2044) through [#2046](https://github.com/mobxjs/mobx/pull/2046) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 8ac5df527..f4b558310 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -11,6 +11,7 @@ import { createInstanceofPredicate, deepEnhancer, fail, + getMapLikeKeys, getNextId, getPlainObjectKeys, hasInterceptors, @@ -31,8 +32,7 @@ import { transaction, untracked, onBecomeUnobserved, - globalState, - convertToMap + globalState } from "../internal" export interface IKeyValueMap { @@ -335,24 +335,11 @@ export class ObservableMap // grab all the keys that are present in the new map but not present in the current map // and delete them from the map, then merge the new map // this will cause reactions only on changed values - const replacementMap = convertToMap(values) - const orderedData = new Map() + const newKeys = (getMapLikeKeys(values) as any) as K[] const oldKeys = Array.from(this.keys()) - - for (let i = 0; i < oldKeys.length; i++) { - const oldKey = oldKeys[i] - // delete missing key - if (!replacementMap.has(oldKey)) { - this.delete(oldKey) - } - } - // set new keys in the right order - replacementMap.forEach((value, key) => { - this.set(key, value) - orderedData.set(key, this._data.get(key)) - }) - // use data with correct order - this._data = orderedData + const missingKeys = oldKeys.filter(k => newKeys.indexOf(k) === -1) + missingKeys.forEach(k => this.delete(k)) + this.merge(values) }) return this } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 7998ca39f..ca9aaa18d 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -88,18 +88,6 @@ export function isPlainObject(value) { return proto === Object.prototype || proto === null } -export function convertToMap(dataStructure) { - if (isES6Map(dataStructure) || isObservableMap(dataStructure)) { - return dataStructure - } else if (Array.isArray(dataStructure)) { - return new Map(dataStructure) - } else if (isPlainObject(dataStructure)) { - return new Map(Object.entries(dataStructure)) - } else { - return fail(`Cannot convert to map from '${dataStructure}'`) - } -} - export function makeNonEnumerable(object: any, propNames: PropertyKey[]) { for (let i = 0; i < propNames.length; i++) { addHiddenProp(object, propNames[i], object[propNames[i]]) diff --git a/test/base/map.js b/test/base/map.js index 9439f5ca2..45e653055 100644 --- a/test/base/map.js +++ b/test/base/map.js @@ -618,22 +618,11 @@ test("issue 1243, .replace should not trigger change on unchanged values", () => expect(() => { m.replace("not-an-object") - }).toThrow(/Cannot convert to map from 'not-an-object'/) + }).toThrow(/Cannot get keys from 'not-an-object'/) d() }) -test("#1980 .replace should not breaks entities order!", () => { - const original = mobx.observable.map([["a", "first"], ["b", "second"]]) - const replacement = new Map([["b", "first"], ["a", "second"]]) - original.replace(replacement) - const newKeys = Array.from(replacement) - const originalKeys = Array.from(replacement) - for (let i = 0; i < newKeys.length; i++) { - expect(newKeys[i]).toEqual(originalKeys[i]) - } -}) - test("#1258 cannot replace maps anymore", () => { const items = mobx.observable.map() items.replace(mobx.observable.map()) From ff5bb21997d132b32aa05b271e5fd5e3c9574f83 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Sat, 27 Jul 2019 13:31:51 -0500 Subject: [PATCH 0101/1043] docs: move docs to master --- docs/LINKS.md | 33 + docs/README.md | 480 ++++++++++++ docs/SUMMARY.md | 49 ++ docs/best/actions.md | 206 +++++ docs/best/decorators.md | 186 +++++ docs/best/devtools.md | 38 + docs/best/pitfalls.md | 287 +++++++ docs/best/react-performance.md | 146 ++++ docs/best/react.md | 464 +++++++++++ docs/best/stateless-HMR.md | 75 ++ docs/best/store.md | 312 ++++++++ docs/best/syntax.md | 5 + docs/best/trace.md | 56 ++ docs/blokt.jpg | Bin 0 -> 13196 bytes docs/book.json | 21 + docs/codefirst.png | Bin 0 -> 4439 bytes docs/donating.md | 4 + docs/faire.jpg | Bin 0 -> 5174 bytes docs/faq/faq.md | 58 ++ docs/images/action-state-view.png | Bin 0 -> 9981 bytes docs/images/book.jpg | Bin 0 -> 12954 bytes docs/images/concept.png | Bin 0 -> 27492 bytes docs/images/devtools-noDisplayName.png | Bin 0 -> 61920 bytes docs/images/devtools-withDisplayName.png | Bin 0 -> 51396 bytes docs/images/devtools.gif | Bin 0 -> 303470 bytes docs/images/favicon.png | Bin 0 -> 526 bytes docs/images/mobservable.png | Bin 0 -> 3902 bytes docs/images/mobservable.svg | 118 +++ docs/images/observed-refs.png | Bin 0 -> 47432 bytes docs/images/overview.svg | 405 ++++++++++ docs/images/overview_bw.svg | 406 ++++++++++ docs/images/trace-tips2.png | Bin 0 -> 265124 bytes docs/images/trace.gif | Bin 0 -> 1037711 bytes docs/intro/concepts.md | 93 +++ docs/intro/overview.md | 90 +++ .../gitbook-plugin-codefund/index.js | 15 + .../gitbook-plugin-codefund/package.json | 19 + docs/refguide/action.md | 75 ++ docs/refguide/api.md | 728 ++++++++++++++++++ docs/refguide/array.md | 66 ++ docs/refguide/autorun.md | 96 +++ docs/refguide/boxed.md | 49 ++ docs/refguide/computed-decorator.md | 226 ++++++ docs/refguide/create-transformer.md | 186 +++++ docs/refguide/expr.md | 25 + docs/refguide/extend-observable.md | 44 ++ docs/refguide/extending.md | 89 +++ docs/refguide/map.md | 40 + docs/refguide/modifiers.md | 124 +++ docs/refguide/object-api.md | 35 + docs/refguide/object.md | 51 ++ docs/refguide/observable-decorator.md | 42 + docs/refguide/observable.md | 61 ++ docs/refguide/observe.md | 130 ++++ docs/refguide/observer-component.md | 175 +++++ docs/refguide/reaction.md | 110 +++ docs/refguide/spy.md | 44 ++ docs/refguide/tojson.md | 30 + docs/refguide/when.md | 53 ++ docs/styles/website.css | 7 + 60 files changed, 6052 insertions(+) create mode 100644 docs/LINKS.md create mode 100644 docs/README.md create mode 100644 docs/SUMMARY.md create mode 100644 docs/best/actions.md create mode 100644 docs/best/decorators.md create mode 100644 docs/best/devtools.md create mode 100644 docs/best/pitfalls.md create mode 100644 docs/best/react-performance.md create mode 100644 docs/best/react.md create mode 100644 docs/best/stateless-HMR.md create mode 100644 docs/best/store.md create mode 100644 docs/best/syntax.md create mode 100644 docs/best/trace.md create mode 100644 docs/blokt.jpg create mode 100644 docs/book.json create mode 100644 docs/codefirst.png create mode 100644 docs/donating.md create mode 100644 docs/faire.jpg create mode 100644 docs/faq/faq.md create mode 100644 docs/images/action-state-view.png create mode 100644 docs/images/book.jpg create mode 100644 docs/images/concept.png create mode 100644 docs/images/devtools-noDisplayName.png create mode 100644 docs/images/devtools-withDisplayName.png create mode 100644 docs/images/devtools.gif create mode 100644 docs/images/favicon.png create mode 100644 docs/images/mobservable.png create mode 100644 docs/images/mobservable.svg create mode 100644 docs/images/observed-refs.png create mode 100644 docs/images/overview.svg create mode 100644 docs/images/overview_bw.svg create mode 100644 docs/images/trace-tips2.png create mode 100644 docs/images/trace.gif create mode 100644 docs/intro/concepts.md create mode 100644 docs/intro/overview.md create mode 100644 docs/node_modules/gitbook-plugin-codefund/index.js create mode 100644 docs/node_modules/gitbook-plugin-codefund/package.json create mode 100644 docs/refguide/action.md create mode 100644 docs/refguide/api.md create mode 100644 docs/refguide/array.md create mode 100644 docs/refguide/autorun.md create mode 100644 docs/refguide/boxed.md create mode 100644 docs/refguide/computed-decorator.md create mode 100644 docs/refguide/create-transformer.md create mode 100644 docs/refguide/expr.md create mode 100644 docs/refguide/extend-observable.md create mode 100644 docs/refguide/extending.md create mode 100644 docs/refguide/map.md create mode 100644 docs/refguide/modifiers.md create mode 100644 docs/refguide/object-api.md create mode 100644 docs/refguide/object.md create mode 100644 docs/refguide/observable-decorator.md create mode 100644 docs/refguide/observable.md create mode 100644 docs/refguide/observe.md create mode 100644 docs/refguide/observer-component.md create mode 100644 docs/refguide/reaction.md create mode 100644 docs/refguide/spy.md create mode 100644 docs/refguide/tojson.md create mode 100644 docs/refguide/when.md create mode 100644 docs/styles/website.css diff --git a/docs/LINKS.md b/docs/LINKS.md new file mode 100644 index 000000000..89e4677e4 --- /dev/null +++ b/docs/LINKS.md @@ -0,0 +1,33 @@ +
    + +# Resources + +* [Ten minute interactive introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html#demo) +* How MobX works: [In depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.wnlo6bw8y) +* Clone the boilerplate repository containing the above example from: https://github.com/mweststrate/react-mobservable-boilerplate. +* Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). + +## Related projects + +* [mobx-connect](https://github.com/nightwolfz/mobx-connect) MobX @connect decorator for react components. Similar to redux's @connect. +* [rfx-stack](https://github.com/foxhound87/rfx-stack) RFX Stack - Universal App featuring: React + Feathers + MobX +* [mobx-reactor](https://github.com/amsb/mobx-reactor) Connect MobX data stores to functional stateless React components with async actions and unidirectional data flow. +* [mobx-model](https://github.com/ikido/mobx-model) Simplify mobx data stores that mimic backend models +* [rx-mobx](https://github.com/chicoxyzzy/rx-mobx) Convert Mobx observables to RxJS and vice versa + +## More examples + +A nice list is WIP, but see this [github issue](https://github.com/mobxjs/mobx/issues/104) for a list of example projects, including routing, authorization, server side rendering etc. + +* [TodoMVC using MobX and React](https://github.com/mweststrate/mobx-todomvc) +* The [ports of the _Notes_ and _Kanban_ examples](https://github.com/survivejs/mobservable-demo) from the book "SurviveJS - Webpack and React" to mobservable. +* A simple webshop using [React + mobx](https://jsfiddle.net/mweststrate/46vL0phw) or [JQuery + mobx](http://jsfiddle.net/mweststrate/vxn7qgdw). +* [Simple timer](https://jsfiddle.net/mweststrate/wgbe4guu/) application in JSFiddle. +* [Simple ES5 MobX examples](https://github.com/mattruby/mobx-examples) Bite sized MobX examples all setup to run in jsFiddle. + +## Philosophy + +* [Making React reactive: the pursuit of high performing, easily maintainable React apps](https://www.mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/) +* [SurviveJS interview on Mobservable, React and Flux](http://survivejs.com/blog/mobservable-interview/) +* [Pure rendering in the light of time and state](https://medium.com/@mweststrate/pure-rendering-in-the-light-of-time-and-state-4b537d8d40b1) +* [Official homepage](http://mobxjs.github.io/mobx/) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..97d332531 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,480 @@ +logo + +# MobX + +_Simple, scalable state management_ + +[![Build Status](https://travis-ci.org/mobxjs/mobx.svg?branch=master)](https://travis-ci.org/mobxjs/mobx) +[![Coverage Status](https://coveralls.io/repos/mobxjs/mobx/badge.svg?branch=master&service=github)](https://coveralls.io/github/mobxjs/mobx?branch=master) +[![Join the chat at https://gitter.im/mobxjs/mobx](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mobxjs/mobx?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Discuss MobX on Hashnode](https://hashnode.github.io/badges/mobx.svg)](https://hashnode.com/n/mobx) +[![OpenCollective](https://opencollective.com/mobx/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) + +
    + +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). + +**🥇Gold sponsors (\$250+ pm):**
    +
    Mendix +Auction Frontier + +**🥈Silver sponsors (\$100+ pm):**
    +Facebook Open Source +Canva +Guilded +mantro GmbH +CodeFirst +Blokt + +**🥉Bronze sponsors:**
    +Coinbase +Algolia +talentplot + +# Installation + +- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. +- CDN: + +* https://unpkg.com/mobx/lib/mobx.umd.js +* https://cdnjs.com/libraries/mobx + +# Browser support + +- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). +- MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). + +_Tip: the main entry point of the MobX 5 package ships with ES5 code for backward compatibility with all build tools. But since MobX 5 runs only on modern browsers anyway, consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ + +## Translations + +- [中文](http://cn.mobx.js.org) + +## Getting started + +- egghead.io course +- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- Videos: + - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +- [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) + +## Introduction + +MobX is a battle tested library that makes state management simple and scalable by transparently applying functional reactive programming (TFRP). +The philosophy behind MobX is very simple: + +_Anything that can be derived from the application state, should be derived. Automatically._ + +which includes the UI, data serialization, server communication, etc. + +MobX unidirectional flow + +React and MobX together are a powerful combination. React renders the application state by providing mechanisms to translate it into a tree of renderable components. MobX provides the mechanism to store and update the application state that React then uses. + +Both React and MobX provide an optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with your React components by using a reactive virtual dependency state graph that is only updated when strictly needed and is never stale. + +## Core concepts + +MobX has only a few core concepts. The following snippets can be tried online using [codesandbox example](https://codesandbox.io/s/v3v0my2370). + +### Observable state + +Egghead.io lesson 1: observable & observer + +MobX adds observable capabilities to existing data structures like objects, arrays and class instances. +This can simply be done by annotating your class properties with the [@observable](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) decorator (ES.Next). + +```javascript +import { observable } from "mobx" + +class Todo { + id = Math.random() + @observable title = "" + @observable finished = false +} +``` + +Using `observable` is like turning a property of an object into a spreadsheet cell. +But unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. + +If your environment doesn't support decorator syntax, don't worry. +You can read [here](http://mobxjs.github.io/mobx/best/decorators.html) about how to set them up. +Or you can skip them altogether, as MobX can be used fine without decorator _syntax_, by leveraging the _decorate_ utility. +Many MobX users do prefer the decorator syntax though, as it is slightly more concise. + +```javascript +import { decorate, observable } from "mobx" + +class Todo { + id = Math.random() + title = "" + finished = false +} +decorate(Todo, { + title: observable, + finished: observable +}) +``` + +### Computed values + +Egghead.io lesson 3: computed values + +With MobX you can define values that will be derived automatically when relevant data is modified. +By using the [`@computed`](http://mobxjs.github.io/mobx/refguide/computed-decorator.html) decorator or by using getter / setter functions when using `(extend)Observable` (Of course, you can use `decorate` here again as alternative to the `@` syntax). + +```javascript +class TodoList { + @observable todos = [] + @computed get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } +} +``` + +MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. +Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically and only when required. + +### Reactions + +Egghead.io lesson 9: custom reactions + +Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. +In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. + +#### React components + +Egghead.io lesson 1: observable & observer + +If you are using React, you can turn your (stateless function) components into reactive components by simply adding the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function / decorator from the `mobx-react` package onto them. + +```javascript +import React, { Component } from "react" +import ReactDOM from "react-dom" +import { observer } from "mobx-react" + +@observer +class TodoListView extends Component { + render() { + return ( +
    +
      + {this.props.todoList.todos.map(todo => ( + + ))} +
    + Tasks left: {this.props.todoList.unfinishedTodoCount} +
    + ) + } +} + +const TodoView = observer(({ todo }) => ( +
  • + (todo.finished = !todo.finished)} /> + {todo.title} +
  • +)) + +const store = new TodoList() +ReactDOM.render(, document.getElementById("mount")) +``` + +`observer` turns React (function) components into derivations of the data they render. +When using MobX there are no smart or dumb components. +All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. +However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). + +#### Custom reactions + +Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), +[`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. + +For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: + +```javascript +autorun(() => { + console.log("Tasks left: " + todos.unfinishedTodoCount) +}) +``` + +### What will MobX react to? + +Why does a new message get printed each time the `unfinishedTodoCount` is changed? The answer is this rule of thumb: + +_MobX reacts to any existing observable property that is read during the execution of a tracked function._ + +For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](https://github.com/mobxjs/mobx/blob/gh-pages/docs/best/react.md). + +### Actions + +Egghead.io lesson 5: actions + +Unlike many flux frameworks, MobX is unopinionated about how user events should be handled. + +- This can be done in a Flux like manner. +- Or by processing events using RxJS. +- Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. + +In the end it all boils down to: Somehow the state should be updated. + +After updating the state `MobX` will take care of the rest in an efficient, glitch-free manner. So simple statements, like below, are enough to automatically update the user interface. + +There is no technical need for firing events, calling a dispatcher or what more. A React component in the end is nothing more than a fancy representation of your state. A derivation that will be managed by MobX. + +```javascript +store.todos.push(new Todo("Get Coffee"), new Todo("Write simpler code")) +store.todos[0].finished = true +``` + +Nonetheless, MobX has an optional built-in concept of [`actions`](https://mobxjs.github.io/mobx/refguide/action.html). +Read this section as well if you want to know more about writing asynchronous actions. It's easy! +Use them to your advantage; they will help you to structure your code better and make wise decisions about when and where state should be modified. + +## MobX: Simple and scalable + +MobX is one of the least obtrusive libraries you can use for state management. That makes the `MobX` approach not just simple, but very scalable as well: + +### Using classes and real references + +With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models (At Mendix for example ~500 different domain classes in a single application). + +### Referential integrity is guaranteed + +Since data doesn't need to be normalized, and MobX automatically tracks the relations between state and derivations, you get referential integrity for free. Rendering something that is accessed through three levels of indirection? + +No problem, MobX will track them and re-render whenever one of the references changes. As a result staleness bugs are a thing of the past. As a programmer you might forget that changing some data might influence a seemingly unrelated component in a corner case. MobX won't forget. + +### Simpler actions are easier to maintain + +As demonstrated above, modifying state when using MobX is very straightforward. You simply write down your intentions. MobX will take care of the rest. + +### Fine grained observability is efficient + +MobX builds a graph of all the derivations in your application to find the least number of re-computations that is needed to prevent staleness. "Derive everything" might sound expensive, MobX builds a virtual derivation graph to minimize the number of recomputations needed to keep derivations in sync with the state. + +In fact, when testing MobX at Mendix we found out that using this library to track the relations in our code is often a lot more efficient than pushing changes through our application by using handwritten events or "smart" selector based container components. + +The simple reason is that MobX will establish far more fine grained 'listeners' on your data than you would do as a programmer. + +Secondly MobX sees the causality between derivations so it can order them in such a way that no derivation has to run twice or introduces a glitch. + +How that works? See this [in-depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). + +### Easy interoperability + +MobX works with plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific library flavors. + +So you can simply keep using your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. + +For the same reason you can use it out of the box both server and client side, in isomorphic applications and with react-native. + +The result of this is that you often need to learn less new concepts when using MobX in comparison to other state management solutions. + +--- + +## Credits + +MobX is inspired by reactive programming principles as found in spreadsheets. It is inspired by MVVM frameworks like in MeteorJS tracker, knockout and Vue.js. But MobX brings Transparent Functional Reactive Programming to the next level and provides a stand alone implementation. It implements TFRP in a glitch-free, synchronous, predictable and efficient manner. + +A ton of credits for [Mendix](https://github.com/mendix), for providing the flexibility and support to maintain MobX and the chance to proof the philosophy of MobX in a real, complex, performance critical applications. + +And finally kudos for all the people that believed in, tried, validated and even [sponsored](https://github.com/mobxjs/mobx/blob/master/sponsors.md) MobX. + +## Further resources and documentation + +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) +- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) +- [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) +- [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- [Related projects](http://mobxjs.github.io/mobx/faq/related.html) + +## What others are saying... + +> Guise, #mobx isn't pubsub, or your grandpa's observer pattern. Nay, it is a carefully orchestrated observable dimensional portal fueled by the power cosmic. It doesn't do change detection, it's actually a level 20 psionic with soul knife, slashing your viewmodel into submission. + +> After using #mobx for lone projects for a few weeks, it feels awesome to introduce it to the team. Time: 1/2, Fun: 2X + +> Working with #mobx is basically a continuous loop of me going “this is way too simple, it definitely won’t work” only to be proven wrong + +> Try react-mobx with es6 and you will love it so much that you will hug someone. + +> I have built big apps with MobX already and comparing to the one before that which was using Redux, it is simpler to read and much easier to reason about. + +> The #mobx is the way I always want things to be! It's really surprising simple and fast! Totally awesome! Don't miss it! + +## Contributing + +- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. +- Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. +- Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. + +# MobX 4 vs MobX 5 + +The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do property tracking. As a consequence MobX 5 only runs on Proxy supporting browsers, in contrast to MobX 4 that runs on any ES 5 environment. + +The most noteable limitations of MobX 4: + +- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. +- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. + +For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). + +## Flow support + +MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. + +To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js) shipped with MobX: + +- In `.flowconfig`, you **cannot** ignore `node_modules`. +- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. +- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). + +## Donating + +Was MobX key in making your project a success? +Join our [open collective](https://opencollective.com/mobx#) or use the [donate button](https://mobxjs.github.io/mobx/donate.html)! + +### Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mobx#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +One time donations through paypal are welcome as well and are recorded in the [sponsors](sponsors.md) list. + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://mobxjs.github.io/mobx/donate.html) + +### Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/mobx#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 000000000..2e7f80899 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,49 @@ +# MobX + +- Introduction to MobX + - [Why MobX?](README.md) + - [The Gist of MobX](intro/overview.md) + - [Concepts & Principles](intro/concepts.md) +- [API overview](refguide/api.md) +- Making things observable + - [observable](refguide/observable.md) + - [@observable](refguide/observable-decorator.md) + - [objects](refguide/object.md) + - [arrays](refguide/array.md) + - [maps](refguide/map.md) + - [boxed values](refguide/boxed.md) + - [decorators](refguide/modifiers.md) +- Reacting to observables + - [(@)computed](refguide/computed-decorator.md) + - [autorun](refguide/autorun.md) + - [when](refguide/when.md) + - [reaction](refguide/reaction.md) + - [(@)observer](refguide/observer-component.md) + - [Understanding what MobX reacts to](best/react.md) +- Changing observables + - [action](refguide/action.md) + - [async actions & flows](best/actions.md) + - [Object api](refguide/object-api.md) +- Utility functions + - [toJS](refguide/tojson.md) + - [extendObservable](refguide/extend-observable.md) + - [createAtom](refguide/extending.md) + - [intercept & observe](refguide/observe.md) + - [mobxUtils.fromPromise](https://github.com/mobxjs/mobx-utils#frompromise) + - [mobxUtils.fromResource](https://github.com/mobxjs/mobx-utils#fromresource) + - [mobxUtils.toStream](https://github.com/mobxjs/mobx-utils#tostream) + - [mobxUtils.fromStream](https://github.com/mobxjs/mobx-utils#fromstream) + - [mobxUtils.now](https://github.com/mobxjs/mobx-utils#now) + - [mobxUtils.createTransformer](refguide/create-transformer.md) + - [mobxUtils.expr](refguide/expr.md) + - [complete api overview](refguide/api.md) +- [Blogs, videos, related projects](https://github.com/mobxjs/awesome-mobx#examples) +- Tips & Tricks + - [Frequently Asked Questions](faq/faq.md) + - [Common Pitfalls & Best Practices](best/pitfalls.md) + - [How to (not) use decorator syntax](best/decorators.md) + - [Using trace for debugging](best/trace.md) + - [Defining data stores](best/store.md) + - [Optimizing React components](best/react-performance.md) + - [spy](refguide/spy.md) +- [Donate](donating.md) diff --git a/docs/best/actions.md b/docs/best/actions.md new file mode 100644 index 000000000..222e05ed5 --- /dev/null +++ b/docs/best/actions.md @@ -0,0 +1,206 @@ +
    + +# Writing asynchronous actions + +The `action` wrapper / decorator only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! +This means that if you have a `setTimeout`, promise`.then` or `async` construction, and in that callback some more state is changed, those callbacks should be wrapped in `action` as well! There are several ways to create asynchronous actions. No approach is strictly better than the other, but this section just list different approaches you can take to writing asynchronous code. +Let's start with a basic example: + +### Promises + +```javascript +mobx.configure({ enforceActions: "observed" }) // don't allow state modifications outside actions + +class Store { + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + projects => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + }, + error => { + this.state = "error" + } + ) + } +} +``` + +The above example would throw exceptions, as the callbacks passed to the `fetchGithubProjectsSomehow` promise are not part of the `fetchProjects` action, as actions only apply to the current stack. + +A first simple fix is to extract the callbacks to actions. (Note that binding using `action.bound` is important here to get a correct `this`!): + +```javascript +mobx.configure({ enforceActions: "observed" }) + +class Store { + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then(this.fetchProjectsSuccess, this.fetchProjectsError) + } + + @action.bound + fetchProjectsSuccess(projects) { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + } + + @action.bound + fetchProjectsError(error) { + this.state = "error" + } +} +``` + +Although this is clean and explicit, it might get a bit verbose with complex async flows. Alternative, you can wrap the promise callbacks with the `action` keyword. It is recommended, but not mandatory, to give them a name as well: + +```javascript +mobx.configure({ enforceActions: "observed" }) + +class Store { + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + // inline created action + action("fetchSuccess", projects => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + }), + // inline created action + action("fetchError", error => { + this.state = "error" + }) + ) + } +} +``` + +### The `runInAction` utility + +A downside of inline actions is that TypeScript does not apply type inference on them, so you would have type all your callbacks. +Instead of creating an action for the entire callback, you can also run only the state modifying part of the callback in an action. +The advantage of this pattern is that it encourages you to not litter the place with `action`, but rather put all the state modifications as much as possible at the end of the whole process: + +```javascript +mobx.configure({ enforceActions: "observed" }) + +class Store { + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + projects => { + const filteredProjects = somePreprocessing(projects) + // put the 'final' modification in an anonymous action + runInAction(() => { + this.githubProjects = filteredProjects + this.state = "done" + }) + }, + error => { + // the alternative ending of this process:... + runInAction(() => { + this.state = "error" + }) + } + ) + } +} +``` + +Note that `runInAction`'s can also be given a name as first argument. `runInAction(f)` is in fact just sugar for `action(f)()` + +### async / await + +Async / await based functions can initially seem confusing when starting with actions. +Because lexically they appear to synchronous functions, it gives the impression that `@action` applies to the entire function. +Which is of course not the case, as async / await is just syntactic sugar around a promise based process. +As a result, `@action` only applies to the code block until the first `await`. +And after each `await` a new asynchronous function is started, so after each `await`, state modifying code should be wrapped as action. +This is where `runInAction` comes in handy again: + +```javascript +mobx.configure({ enforceActions: "observed" }) + +class Store { + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + async fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = await fetchGithubProjectsSomehow() + const filteredProjects = somePreprocessing(projects) + // after await, modifying state again, needs an actions: + runInAction(() => { + this.state = "done" + this.githubProjects = filteredProjects + }) + } catch (error) { + runInAction(() => { + this.state = "error" + }) + } + } +} +``` + +### flows + +However, a nicer approach is to use the built-in concept of `flow`s. They use generators. Which might look scary in the beginning, but it works the same as `async` / `await`. Just use `function *` instead of `async` and `yield` instead of `await`. +The advantage of `flow` is that it is syntactically very close to async / await (with different keywords), and no manually action wrapping is needed for async parts, resulting in very clean code. + +`flow` can be used only as function and not as decorator. +`flow` integrates neatly with MobX development tools, so that it is easy to trace the process of the async function. + +```javascript +mobx.configure({ enforceActions: "observed" }) + +class Store { + @observable githubProjects = [] + @observable state = "pending" + + fetchProjects = flow(function * () { // <- note the star, this a generator function! + this.githubProjects = [] + this.state = "pending" + try { + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) + // the asynchronous blocks will automatically be wrapped in actions and can modify state + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + }) +} +``` + +#### Flows can be cancelled + +Flows are cancellable, that means that you can call `cancel()` on the returned promise. This will stop the generator immediately, but any finally clause will still be processed. The returned promise itself will reject with `FLOW_CANCELLED`. diff --git a/docs/best/decorators.md b/docs/best/decorators.md new file mode 100644 index 000000000..02ee2458c --- /dev/null +++ b/docs/best/decorators.md @@ -0,0 +1,186 @@ +
    + +# How to (not) use decorators + +Using ES.next decorators in MobX is optional. This section explains how to use them, or how to avoid them. + +Advantages of using decorator syntax: + +* Minimizes boilerplate, declarative. +* Easy to use and read. A majority of the MobX users use them. + +Disadvantages of using decorator syntax: + +* Stage-2 ES.next feature +* Requires a little setup and transpilation, only supported with Babel / Typescript transpilation so far + +You can approach using decorators in two ways in MobX + +1. Enable the currently experimental decorator syntax in your compiler (read on) +2. Don't enable decorator syntax, but leverage the MobX built-in utility `decorate` to apply decorators to your classes / objects. + +Using decorator syntax: + +```javascript +import { observable, computed, action } from "mobx"; + +class Timer { + @observable start = Date.now(); + @observable current = Date.now(); + + @computed + get elapsedTime() { + return this.current - this.start + "milliseconds"; + } + + @action + tick() { + this.current = Date.now(); + } +} +``` + +Using the `decorate` utility: + +```javascript +import { observable, computed, action, decorate } from "mobx"; + +class Timer { + start = Date.now(); + current = Date.now(); + + get elapsedTime() { + return this.current - this.start + "milliseconds"; + } + + tick() { + this.current = Date.now(); + } +} +decorate(Timer, { + start: observable, + current: observable, + elapsedTime: computed, + tick: action +}); +``` + +For applying multiple decorators on a single property, you can pass an array of decorators. The decorators application order is from right to left. + +```javascript +import { decorate, observable } from "mobx" +import { serializable, primitive } from "serializr" +import persist from "mobx-persist"; + +class Todo { + id = Math.random(); + title = ""; + finished = false; +} +decorate(Todo, { + title: [serializable(primitive), persist("object"), observable], + finished: [serializable(primitive), observable] +}) +``` +Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. + +--- + +The `observer` function from `mobx-react` is both a decorator and a function, that means that all these syntax variants will work: + +```javascript +@observer +class Timer extends React.Component { + /* ... */ +} + +const Timer = observer(class Timer extends React.Component { + /* ... */ +}) + +const Timer = observer((props) => ( + /* rendering */ +)) +``` + +## Enabling decorator syntax + +If you want to use decorators follow the following steps. + +**TypeScript** + +Enable the compiler option `"experimentalDecorators": true` in your `tsconfig.json`. + +**Babel 6: using `babel-preset-mobx`** + +A more convenient way to setup Babel for usage with mobx is to use the [`mobx`](https://github.com/zwhitchcox/babel-preset-mobx) preset, that incorporates decorators and several other plugins typically used with mobx: + +``` +npm install --save-dev babel-preset-mobx +``` + +.babelrc: + +```json +{ + "presets": ["mobx"] +} +``` + +**Babel 6: manually enabling decorators** + +To enable support for decorators without using the mobx preset, follow the following steps. +Install support for decorators: `npm i --save-dev babel-plugin-transform-decorators-legacy`. And enable it in your `.babelrc` file: + +```json +{ + "presets": ["es2015", "stage-1"], + "plugins": ["transform-decorators-legacy"] +} +``` + +Note that the order of plugins is important: `transform-decorators-legacy` should be listed _first_. +Having issues with the babel setup? Check this [issue](https://github.com/mobxjs/mobx/issues/105) first. + +**Babel 7** + +Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators`. And enable it in your `.babelrc` file: + +```json +{ + "plugins": [ + ["@babel/plugin-proposal-decorators", { "legacy": true}], + ["@babel/plugin-proposal-class-properties", { "loose": true}] + ] +} +``` + +Note that the `legacy` mode is important (as is putting the decorators proposal first). Non-legacy mode is [WIP](https://github.com/mobxjs/mobx/pull/1732). + +## Decorator syntax and Create React App (v1) + +* Decorators are not supported out of the box in `create-react-app@1.*`. To fix this, you can either use the `decorate` utility, eject, or use the [react-app-rewired](https://github.com/timarney/react-app-rewired/tree/master/packages/react-app-rewire-mobx) package. + +## Decorator syntax and Create React App (v2) + +* Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1`. In older versions or when using vanilla JavaScript use either the `decorate` utility, eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. + +--- + +## Disclamer: Limitations of decorator syntax: + +_The current transpiler implementations of decorator syntax are quite limited and don't behave exactly the same. +Also, many compositional patterns are currently not possible with decorators, until the stage-2 proposal has been implemented by all transpilers. +For this reason the scope of decorator syntax support in MobX is currently scoped to make sure that the supported features +behave consistently accross all environments_ + +The following patterns are not officially supported by the MobX community: + +* Redefining decorated class members in inheritance trees +* Decorating static class members +* Combining decorators provided by MobX with other decorators +* Hot module reloading (HMR) / React-hot-loader might not work as expected + +Decorated properties might not be visible yet on class instances as _own_ property until the first read / write to that property occurred. + +(N.B.: not supported doesn't mean it doesn't work, it means that if it doesn't work, reported issues will not be processed until the official spec has been moved forward) diff --git a/docs/best/devtools.md b/docs/best/devtools.md new file mode 100644 index 000000000..8d66831e1 --- /dev/null +++ b/docs/best/devtools.md @@ -0,0 +1,38 @@ +
    + +# MobX + React DevTools + +
    + egghead.io lesson 2: devtools +
    +
    +
    Hosted on egghead.io
    diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 029f3ed5e..970fdd46a 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -10,13 +10,14 @@ sidebar_label: Concepts & Principles
    egghead.io lesson 1: observable & observer -
    +
    -
    Hosted on egghead.io
    + So far it all might sound a bit fancy, but making an app reactive using MobX boils down to just these three steps: ## 1. Define your state and make it observable diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 23669d8d5..04dae2cd8 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -12,7 +12,7 @@ sidebar_label: action egghead.io lesson 5: actions
    -
    Hosted on egghead.io diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 8a0310fd0..62586170d 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -12,7 +12,7 @@ sidebar_label: autorun egghead.io lesson 9: custom reactions
    -
    Hosted on egghead.io diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index a0c586e8d..6cbd89eff 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -12,7 +12,7 @@ sidebar_label: (@)computed egghead.io lesson 3: computed values
    -
    Hosted on egghead.io diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index 6787eca92..e89075e9e 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -12,7 +12,7 @@ sidebar_label: @observable egghead.io lesson 1: observable & observer
    -
    Hosted on egghead.io @@ -21,7 +21,7 @@ sidebar_label: @observable egghead.io lesson 4: observable objects & maps
    -
    Hosted on egghead.io diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 1f7424482..6bc5dfda1 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -12,7 +12,7 @@ sidebar_label: observable egghead.io lesson 1: observable & observer
    -
    Hosted on egghead.io @@ -21,7 +21,7 @@ sidebar_label: observable egghead.io lesson 4: observable objects & maps
    -
    Hosted on egghead.io diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index 3bd744a5d..95b1bd03d 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -10,9 +10,9 @@ sidebar_label: (@)observer
    egghead.io lesson 1: observable & observer -
    +
    -
    Hosted on egghead.io
    diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 25c30e144..91f0e2eb0 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -10,9 +10,9 @@ sidebar_label: when
    egghead.io lesson 9: custom reactions -
    +
    -
    Hosted on egghead.io
    From cacdbece33bd534f54717c7ef0d28e93bf943df8 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Tue, 10 Sep 2019 21:48:21 -0500 Subject: [PATCH 0117/1043] docs: remove edit link --- website/siteConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/siteConfig.js b/website/siteConfig.js index f6ea6b50e..82a321f18 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -42,7 +42,7 @@ const siteConfig = { // URL for editing docs, usage example: editUrl + 'en/doc1.md'. // If this field is omitted, there will be no "Edit this Doc" button // for each document. - editUrl: "docs/", + // editUrl: "docs/", From 6c93833aed278c5876ed94407893b9f8b6d28ec7 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Tue, 10 Sep 2019 22:13:06 -0500 Subject: [PATCH 0118/1043] docs: remove boilerplate. update links - remove docusaurus generated content (blog, etc) that is unused - update various links (ex: docs in Footer) to make them work - remove most non-documentation pages - greatly simplify landing page --- .dockerignore | 2 - Dockerfile | 10 - docker-compose.yml | 18 -- website/README.md | 193 ------------------ website/blog/2016-03-11-blog-post.md | 18 -- website/blog/2017-04-10-blog-post-two.md | 18 -- website/blog/2017-09-25-testing-rss.md | 11 - website/blog/2017-09-26-adding-rss.md | 10 - website/blog/2017-10-24-new-version-1.0.0.md | 8 - website/core/Footer.js | 43 +--- website/i18n/en.json | 3 +- website/pages/en/help.js | 54 ----- website/pages/en/index.js | 23 +-- website/pages/en/users.js | 48 ----- website/sidebars.json | 1 - website/siteConfig.js | 1 - website/static/img/oss_logo.png | Bin 4370 -> 0 bytes website/static/img/undraw_code_review.svg | 1 - website/static/img/undraw_monitor.svg | 1 - website/static/img/undraw_note_list.svg | 1 - website/static/img/undraw_online.svg | 1 - website/static/img/undraw_open_source.svg | 1 - .../static/img/undraw_operating_system.svg | 1 - website/static/img/undraw_react.svg | 1 - website/static/img/undraw_tweetstorm.svg | 1 - .../static/img/undraw_youtube_tutorial.svg | 1 - 26 files changed, 17 insertions(+), 453 deletions(-) delete mode 100755 .dockerignore delete mode 100755 Dockerfile delete mode 100755 docker-compose.yml delete mode 100755 website/README.md delete mode 100755 website/blog/2016-03-11-blog-post.md delete mode 100755 website/blog/2017-04-10-blog-post-two.md delete mode 100755 website/blog/2017-09-25-testing-rss.md delete mode 100755 website/blog/2017-09-26-adding-rss.md delete mode 100755 website/blog/2017-10-24-new-version-1.0.0.md delete mode 100755 website/pages/en/help.js delete mode 100755 website/pages/en/users.js delete mode 100755 website/static/img/oss_logo.png delete mode 100755 website/static/img/undraw_code_review.svg delete mode 100755 website/static/img/undraw_monitor.svg delete mode 100755 website/static/img/undraw_note_list.svg delete mode 100755 website/static/img/undraw_online.svg delete mode 100755 website/static/img/undraw_open_source.svg delete mode 100755 website/static/img/undraw_operating_system.svg delete mode 100755 website/static/img/undraw_react.svg delete mode 100755 website/static/img/undraw_tweetstorm.svg delete mode 100755 website/static/img/undraw_youtube_tutorial.svg diff --git a/.dockerignore b/.dockerignore deleted file mode 100755 index 27d2dae2b..000000000 --- a/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -*/node_modules -*.log diff --git a/Dockerfile b/Dockerfile deleted file mode 100755 index d369844d5..000000000 --- a/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM node:8.11.4 - -WORKDIR /app/website - -EXPOSE 3000 35729 -COPY ./docs /app/docs -COPY ./website /app/website -RUN yarn install - -CMD ["yarn", "start"] diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100755 index 6711192ae..000000000 --- a/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - docusaurus: - build: . - ports: - - 3000:3000 - - 35729:35729 - volumes: - - ./docs:/app/docs - - ./website/blog:/app/website/blog - - ./website/core:/app/website/core - - ./website/i18n:/app/website/i18n - - ./website/pages:/app/website/pages - - ./website/static:/app/website/static - - ./website/sidebars.json:/app/website/sidebars.json - - ./website/siteConfig.js:/app/website/siteConfig.js - working_dir: /app/website diff --git a/website/README.md b/website/README.md deleted file mode 100755 index f3da77ff3..000000000 --- a/website/README.md +++ /dev/null @@ -1,193 +0,0 @@ -This website was created with [Docusaurus](https://docusaurus.io/). - -# What's In This Document - -* [Get Started in 5 Minutes](#get-started-in-5-minutes) -* [Directory Structure](#directory-structure) -* [Editing Content](#editing-content) -* [Adding Content](#adding-content) -* [Full Documentation](#full-documentation) - -# Get Started in 5 Minutes - -1. Make sure all the dependencies for the website are installed: - -```sh -# Install dependencies -$ yarn -``` -2. Run your dev server: - -```sh -# Start the site -$ yarn start -``` - -## Directory Structure - -Your project file structure should look something like this - -``` -my-docusaurus/ - docs/ - doc-1.md - doc-2.md - doc-3.md - website/ - blog/ - 2016-3-11-oldest-post.md - 2017-10-24-newest-post.md - core/ - node_modules/ - pages/ - static/ - css/ - img/ - package.json - sidebar.json - siteConfig.js -``` - -# Editing Content - -## Editing an existing docs page - -Edit docs by navigating to `docs/` and editing the corresponding document: - -`docs/doc-to-be-edited.md` - -```markdown ---- -id: page-needs-edit -title: This Doc Needs To Be Edited ---- - -Edit me... -``` - -For more information about docs, click [here](https://docusaurus.io/docs/en/navigation) - -## Editing an existing blog post - -Edit blog posts by navigating to `website/blog` and editing the corresponding post: - -`website/blog/post-to-be-edited.md` -```markdown ---- -id: post-needs-edit -title: This Blog Post Needs To Be Edited ---- - -Edit me... -``` - -For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog) - -# Adding Content - -## Adding a new docs page to an existing sidebar - -1. Create the doc as a new markdown file in `/docs`, example `docs/newly-created-doc.md`: - -```md ---- -id: newly-created-doc -title: This Doc Needs To Be Edited ---- - -My new content here.. -``` - -1. Refer to that doc's ID in an existing sidebar in `website/sidebar.json`: - -```javascript -// Add newly-created-doc to the Getting Started category of docs -{ - "docs": { - "Getting Started": [ - "quick-start", - "newly-created-doc" // new doc here - ], - ... - }, - ... -} -``` - -For more information about adding new docs, click [here](https://docusaurus.io/docs/en/navigation) - -## Adding a new blog post - -1. Make sure there is a header link to your blog in `website/siteConfig.js`: - -`website/siteConfig.js` -```javascript -headerLinks: [ - ... - { blog: true, label: 'Blog' }, - ... -] -``` - -2. Create the blog post with the format `YYYY-MM-DD-My-Blog-Post-Title.md` in `website/blog`: - -`website/blog/2018-05-21-New-Blog-Post.md` - -```markdown ---- -author: Frank Li -authorURL: https://twitter.com/foobarbaz -authorFBID: 503283835 -title: New Blog Post ---- - -Lorem Ipsum... -``` - -For more information about blog posts, click [here](https://docusaurus.io/docs/en/adding-blog) - -## Adding items to your site's top navigation bar - -1. Add links to docs, custom pages or external links by editing the headerLinks field of `website/siteConfig.js`: - -`website/siteConfig.js` -```javascript -{ - headerLinks: [ - ... - /* you can add docs */ - { doc: 'my-examples', label: 'Examples' }, - /* you can add custom pages */ - { page: 'help', label: 'Help' }, - /* you can add external links */ - { href: 'https://github.com/facebook/Docusaurus', label: 'GitHub' }, - ... - ], - ... -} -``` - -For more information about the navigation bar, click [here](https://docusaurus.io/docs/en/navigation) - -## Adding custom pages - -1. Docusaurus uses React components to build pages. The components are saved as .js files in `website/pages/en`: -1. If you want your page to show up in your navigation header, you will need to update `website/siteConfig.js` to add to the `headerLinks` element: - -`website/siteConfig.js` -```javascript -{ - headerLinks: [ - ... - { page: 'my-new-custom-page', label: 'My New Custom Page' }, - ... - ], - ... -} -``` - -For more information about custom pages, click [here](https://docusaurus.io/docs/en/custom-pages). - -# Full Documentation - -Full documentation can be found on the [website](https://docusaurus.io/). diff --git a/website/blog/2016-03-11-blog-post.md b/website/blog/2016-03-11-blog-post.md deleted file mode 100755 index cf2ba2960..000000000 --- a/website/blog/2016-03-11-blog-post.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Blog Title -author: Blog Author -authorURL: http://twitter.com/ -authorFBID: 100002976521003 ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus elementum massa eget nulla aliquet sagittis. Proin odio tortor, vulputate ut odio in, ultrices ultricies augue. Cras ornare ultrices lorem malesuada iaculis. Etiam sit amet libero tempor, pulvinar mauris sed, sollicitudin sapien. - - - -Mauris vestibulum ullamcorper nibh, ut semper purus pulvinar ut. Donec volutpat orci sit amet mauris malesuada, non pulvinar augue aliquam. Vestibulum ultricies at urna ut suscipit. Morbi iaculis, erat at imperdiet semper, ipsum nulla sodales erat, eget tincidunt justo dui quis justo. Pellentesque dictum bibendum diam at aliquet. Sed pulvinar, dolor quis finibus ornare, eros odio facilisis erat, eu rhoncus nunc dui sed ex. Nunc gravida dui massa, sed ornare arcu tincidunt sit amet. Maecenas efficitur sapien neque, a laoreet libero feugiat ut. - -Nulla facilisi. Maecenas sodales nec purus eget posuere. Sed sapien quam, pretium a risus in, porttitor dapibus erat. Sed sit amet fringilla ipsum, eget iaculis augue. Integer sollicitudin tortor quis ultricies aliquam. Suspendisse fringilla nunc in tellus cursus, at placerat tellus scelerisque. Sed tempus elit a sollicitudin rhoncus. Nulla facilisi. Morbi nec dolor dolor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras et aliquet lectus. Pellentesque sit amet eros nisi. Quisque ac sapien in sapien congue accumsan. Nullam in posuere ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin lacinia leo a nibh fringilla pharetra. - -Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin venenatis lectus dui, vel ultrices ante bibendum hendrerit. Aenean egestas feugiat dui id hendrerit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur in tellus laoreet, eleifend nunc id, viverra leo. Proin vulputate non dolor vel vulputate. Curabitur pretium lobortis felis, sit amet finibus lorem suscipit ut. Sed non mollis risus. Duis sagittis, mi in euismod tincidunt, nunc mauris vestibulum urna, at euismod est elit quis erat. Phasellus accumsan vitae neque eu placerat. In elementum arcu nec tellus imperdiet, eget maximus nulla sodales. Curabitur eu sapien eget nisl sodales fermentum. - -Phasellus pulvinar ex id commodo imperdiet. Praesent odio nibh, sollicitudin sit amet faucibus id, placerat at metus. Donec vitae eros vitae tortor hendrerit finibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque vitae purus dolor. Duis suscipit ac nulla et finibus. Phasellus ac sem sed dui dictum gravida. Phasellus eleifend vestibulum facilisis. Integer pharetra nec enim vitae mattis. Duis auctor, lectus quis condimentum bibendum, nunc dolor aliquam massa, id bibendum orci velit quis magna. Ut volutpat nulla nunc, sed interdum magna condimentum non. Sed urna metus, scelerisque vitae consectetur a, feugiat quis magna. Donec dignissim ornare nisl, eget tempor risus malesuada quis. diff --git a/website/blog/2017-04-10-blog-post-two.md b/website/blog/2017-04-10-blog-post-two.md deleted file mode 100755 index 3ab4637bd..000000000 --- a/website/blog/2017-04-10-blog-post-two.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: New Blog Post -author: Blog Author -authorURL: http://twitter.com/ -authorFBID: 100002976521003 ---- - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus elementum massa eget nulla aliquet sagittis. Proin odio tortor, vulputate ut odio in, ultrices ultricies augue. Cras ornare ultrices lorem malesuada iaculis. Etiam sit amet libero tempor, pulvinar mauris sed, sollicitudin sapien. - - - -Mauris vestibulum ullamcorper nibh, ut semper purus pulvinar ut. Donec volutpat orci sit amet mauris malesuada, non pulvinar augue aliquam. Vestibulum ultricies at urna ut suscipit. Morbi iaculis, erat at imperdiet semper, ipsum nulla sodales erat, eget tincidunt justo dui quis justo. Pellentesque dictum bibendum diam at aliquet. Sed pulvinar, dolor quis finibus ornare, eros odio facilisis erat, eu rhoncus nunc dui sed ex. Nunc gravida dui massa, sed ornare arcu tincidunt sit amet. Maecenas efficitur sapien neque, a laoreet libero feugiat ut. - -Nulla facilisi. Maecenas sodales nec purus eget posuere. Sed sapien quam, pretium a risus in, porttitor dapibus erat. Sed sit amet fringilla ipsum, eget iaculis augue. Integer sollicitudin tortor quis ultricies aliquam. Suspendisse fringilla nunc in tellus cursus, at placerat tellus scelerisque. Sed tempus elit a sollicitudin rhoncus. Nulla facilisi. Morbi nec dolor dolor. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras et aliquet lectus. Pellentesque sit amet eros nisi. Quisque ac sapien in sapien congue accumsan. Nullam in posuere ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin lacinia leo a nibh fringilla pharetra. - -Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin venenatis lectus dui, vel ultrices ante bibendum hendrerit. Aenean egestas feugiat dui id hendrerit. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur in tellus laoreet, eleifend nunc id, viverra leo. Proin vulputate non dolor vel vulputate. Curabitur pretium lobortis felis, sit amet finibus lorem suscipit ut. Sed non mollis risus. Duis sagittis, mi in euismod tincidunt, nunc mauris vestibulum urna, at euismod est elit quis erat. Phasellus accumsan vitae neque eu placerat. In elementum arcu nec tellus imperdiet, eget maximus nulla sodales. Curabitur eu sapien eget nisl sodales fermentum. - -Phasellus pulvinar ex id commodo imperdiet. Praesent odio nibh, sollicitudin sit amet faucibus id, placerat at metus. Donec vitae eros vitae tortor hendrerit finibus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque vitae purus dolor. Duis suscipit ac nulla et finibus. Phasellus ac sem sed dui dictum gravida. Phasellus eleifend vestibulum facilisis. Integer pharetra nec enim vitae mattis. Duis auctor, lectus quis condimentum bibendum, nunc dolor aliquam massa, id bibendum orci velit quis magna. Ut volutpat nulla nunc, sed interdum magna condimentum non. Sed urna metus, scelerisque vitae consectetur a, feugiat quis magna. Donec dignissim ornare nisl, eget tempor risus malesuada quis. diff --git a/website/blog/2017-09-25-testing-rss.md b/website/blog/2017-09-25-testing-rss.md deleted file mode 100755 index b7ff8129c..000000000 --- a/website/blog/2017-09-25-testing-rss.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Adding RSS Support - RSS Truncation Test -author: Eric Nakagawa -authorURL: http://twitter.com/ericnakagawa -authorFBID: 661277173 ---- -1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 - -This should be truncated. - -This line should never render in XML. diff --git a/website/blog/2017-09-26-adding-rss.md b/website/blog/2017-09-26-adding-rss.md deleted file mode 100755 index eeb4f0477..000000000 --- a/website/blog/2017-09-26-adding-rss.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Adding RSS Support -author: Eric Nakagawa -authorURL: http://twitter.com/ericnakagawa -authorFBID: 661277173 ---- - -This is a test post. - -A whole bunch of other information. diff --git a/website/blog/2017-10-24-new-version-1.0.0.md b/website/blog/2017-10-24-new-version-1.0.0.md deleted file mode 100755 index 60761c02d..000000000 --- a/website/blog/2017-10-24-new-version-1.0.0.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: New Version 1.0.0 -author: Eric Nakagawa -authorURL: http://twitter.com/ericnakagawa -authorFBID: 661277173 ---- - -This blog post will test file name parsing issues when periods are present. diff --git a/website/core/Footer.js b/website/core/Footer.js index 591eb0219..34b4afa90 100755 --- a/website/core/Footer.js +++ b/website/core/Footer.js @@ -37,39 +37,29 @@ class Footer extends React.Component {
    More
    - Blog - GitHub Follow @{this.props.config.twitterUsername} @@ -107,19 +97,6 @@ class Footer extends React.Component {
    - - Facebook Open Source - -
    {this.props.config.copyright}
    ); } diff --git a/website/i18n/en.json b/website/i18n/en.json index f9462df5a..d4a019625 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -160,8 +160,7 @@ } }, "links": { - "Documentation": "Documentation", - "Introduction": "Introduction" + "Documentation": "Documentation" }, "categories": { "Introduction": "Introduction", diff --git a/website/pages/en/help.js b/website/pages/en/help.js deleted file mode 100755 index 2b790e460..000000000 --- a/website/pages/en/help.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -const React = require('react'); - -const CompLibrary = require('../../core/CompLibrary.js'); - -const Container = CompLibrary.Container; -const GridBlock = CompLibrary.GridBlock; - -function Help(props) { - const {config: siteConfig, language = ''} = props; - const {baseUrl, docsUrl} = siteConfig; - const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; - const langPart = `${language ? `${language}/` : ''}`; - const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`; - - const supportLinks = [ - { - content: `Learn more using the [documentation on this site.](${docUrl( - 'doc1.html', - )})`, - title: 'Browse Docs', - }, - { - content: 'Ask questions about the documentation and project', - title: 'Join the community', - }, - { - content: "Find out what's new with this project", - title: 'Stay up to date', - }, - ]; - - return ( -
    - -
    -
    -

    Need help?

    -
    -

    This project is maintained by a dedicated group of people.

    - -
    -
    -
    - ); -} - -module.exports = Help; diff --git a/website/pages/en/index.js b/website/pages/en/index.js index 77d657aee..88ff7eec6 100755 --- a/website/pages/en/index.js +++ b/website/pages/en/index.js @@ -15,8 +15,8 @@ const GridBlock = CompLibrary.GridBlock; class HomeSplash extends React.Component { render() { - const {siteConfig, language = ''} = this.props; - const {baseUrl, docsUrl} = siteConfig; + const { siteConfig, language = '' } = this.props; + const { baseUrl, docsUrl } = siteConfig; const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; const langPart = `${language ? `${language}/` : ''}`; const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`; @@ -60,13 +60,10 @@ class HomeSplash extends React.Component { return ( -
    - - - +
    @@ -76,8 +73,8 @@ class HomeSplash extends React.Component { class Index extends React.Component { render() { - const {config: siteConfig, language = ''} = this.props; - const {baseUrl} = siteConfig; + const { config: siteConfig, language = '' } = this.props; + const { baseUrl } = siteConfig; const Block = props => ( (
    + style={{ textAlign: 'center' }}>

    Feature Callout

    These are features of this project
    @@ -196,14 +193,6 @@ class Index extends React.Component { return (
    -
    - - - - - - -
    ); } diff --git a/website/pages/en/users.js b/website/pages/en/users.js deleted file mode 100755 index 039dc39ff..000000000 --- a/website/pages/en/users.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -const React = require('react'); - -const CompLibrary = require('../../core/CompLibrary.js'); - -const Container = CompLibrary.Container; - -class Users extends React.Component { - render() { - const {config: siteConfig} = this.props; - if ((siteConfig.users || []).length === 0) { - return null; - } - - const editUrl = `${siteConfig.repoUrl}/edit/master/website/siteConfig.js`; - const showcase = siteConfig.users.map(user => ( - - {user.caption} - - )); - - return ( -
    - -
    -
    -

    Who is Using This?

    -

    This project is used by many folks

    -
    -
    {showcase}
    -

    Are you using this project?

    - - Add your company - -
    -
    -
    - ); - } -} - -module.exports = Users; diff --git a/website/sidebars.json b/website/sidebars.json index 6bbf29752..d8f6e6211 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -2,7 +2,6 @@ "docs": { "Introduction": [ "README", - "intro/overview", "intro/concepts", "refguide/api" ], diff --git a/website/siteConfig.js b/website/siteConfig.js index 82a321f18..075dbcc95 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -53,7 +53,6 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ { doc: "intro/concepts", label: "Documentation" }, - { doc: "README", label: "Introduction" }, ], // If you have users set above, you add it here: diff --git a/website/static/img/oss_logo.png b/website/static/img/oss_logo.png deleted file mode 100755 index 8183e289b139e5d03ff9870d3e6bfbcd968a5edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4370 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 review diff --git a/website/static/img/undraw_monitor.svg b/website/static/img/undraw_monitor.svg deleted file mode 100755 index fcf7192d3..000000000 --- a/website/static/img/undraw_monitor.svg +++ /dev/null @@ -1 +0,0 @@ -monitor diff --git a/website/static/img/undraw_note_list.svg b/website/static/img/undraw_note_list.svg deleted file mode 100755 index 50e3b51bf..000000000 --- a/website/static/img/undraw_note_list.svg +++ /dev/null @@ -1 +0,0 @@ -note list diff --git a/website/static/img/undraw_online.svg b/website/static/img/undraw_online.svg deleted file mode 100755 index 5b2fabcb1..000000000 --- a/website/static/img/undraw_online.svg +++ /dev/null @@ -1 +0,0 @@ -online diff --git a/website/static/img/undraw_open_source.svg b/website/static/img/undraw_open_source.svg deleted file mode 100755 index 91a44ddbe..000000000 --- a/website/static/img/undraw_open_source.svg +++ /dev/null @@ -1 +0,0 @@ -open source diff --git a/website/static/img/undraw_operating_system.svg b/website/static/img/undraw_operating_system.svg deleted file mode 100755 index ee53de8d0..000000000 --- a/website/static/img/undraw_operating_system.svg +++ /dev/null @@ -1 +0,0 @@ -operating system diff --git a/website/static/img/undraw_react.svg b/website/static/img/undraw_react.svg deleted file mode 100755 index a0a67b604..000000000 --- a/website/static/img/undraw_react.svg +++ /dev/null @@ -1 +0,0 @@ -react diff --git a/website/static/img/undraw_tweetstorm.svg b/website/static/img/undraw_tweetstorm.svg deleted file mode 100755 index ab7aae54d..000000000 --- a/website/static/img/undraw_tweetstorm.svg +++ /dev/null @@ -1 +0,0 @@ -tweetstorm diff --git a/website/static/img/undraw_youtube_tutorial.svg b/website/static/img/undraw_youtube_tutorial.svg deleted file mode 100755 index c4d7a4844..000000000 --- a/website/static/img/undraw_youtube_tutorial.svg +++ /dev/null @@ -1 +0,0 @@ -youtube tutorial From b072a811a3a64a1acb6061ded3d878bce6719ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AF=92=E6=9E=AD=E4=B8=9C?= Date: Wed, 11 Sep 2019 19:54:52 +0800 Subject: [PATCH 0119/1043] Use convergent global (#2104) * chore: use convergent global * fix: remove unused window --- src/mobx.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/mobx.ts b/src/mobx.ts index a9fa7a063..cc6fe375f 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -16,20 +16,21 @@ * */ +import { getGlobal, spy, getDebugName, $mobx } from "./internal" + if (typeof Proxy === "undefined" || typeof Symbol === "undefined") { throw new Error( "[mobx] MobX 5+ requires Proxy and Symbol objects. If your environment doesn't support Symbol or Proxy objects, please downgrade to MobX 4. For React Native Android, consider upgrading JSCore." ) } -declare const window: any try { // define process.env if needed // if this is not a production build in the first place // (in which case the expression below would be substituted with 'production') process.env.NODE_ENV } catch (e) { - const g = typeof window !== "undefined" ? window : global + const g = getGlobal() if (typeof process === "undefined") g.process = {} g.process.env = {} } @@ -154,8 +155,6 @@ export { } from "./internal" // Devtools support -import { spy, getDebugName, $mobx } from "./internal" - declare const __MOBX_DEVTOOLS_GLOBAL_HOOK__: { injectMobx: (any) => void } if (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "object") { // See: https://github.com/andykog/mobx-devtools/ From a608905e9de87e8fde91829a5176e68d247e0e4f Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Thu, 12 Sep 2019 09:53:53 -0500 Subject: [PATCH 0120/1043] docs: add codefund script --- website/siteConfig.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/website/siteConfig.js b/website/siteConfig.js index 075dbcc95..7376e1c71 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -92,7 +92,13 @@ myOtherFont: [ }, // Add custom scripts here that would be placed in " - ) - } - } - } -}; diff --git a/docs/node_modules/gitbook-plugin-codefund/package.json b/docs/node_modules/gitbook-plugin-codefund/package.json deleted file mode 100644 index 9356d328f..000000000 --- a/docs/node_modules/gitbook-plugin-codefund/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "gitbook-plugin-codefund", - "description": "", - "main": "index.js", - "version": "0.2.1", - "engines": { - "gitbook": ">=0.4.6" - }, - "homepage": "", - "repository": { - "type": "git", - "url": "" - }, - "license": "Apache 2", - "bugs": { - "url": "" - }, - "_id": "gitbook-plugin-codefund@0.2.1" -} From 5f74f5057d8dbd4d20b87d9fc0dd433e51b30247 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Thu, 12 Sep 2019 17:29:07 -0500 Subject: [PATCH 0122/1043] docs: fix baseUrl and project name --- website/siteConfig.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/website/siteConfig.js b/website/siteConfig.js index 7376e1c71..e8c0681ef 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -27,16 +27,12 @@ const siteConfig = { // For github.io type URLs, you would set the url and baseUrl like: // url: 'https://facebook.github.io', // baseUrl: '/test-site/', - baseUrl: "/mobx/", // Base URL for your project */ + url: "https://mobx-docs.netlify.com/", // Your website URL + baseUrl: "/", // Base URL for your project */ // Used for publishing and more - // Changed these so I can publish to my forked repo for testing - // projectName: "MobX", - // organizationName: "mobxjs", - // url: "https://mobx.js.org", // Your website URL projectName: "mobx", - organizationName: "cloverich", - url: "https://cloverich.github.io", // Your website URL + organizationName: "mobxjs", // URL for editing docs, usage example: editUrl + 'en/doc1.md'. From bf4fece1caba3dbc604bcf78c66b704b2b9acba9 Mon Sep 17 00:00:00 2001 From: James George Date: Fri, 13 Sep 2019 17:09:38 +0530 Subject: [PATCH 0123/1043] fix typo (#2108) --- src/internal.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal.ts b/src/internal.ts index 0002723fc..8aac1c1e5 100644 --- a/src/internal.ts +++ b/src/internal.ts @@ -1,7 +1,7 @@ /* The only reason for this file to exist is pure horror: Without it rollup can make the bundling fail at any point in time; when it rolls up the files in the wrong order -it will cause undefined errors (for example because super classes or local variables not being hosted). +it will cause undefined errors (for example because super classes or local variables not being hoisted). With this file that will still happen, but at least in this file we can magically reorder the imports with trial and error until the build succeeds again. */ From b6f830f7e087921d3a43f33766fbf7999538ed86 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 13 Sep 2019 09:13:27 -0500 Subject: [PATCH 0124/1043] docs: remove donating, prefer OpenCollective --- README.md | 2 +- docs/README.md | 2 +- docs/donating.md | 4 ---- website/i18n/en.json | 3 --- website/sidebars.json | 3 +-- 5 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 docs/donating.md diff --git a/README.md b/README.md index 647774bd1..46fd6d8e7 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ To use the [flow typings](flow-typed/mobx.js) shipped with MobX: ## Donating Was MobX key in making your project a success? -Join our [open collective](https://opencollective.com/mobx#) or use the [donate button](https://mobxjs.github.io/mobx/donate.html)! +Join our [open collective](https://opencollective.com/mobx#)! ### Backers diff --git a/docs/README.md b/docs/README.md index 2aa4e7402..f6823ddbd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -350,7 +350,7 @@ To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/ ## Donating Was MobX key in making your project a success? -Join our [open collective](https://opencollective.com/mobx#) or use the [donate button](https://mobxjs.github.io/mobx/donate.html)! +Join our [open collective](https://opencollective.com/mobx#)! ### Backers diff --git a/docs/donating.md b/docs/donating.md deleted file mode 100644 index d11453287..000000000 --- a/docs/donating.md +++ /dev/null @@ -1,4 +0,0 @@ -# Donating - -Was MobX key in making your project a success? Share the victory by using the [donate](https://mobxjs.github.io/mobx/donate.html) button! If you leave a name it will be added to the sponsors list. - diff --git a/website/i18n/en.json b/website/i18n/en.json index d4a019625..8e2f752f2 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -44,9 +44,6 @@ "title": "Using `trace` for debugging", "sidebar_label": "Using trace for debugging" }, - "donating": { - "title": "donating" - }, "faq/faq": { "title": "FAQ", "sidebar_label": "Frequently Asked Questions" diff --git a/website/sidebars.json b/website/sidebars.json index d8f6e6211..1e0381c93 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -43,8 +43,7 @@ "best/trace", "best/store", "best/react-performance", - "refguide/spy", - "donating" + "refguide/spy" ] } } From 728e4d3cce88199806fd68030b0c6c2351321a3d Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 13 Sep 2019 09:35:25 -0500 Subject: [PATCH 0125/1043] docs: fix 404 image links --- README.md | 2 +- docs/README.md | 6 +++--- website/siteConfig.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 46fd6d8e7..9733e3de5 100644 --- a/README.md +++ b/README.md @@ -303,7 +303,7 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Further resources and documentation -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) - [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) - [API overview](http://mobxjs.github.io/mobx/refguide/api.html) - [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) diff --git a/docs/README.md b/docs/README.md index f6823ddbd..471e66029 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,8 +31,8 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo Canva Guilded mantro GmbH -CodeFirst -Blokt +CodeFirst +Blokt **🥉Bronze sponsors:**
    Coinbase @@ -299,7 +299,7 @@ And finally kudos for all the people that believed in, tried, validated and even ## Further resources and documentation -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) - [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) - [API overview](http://mobxjs.github.io/mobx/refguide/api.html) - [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) diff --git a/website/siteConfig.js b/website/siteConfig.js index e8c0681ef..a1afc3639 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -55,9 +55,9 @@ const siteConfig = { users, /* path to images for header/footer */ - headerIcon: "/img/mobx.png", - footerIcon: "/img/mobx.png", - favicon: "/img/favicon.png", + headerIcon: "img/mobx.png", + footerIcon: "img/mobx.png", + favicon: "img/favicon.png", /* Colors for website */ colors: { From 31e3d5c5cce09cd4e38f748ec944aa9435c00277 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 13 Sep 2019 09:58:04 -0500 Subject: [PATCH 0126/1043] docs: remove id front matter. - remove id from all front matter - fix mixed up naming of concepts, overview, and introduction section --- docs/README.md | 5 ++--- docs/best/actions.md | 1 - docs/best/decorators.md | 1 - docs/best/devtools.md | 1 - docs/best/pitfalls.md | 1 - docs/best/react-performance.md | 1 - docs/best/react.md | 1 - docs/best/stateless-HMR.md | 1 - docs/best/store.md | 1 - docs/best/syntax.md | 5 ----- docs/best/trace.md | 1 - docs/faq/faq.md | 1 - docs/intro/concepts.md | 7 +++---- docs/intro/overview.md | 5 ++--- docs/refguide/action.md | 1 - docs/refguide/api.md | 1 - docs/refguide/array.md | 1 - docs/refguide/autorun.md | 1 - docs/refguide/boxed.md | 1 - docs/refguide/computed-decorator.md | 1 - docs/refguide/create-transformer.md | 1 - docs/refguide/expr.md | 1 - docs/refguide/extend-observable.md | 1 - docs/refguide/extending.md | 1 - docs/refguide/map.md | 1 - docs/refguide/mobx-utils.md | 1 - docs/refguide/modifiers.md | 1 - docs/refguide/object-api.md | 1 - docs/refguide/object.md | 1 - docs/refguide/observable-decorator.md | 1 - docs/refguide/observable.md | 1 - docs/refguide/observe.md | 1 - docs/refguide/observer-component.md | 3 +-- docs/refguide/reaction.md | 1 - docs/refguide/spy.md | 1 - docs/refguide/tojson.md | 1 - docs/refguide/when.md | 1 - website/i18n/en.json | 17 +++++++---------- website/sidebars.json | 3 ++- 39 files changed, 17 insertions(+), 60 deletions(-) delete mode 100644 docs/best/syntax.md diff --git a/docs/README.md b/docs/README.md index 471e66029..0db70451b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,6 @@ --- -id: README -title: MobX -sidebar_label: Why MobX? +title: Introduction +sidebar_label: Introduction --- logo diff --git a/docs/best/actions.md b/docs/best/actions.md index a434f63cc..4491607a3 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -1,5 +1,4 @@ --- -id: actions sidebar_label: async actions & flows title: Writing asynchronous actions --- diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 0f1fde4d6..3f1bcdd54 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,5 +1,4 @@ --- -id: decorators sidebar_label: How to (not) use decorator syntax title: How to (not) use decorators --- diff --git a/docs/best/devtools.md b/docs/best/devtools.md index 5ae0851e7..c1a765bc7 100644 --- a/docs/best/devtools.md +++ b/docs/best/devtools.md @@ -1,5 +1,4 @@ --- -id: devtools sidebar_label: MobX + React DevTools title: MobX + React DevTools --- diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 83e4d8146..8876eb61a 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -1,5 +1,4 @@ --- -id: pitfalls sidebar_label: Common Pitfalls & Best Practices title: Common pitfalls & best practices --- diff --git a/docs/best/react-performance.md b/docs/best/react-performance.md index 5085d2b97..7f84deaf3 100644 --- a/docs/best/react-performance.md +++ b/docs/best/react-performance.md @@ -1,5 +1,4 @@ --- -id: react-performance sidebar_label: Optimizing React components title: Optimizing rendering React components --- diff --git a/docs/best/react.md b/docs/best/react.md index 59207db51..d2ec727fb 100644 --- a/docs/best/react.md +++ b/docs/best/react.md @@ -1,5 +1,4 @@ --- -id: react title: What does MobX react to? sidebar_label: Understanding what MobX reacts to --- diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index 467b4866c..1c6bc66bd 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -1,5 +1,4 @@ --- -id: stateless-HMR title: Hot Module Reloading with Stateless Components sidebar_label: Hot Module Reloading with Stateless Components --- diff --git a/docs/best/store.md b/docs/best/store.md index 988e4b2b7..085c7f80c 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -1,5 +1,4 @@ --- -id: store sidebar_label: Defining data stores title: Best Practices for building large scale maintainable projects --- diff --git a/docs/best/syntax.md b/docs/best/syntax.md deleted file mode 100644 index 3fb662e51..000000000 --- a/docs/best/syntax.md +++ /dev/null @@ -1,5 +0,0 @@ -
    - -# ES5 / ES6 / ES.next syntax - -Moved [here](http://mobxjs.github.io/mobx/best/decorators.html) diff --git a/docs/best/trace.md b/docs/best/trace.md index 801652949..da78eff6f 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -1,5 +1,4 @@ --- -id: trace sidebar_label: Using trace for debugging title: Using `trace` for debugging --- diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 5fdf1ac2e..306073aa5 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -1,5 +1,4 @@ --- -id: faq sidebar_label: Frequently Asked Questions title: FAQ --- diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 91791301d..0a37db422 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -1,10 +1,9 @@ --- -id: api -title: MobX Api Reference -sidebar_label: API overview +title: Concepts & Principles +sidebar_label: Concepts & Principles --- -
    +
    # Concepts & Principles diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 970fdd46a..8084d64d4 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -1,7 +1,6 @@ --- -id: concepts -title: Concepts & Principles -sidebar_label: Concepts & Principles +title: The gist of MobX +sidebar_label: The gist of MobX ---
    diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 04dae2cd8..1de0314a1 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -1,5 +1,4 @@ --- -id: action title: action sidebar_label: action --- diff --git a/docs/refguide/api.md b/docs/refguide/api.md index f8a6d5d78..9d4ad6d64 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -1,5 +1,4 @@ --- -id: api title: MobX Api Reference sidebar_label: API overview --- diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 3a5282b42..15c9307d9 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -1,5 +1,4 @@ --- -id: array title: Observable Arrays sidebar_label: arrays --- diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 62586170d..ad743663a 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -1,5 +1,4 @@ --- -id: autorun title: autorun sidebar_label: autorun --- diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index c116e0d40..c16e9d099 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -1,5 +1,4 @@ --- -id: boxed title: Boxed Values sidebar_label: boxed values --- diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index 6cbd89eff..902b680f5 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -1,5 +1,4 @@ --- -id: computed-decorator title: (@)computed sidebar_label: (@)computed --- diff --git a/docs/refguide/create-transformer.md b/docs/refguide/create-transformer.md index 4c945d73c..692c0462a 100644 --- a/docs/refguide/create-transformer.md +++ b/docs/refguide/create-transformer.md @@ -1,5 +1,4 @@ --- -id: create-transformer title: createTransformer sidebar_label: mobxUtils.createTransformer --- diff --git a/docs/refguide/expr.md b/docs/refguide/expr.md index f3c65fb62..500432c61 100644 --- a/docs/refguide/expr.md +++ b/docs/refguide/expr.md @@ -1,5 +1,4 @@ --- -id: expr sidebar_label: mobxUtils.expr --- diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 07e392299..24b20989d 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -1,5 +1,4 @@ --- -id: extend-observable sidebar_label: extendObservable --- diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 3e86c9bc5..fa5cb1b93 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,5 +1,4 @@ --- -id: extending sidebar_label: createAtom --- diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 21090edc6..3fc2b4c1f 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -1,5 +1,4 @@ --- -id: map title: Observable Maps sidebar_label: maps --- diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 619246199..51f2b8df5 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,5 +1,4 @@ --- -id: mobx-utils sidebar_label: MobX-utils --- diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index 69119df1f..ef3be42af 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,5 +1,4 @@ --- -id: modifiers title: Decorators sidebar_label: decorators --- diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 6a62c4550..00566d7b4 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,5 +1,4 @@ --- -id: object-api sidebar_label: Object api title: Object api --- diff --git a/docs/refguide/object.md b/docs/refguide/object.md index c741c5c7e..b9c440d60 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -1,5 +1,4 @@ --- -id: object title: Observable Objects sidebar_label: objects --- diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index e89075e9e..10a7d4465 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -1,5 +1,4 @@ --- -id: observable-decorator title: @obsevable sidebar_label: @observable --- diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 6bc5dfda1..b134d2df3 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -1,5 +1,4 @@ --- -id: observable title: observable sidebar_label: observable --- diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index 101fe4de9..b52249788 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -1,5 +1,4 @@ --- -id: observe sidebar_label: intercept & observe title: Intercept & Observe --- diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index 95b1bd03d..826bebb31 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -1,5 +1,4 @@ --- -id: observer-decorator title: (@)observer sidebar_label: (@)observer --- @@ -63,7 +62,7 @@ so we need to access it _in_ the component. Or in other words: values need to be ## ES5 support -In ES5 environments, observer components can be simple declared using `observer(React.createClass({ ...`. See also the [syntax guide](../best/syntax.md) +In ES5 environments, observer components can be simple declared using `observer(React.createClass({ ...`. See also the [syntax guide](../best/decorators.md) ## Stateless function components diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 719207ef4..0aa296a4f 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -1,5 +1,4 @@ --- -id: reaction title: reaction sidebar_label: reaction --- diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 9f11e7af4..4b398cdc2 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -1,5 +1,4 @@ --- -id: spy sidebar_label: spy title: Spy --- diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 732c82016..988e12083 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -1,5 +1,4 @@ --- -id: tojson sidebar_label: toJS title: toJS --- diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 91f0e2eb0..f49321902 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -1,5 +1,4 @@ --- -id: when title: when sidebar_label: when --- diff --git a/website/i18n/en.json b/website/i18n/en.json index 8e2f752f2..adc429b5a 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -37,9 +37,6 @@ "title": "Best Practices for building large scale maintainable projects", "sidebar_label": "Defining data stores" }, - "best/syntax": { - "title": "best/syntax" - }, "best/trace": { "title": "Using `trace` for debugging", "sidebar_label": "Using trace for debugging" @@ -48,20 +45,20 @@ "title": "FAQ", "sidebar_label": "Frequently Asked Questions" }, - "intro/api": { - "title": "MobX Api Reference", - "sidebar_label": "API overview" - }, "intro/concepts": { "title": "Concepts & Principles", "sidebar_label": "Concepts & Principles" }, + "intro/overview": { + "title": "The gist of MobX", + "sidebar_label": "The gist of MobX" + }, "LINKS": { "title": "LINKS" }, "README": { - "title": "MobX", - "sidebar_label": "Why MobX?" + "title": "Introduction", + "sidebar_label": "Introduction" }, "refguide/action": { "title": "action", @@ -135,7 +132,7 @@ "title": "Intercept & Observe", "sidebar_label": "intercept & observe" }, - "refguide/observer-decorator": { + "refguide/observer-component": { "title": "(@)observer", "sidebar_label": "(@)observer" }, diff --git a/website/sidebars.json b/website/sidebars.json index 1e0381c93..56a19911d 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -2,7 +2,8 @@ "docs": { "Introduction": [ "README", - "intro/concepts", + "intro/concepts", + "intro/overview", "refguide/api" ], "Making things observable": [ From de7acb59bece1d71de38bb3cf1c3f268a5dc850a Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 13 Sep 2019 10:04:36 -0500 Subject: [PATCH 0127/1043] docs: fix codfund positioning --- docs/LINKS.md | 2 +- docs/best/actions.md | 2 +- docs/best/decorators.md | 2 +- docs/best/devtools.md | 2 +- docs/best/pitfalls.md | 2 +- docs/best/react-performance.md | 2 +- docs/best/react.md | 2 +- docs/best/stateless-HMR.md | 2 +- docs/best/store.md | 2 +- docs/best/trace.md | 2 +- docs/faq/faq.md | 2 +- docs/intro/overview.md | 2 +- docs/refguide/action.md | 2 +- docs/refguide/api.md | 2 +- docs/refguide/array.md | 2 +- docs/refguide/autorun.md | 2 +- docs/refguide/boxed.md | 2 +- docs/refguide/computed-decorator.md | 2 +- docs/refguide/create-transformer.md | 2 +- docs/refguide/expr.md | 2 +- docs/refguide/extend-observable.md | 2 +- docs/refguide/extending.md | 2 +- docs/refguide/map.md | 2 +- docs/refguide/modifiers.md | 2 +- docs/refguide/object-api.md | 2 +- docs/refguide/object.md | 2 +- docs/refguide/observable-decorator.md | 2 +- docs/refguide/observable.md | 2 +- docs/refguide/observe.md | 2 +- docs/refguide/observer-component.md | 2 +- docs/refguide/reaction.md | 2 +- docs/refguide/spy.md | 2 +- docs/refguide/tojson.md | 2 +- docs/refguide/when.md | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/LINKS.md b/docs/LINKS.md index 89e4677e4..5e3cc5739 100644 --- a/docs/LINKS.md +++ b/docs/LINKS.md @@ -1,4 +1,4 @@ -
    +
    # Resources diff --git a/docs/best/actions.md b/docs/best/actions.md index 4491607a3..c94568b89 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -3,7 +3,7 @@ sidebar_label: async actions & flows title: Writing asynchronous actions --- -
    +
    # Writing asynchronous actions diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 3f1bcdd54..50079a201 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -3,7 +3,7 @@ sidebar_label: How to (not) use decorator syntax title: How to (not) use decorators --- -
    +
    # How to (not) use decorators diff --git a/docs/best/devtools.md b/docs/best/devtools.md index c1a765bc7..0ab04622e 100644 --- a/docs/best/devtools.md +++ b/docs/best/devtools.md @@ -3,7 +3,7 @@ sidebar_label: MobX + React DevTools title: MobX + React DevTools --- -
    +
    # MobX + React DevTools diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 8876eb61a..131700aa4 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -3,7 +3,7 @@ sidebar_label: Common Pitfalls & Best Practices title: Common pitfalls & best practices --- -
    +
    # Common pitfalls & best practices diff --git a/docs/best/react-performance.md b/docs/best/react-performance.md index 7f84deaf3..73d2fcc1c 100644 --- a/docs/best/react-performance.md +++ b/docs/best/react-performance.md @@ -3,7 +3,7 @@ sidebar_label: Optimizing React components title: Optimizing rendering React components --- -
    +
    # Optimizing rendering React components diff --git a/docs/best/react.md b/docs/best/react.md index d2ec727fb..ffc830b23 100644 --- a/docs/best/react.md +++ b/docs/best/react.md @@ -3,7 +3,7 @@ title: What does MobX react to? sidebar_label: Understanding what MobX reacts to --- -
    +
    # What does MobX react to? diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index 1c6bc66bd..088f9d87b 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -3,7 +3,7 @@ title: Hot Module Reloading with Stateless Components sidebar_label: Hot Module Reloading with Stateless Components --- -
    +
    # Hot Module Reloading with Stateless Components diff --git a/docs/best/store.md b/docs/best/store.md index 085c7f80c..014f78d1d 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -3,7 +3,7 @@ sidebar_label: Defining data stores title: Best Practices for building large scale maintainable projects --- -
    +
    # Best Practices for building large scale maintainable projects diff --git a/docs/best/trace.md b/docs/best/trace.md index da78eff6f..25513f1d9 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -3,7 +3,7 @@ sidebar_label: Using trace for debugging title: Using `trace` for debugging --- -
    +
    # Using `trace` for debugging diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 306073aa5..504f70a2c 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -3,7 +3,7 @@ sidebar_label: Frequently Asked Questions title: FAQ --- -
    +
    ## FAQ diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 8084d64d4..ec6059778 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -3,7 +3,7 @@ title: The gist of MobX sidebar_label: The gist of MobX --- -
    +
    # The gist of MobX diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 1de0314a1..c1e977e27 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -3,7 +3,7 @@ title: action sidebar_label: action --- -
    +
    # action diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 9d4ad6d64..76f62a41b 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -3,7 +3,7 @@ title: MobX Api Reference sidebar_label: API overview --- -
    +
    # MobX Api Reference diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 15c9307d9..6c19673b3 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -3,7 +3,7 @@ title: Observable Arrays sidebar_label: arrays --- -
    +
    ## Observable Arrays diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index ad743663a..8be274d88 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -3,7 +3,7 @@ title: autorun sidebar_label: autorun --- -
    +
    # Autorun diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index c16e9d099..09eebe872 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -3,7 +3,7 @@ title: Boxed Values sidebar_label: boxed values --- -
    +
    ## Primitive values and references diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index 902b680f5..baad7aa88 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -3,7 +3,7 @@ title: (@)computed sidebar_label: (@)computed --- -
    +
    # (@)computed diff --git a/docs/refguide/create-transformer.md b/docs/refguide/create-transformer.md index 692c0462a..8a7d21360 100644 --- a/docs/refguide/create-transformer.md +++ b/docs/refguide/create-transformer.md @@ -3,7 +3,7 @@ title: createTransformer sidebar_label: mobxUtils.createTransformer --- -
    +
    # createTransformer diff --git a/docs/refguide/expr.md b/docs/refguide/expr.md index 500432c61..77ba84b00 100644 --- a/docs/refguide/expr.md +++ b/docs/refguide/expr.md @@ -2,7 +2,7 @@ sidebar_label: mobxUtils.expr --- -
    +
    # Expr diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 24b20989d..fc4a955fe 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -2,7 +2,7 @@ sidebar_label: extendObservable --- -
    +
    # extendObservable diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index fa5cb1b93..8b6b91f3b 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -2,7 +2,7 @@ sidebar_label: createAtom --- -
    +
    # Creating observable data structures and reactions diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 3fc2b4c1f..22417a294 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -3,7 +3,7 @@ title: Observable Maps sidebar_label: maps --- -
    +
    # Observable Maps diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index ef3be42af..f20b7036f 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -3,7 +3,7 @@ title: Decorators sidebar_label: decorators --- -
    +
    # Decorators diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 00566d7b4..0bd7482f2 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -3,7 +3,7 @@ sidebar_label: Object api title: Object api --- -
    +
    ## Direct Observable manipulation diff --git a/docs/refguide/object.md b/docs/refguide/object.md index b9c440d60..de0c666f9 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -3,7 +3,7 @@ title: Observable Objects sidebar_label: objects --- -
    +
    ## Observable Objects diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index 10a7d4465..420b0440e 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -3,7 +3,7 @@ title: @obsevable sidebar_label: @observable --- -
    +
    # @observable diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index b134d2df3..41eb3b9b5 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -3,7 +3,7 @@ title: observable sidebar_label: observable --- -
    +
    # observable diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index b52249788..29fb5ff9d 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -3,7 +3,7 @@ sidebar_label: intercept & observe title: Intercept & Observe --- -
    +
    # Intercept & Observe diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index 826bebb31..2fdcb1cf9 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -3,7 +3,7 @@ title: (@)observer sidebar_label: (@)observer --- -
    +
    # @observer diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 0aa296a4f..45ff034d0 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -3,7 +3,7 @@ title: reaction sidebar_label: reaction --- -
    +
    # Reaction diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 4b398cdc2..399f68532 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -3,7 +3,7 @@ sidebar_label: spy title: Spy --- -
    +
    # Spy diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 988e12083..3ef68ca44 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -3,7 +3,7 @@ sidebar_label: toJS title: toJS --- -
    +
    # toJS diff --git a/docs/refguide/when.md b/docs/refguide/when.md index f49321902..1a7456eaa 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -3,7 +3,7 @@ title: when sidebar_label: when --- -
    +
    # when From 68e9a92ea9af6eb8d875adc91177dad5fd0b4738 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 13 Sep 2019 10:17:05 -0500 Subject: [PATCH 0128/1043] docs: disable_title --- docs/README.md | 1 + docs/best/actions.md | 3 ++- docs/best/decorators.md | 3 ++- docs/best/devtools.md | 4 ++-- docs/best/pitfalls.md | 4 ++-- docs/best/react-performance.md | 4 ++-- docs/best/react.md | 4 ++-- docs/best/stateless-HMR.md | 4 ++-- docs/best/store.md | 4 ++-- docs/best/trace.md | 4 ++-- docs/faq/faq.md | 4 ++-- docs/intro/concepts.md | 4 ++-- docs/intro/overview.md | 4 ++-- docs/refguide/action.md | 4 ++-- docs/refguide/api.md | 4 ++-- docs/refguide/array.md | 4 ++-- docs/refguide/autorun.md | 4 ++-- docs/refguide/boxed.md | 4 ++-- docs/refguide/computed-decorator.md | 4 ++-- docs/refguide/create-transformer.md | 4 ++-- docs/refguide/expr.md | 4 ++-- docs/refguide/extend-observable.md | 4 ++-- docs/refguide/extending.md | 4 ++-- docs/refguide/map.md | 4 ++-- docs/refguide/mobx-utils.md | 1 + docs/refguide/modifiers.md | 4 ++-- docs/refguide/object-api.md | 4 ++-- docs/refguide/object.md | 4 ++-- docs/refguide/observable-decorator.md | 4 ++-- docs/refguide/observable.md | 4 ++-- docs/refguide/observe.md | 4 ++-- docs/refguide/observer-component.md | 4 ++-- docs/refguide/reaction.md | 4 ++-- docs/refguide/spy.md | 4 ++-- docs/refguide/tojson.md | 4 ++-- docs/refguide/when.md | 4 ++-- 36 files changed, 70 insertions(+), 66 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0db70451b..466d561ea 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,7 @@ --- title: Introduction sidebar_label: Introduction +hide_title: true --- logo diff --git a/docs/best/actions.md b/docs/best/actions.md index c94568b89..8645b9cec 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -1,11 +1,12 @@ --- sidebar_label: async actions & flows title: Writing asynchronous actions +hide_title: true --- -
    # Writing asynchronous actions +
    The `action` wrapper / decorator only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! This means that if you have a `setTimeout`, promise`.then` or `async` construction, and in that callback some more state is changed, those callbacks should be wrapped in `action` as well! There are several ways to create asynchronous actions. No approach is strictly better than the other, but this section just list different approaches you can take to writing asynchronous code. diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 50079a201..28188ee7d 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,11 +1,12 @@ --- sidebar_label: How to (not) use decorator syntax title: How to (not) use decorators +hide_title: true --- -
    # How to (not) use decorators +
    Using ES.next decorators in MobX is optional. This section explains how to use them, or how to avoid them. diff --git a/docs/best/devtools.md b/docs/best/devtools.md index 0ab04622e..473daa59c 100644 --- a/docs/best/devtools.md +++ b/docs/best/devtools.md @@ -1,11 +1,11 @@ --- sidebar_label: MobX + React DevTools title: MobX + React DevTools +hide_title: true --- -
    - # MobX + React DevTools +
    egghead.io lesson 2: devtools diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 131700aa4..3343c49d6 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -1,11 +1,11 @@ --- sidebar_label: Common Pitfalls & Best Practices title: Common pitfalls & best practices +hide_title: true --- -
    - # Common pitfalls & best practices +
    Stuck with MobX? This section contains a list of common issues people new to MobX might run into. diff --git a/docs/best/react-performance.md b/docs/best/react-performance.md index 73d2fcc1c..7312534d2 100644 --- a/docs/best/react-performance.md +++ b/docs/best/react-performance.md @@ -1,11 +1,11 @@ --- sidebar_label: Optimizing React components title: Optimizing rendering React components +hide_title: true --- -
    - # Optimizing rendering React components +
    MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). But here are some tips to get most out of React and MobX. Note that most tips apply to React in general and are not specific for MobX. diff --git a/docs/best/react.md b/docs/best/react.md index ffc830b23..bc61dd724 100644 --- a/docs/best/react.md +++ b/docs/best/react.md @@ -1,11 +1,11 @@ --- title: What does MobX react to? sidebar_label: Understanding what MobX reacts to +hide_title: true --- -
    - # What does MobX react to? +
    MobX usually reacts to exactly the things you expect it to. Which means that in 90% of your use cases mobx "just works". diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index 088f9d87b..2d4560c1f 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -1,11 +1,11 @@ --- title: Hot Module Reloading with Stateless Components sidebar_label: Hot Module Reloading with Stateless Components +hide_title: true --- -
    - # Hot Module Reloading with Stateless Components +
    One thing that can be a challenge when getting started with MobX (and React in general) is understanding why Hot Module Reloading (HMR) sometimes breaks. When you initially get it working, it seems like magic (and it kind of is), however there's at least one rough edge with regard to HMR and React: stateless components. Since stateless components don't explicitly identify themselves as React components, HMR doesn't quite know what to do with them, and so you'll often see warnings in your console like this: diff --git a/docs/best/store.md b/docs/best/store.md index 014f78d1d..17254c342 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -1,11 +1,11 @@ --- sidebar_label: Defining data stores title: Best Practices for building large scale maintainable projects +hide_title: true --- -
    - # Best Practices for building large scale maintainable projects +
    This section contains some best practices we discovered at Mendix while working with MobX. This section is opinionated and you are in no way forced to apply these practices. diff --git a/docs/best/trace.md b/docs/best/trace.md index 25513f1d9..ba859baa7 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -1,11 +1,11 @@ --- sidebar_label: Using trace for debugging title: Using `trace` for debugging +hide_title: true --- -
    - # Using `trace` for debugging +
    Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 504f70a2c..d1f2d28c2 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -1,11 +1,11 @@ --- sidebar_label: Frequently Asked Questions title: FAQ +hide_title: true --- -
    - ## FAQ +
    ##### Which browsers are supported? diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 0a37db422..7b7861a07 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -1,11 +1,11 @@ --- title: Concepts & Principles sidebar_label: Concepts & Principles +hide_title: true --- -
    - # Concepts & Principles +
    ## Concepts diff --git a/docs/intro/overview.md b/docs/intro/overview.md index ec6059778..6805ef3ad 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -1,11 +1,11 @@ --- title: The gist of MobX sidebar_label: The gist of MobX +hide_title: true --- -
    - # The gist of MobX +
    egghead.io lesson 1: observable & observer diff --git a/docs/refguide/action.md b/docs/refguide/action.md index c1e977e27..fb08c450f 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -1,11 +1,11 @@ --- title: action sidebar_label: action +hide_title: true --- -
    - # action +
    egghead.io lesson 5: actions diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 76f62a41b..040b5f5ad 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -1,11 +1,11 @@ --- title: MobX Api Reference sidebar_label: API overview +hide_title: true --- -
    - # MobX Api Reference +
    **Applies to MobX 4 and higher** diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 6c19673b3..4ed3f6622 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -1,11 +1,11 @@ --- title: Observable Arrays sidebar_label: arrays +hide_title: true --- -
    - ## Observable Arrays +
    Similar to objects, arrays can be made observable using `observable.array(values?)` or by passing an array to `observable`. This works recursively as well, so all (future) values of the array will also be observable. diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 8be274d88..09f32c331 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -1,11 +1,11 @@ --- title: autorun sidebar_label: autorun +hide_title: true --- -
    - # Autorun +
    egghead.io lesson 9: custom reactions diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index 09eebe872..ce4de4b79 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -1,11 +1,11 @@ --- title: Boxed Values sidebar_label: boxed values +hide_title: true --- -
    - ## Primitive values and references +
    All primitive values in JavaScript are immutable and hence per definition not observable. Usually that is fine, as MobX usually can just make the _property_ that contains the value observable. diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index baad7aa88..04658709a 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -1,11 +1,11 @@ --- title: (@)computed sidebar_label: (@)computed +hide_title: true --- -
    - # (@)computed +
    egghead.io lesson 3: computed values diff --git a/docs/refguide/create-transformer.md b/docs/refguide/create-transformer.md index 8a7d21360..3aa456f3e 100644 --- a/docs/refguide/create-transformer.md +++ b/docs/refguide/create-transformer.md @@ -1,11 +1,11 @@ --- title: createTransformer sidebar_label: mobxUtils.createTransformer +hide_title: true --- -
    - # createTransformer +
    Provided by the `mobx-utils` package. diff --git a/docs/refguide/expr.md b/docs/refguide/expr.md index 77ba84b00..d354647f1 100644 --- a/docs/refguide/expr.md +++ b/docs/refguide/expr.md @@ -1,10 +1,10 @@ --- sidebar_label: mobxUtils.expr +hide_title: true --- -
    - # Expr +
    Provided by the `mobx-utils` package. diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index fc4a955fe..f4b25049b 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -1,10 +1,10 @@ --- sidebar_label: extendObservable +hide_title: true --- -
    - # extendObservable +
    `extendObservable(target, properties, decorators?, options?)` diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 8b6b91f3b..558288f51 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,10 +1,10 @@ --- sidebar_label: createAtom +hide_title: true --- -
    - # Creating observable data structures and reactions +
    ## Atoms diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 22417a294..c270eb169 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -1,11 +1,11 @@ --- title: Observable Maps sidebar_label: maps +hide_title: true --- -
    - # Observable Maps +
    ## `observable.map(values, options?)` diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 51f2b8df5..49e993759 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,5 +1,6 @@ --- sidebar_label: MobX-utils +hide_title: true --- # MobX-utils diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index f20b7036f..eac31323d 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,11 +1,11 @@ --- title: Decorators sidebar_label: decorators +hide_title: true --- -
    - # Decorators +
    In MobX there is a set of decorators that defines how observable properties will behave. diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 0bd7482f2..0f294efed 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,11 +1,11 @@ --- sidebar_label: Object api title: Object api +hide_title: true --- -
    - ## Direct Observable manipulation +
    There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index de0c666f9..85fdf8bc4 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -1,11 +1,11 @@ --- title: Observable Objects sidebar_label: objects +hide_title: true --- -
    - ## Observable Objects +
    Usage `observable.object(props, decorators?, options?)` diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index 420b0440e..ec7ba1d13 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -1,11 +1,11 @@ --- title: @obsevable sidebar_label: @observable +hide_title: true --- -
    - # @observable +
    egghead.io lesson 1: observable & observer diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 41eb3b9b5..a8223c6f2 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -1,11 +1,11 @@ --- title: observable sidebar_label: observable +hide_title: true --- -
    - # observable +
    egghead.io lesson 1: observable & observer diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index 29fb5ff9d..d5aaf2e92 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -1,11 +1,11 @@ --- sidebar_label: intercept & observe title: Intercept & Observe +hide_title: true --- -
    - # Intercept & Observe +
    `observe` and `intercept` can be used to monitor the changes of a single observable (they ***don't*** track nested observables). `intercept` can be used to detect and modify mutations before they are applied to the observable. diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index 2fdcb1cf9..f848e25f6 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -1,11 +1,11 @@ --- title: (@)observer sidebar_label: (@)observer +hide_title: true --- -
    - # @observer +
    egghead.io lesson 1: observable & observer diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 45ff034d0..e6bcd1951 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -1,11 +1,11 @@ --- title: reaction sidebar_label: reaction +hide_title: true --- -
    - # Reaction +
    Usage: `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 399f68532..613739876 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -1,11 +1,11 @@ --- sidebar_label: spy title: Spy +hide_title: true --- -
    - # Spy +
    Usage: `spy(listener)`. Registers a global spy listener that listens to all events that happen in MobX. diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 3ef68ca44..0c9894a4e 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -1,11 +1,11 @@ --- sidebar_label: toJS title: toJS +hide_title: true --- -
    - # toJS +
    `toJS(value, options?)` diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 1a7456eaa..17add9d46 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -1,11 +1,11 @@ --- title: when sidebar_label: when +hide_title: true --- -
    - # when +
    egghead.io lesson 9: custom reactions From 4bd43886debfe318f63a132869b53c8b92993978 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Tue, 17 Sep 2019 20:24:03 -0500 Subject: [PATCH 0129/1043] docs: add upstream gh-pages changes - f776568f4be303720fdfc3765e06bb6bfcae459b - 053bb1bae39eadc4a4b51167ebc7021e45320bde - 0e0dcd50d3640cfbc1ded22dafef69f9443cf223 - cd28d15cb8fae8e1ca0ede0c1ee08c88a7716d54 --- README.md | 4 ++-- docs/README.md | 4 ++-- docs/best/react.md | 6 +++--- docs/refguide/observe.md | 4 ++-- docs/refguide/observer-component.md | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9733e3de5..6810968a0 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env - Egghead.io course - [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) - [How to (not) use decorators](https://mobx.js.org/best/decorators.html) - Videos: @@ -303,7 +303,7 @@ And finally, kudos to all the people that believed in, tried, validated and even ## Further resources and documentation -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) - [API overview](http://mobxjs.github.io/mobx/refguide/api.html) - [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) diff --git a/docs/README.md b/docs/README.md index 466d561ea..797c5a8be 100644 --- a/docs/README.md +++ b/docs/README.md @@ -63,7 +63,7 @@ _Tip: the main entry point of the MobX 5 package ships with ES5 code for backwar - egghead.io course - [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) - Videos: - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) @@ -299,7 +299,7 @@ And finally kudos for all the people that believed in, tried, validated and even ## Further resources and documentation -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite it's name is in-depth!) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) - [API overview](http://mobxjs.github.io/mobx/refguide/api.html) - [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) diff --git a/docs/best/react.md b/docs/best/react.md index bc61dd724..a4eb6d288 100644 --- a/docs/best/react.md +++ b/docs/best/react.md @@ -42,11 +42,11 @@ In memory that looks as follows. The green boxes indicate _observable_ propertie ![MobX reacts to changing references](../assets/observed-refs.png) -Now what MobX basically does is recording which _arrows_ you use in your function. After that, it will re-run whenever one of this _arrows_ changes; when they start to refer to something else. +Now what MobX basically does is recording which _arrows_ you use in your function. After that, it will re-run whenever one of these _arrows_ changes; when they start to refer to something else. ## Examples -Lets show that with a bunch of examples (based on the `message` variable defined above): +Let's show that with a bunch of examples (based on the `message` variable defined above): #### Correct: dereference inside the tracked function @@ -347,7 +347,7 @@ In general this is quite obvious and rarely causes issues. ## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` -A common mistake made with `observer` is that it doesnt track data that syntactically seems parent of the `observer` component, +A common mistake made with `observer` is that it doesn't track data that syntactically seems parent of the `observer` component, but in practice is actually rendered out by a different component. This often happens when render callbacks of components are passed in first class to another component. Take for example the following contrived example: diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index d5aaf2e92..d790d0928 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -116,8 +116,8 @@ These are the additional fields that are available per type: | Array | splice | index | starting index of the splice. Splices are also fired by `push`, `unshift`, `replace` etc. | √ | | | | | removedCount | amount of items being removed | √ | √ | | | | added | array with items being added | √ | √ | -| | | removed | array with items that where removed | | | -| | | addedCount | amount of items that where added | | | +| | | removed | array with items that were removed | | | +| | | addedCount | amount of items that were added | | | | | update | index | index of the single entry that is being updated | √ | | | | | newValue | the newValue that is / will be assigned | √ | √ | | | | oldValue | the old value that was replaced | | | diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index f848e25f6..239d79c4a 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -117,7 +117,7 @@ To work with local observable state inside function components, the [`useLocalSt egghead.io lesson 8: inject stores with Provider -_Tip: it is recommended to use `React.creatContext` instead_ +_Tip: it is recommended to use `React.createContext` instead_ The `mobx-react` package also provides the `Provider` component that can be used to pass down stores using React's context mechanism. To connect to those stores, pass a list of store names to `inject`, which will make the stores available as props. From c2e46e120eb69dc255c04fe0dc1953d2897a3508 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Tue, 17 Sep 2019 20:49:07 -0500 Subject: [PATCH 0130/1043] docs: add github icon, links --- website/i18n/en.json | 3 ++- website/pages/en/index.js | 1 + website/siteConfig.js | 1 + website/static/css/custom.css | 14 ++++++++++++++ website/static/img/github-brand.svg | 1 + 5 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 website/static/img/github-brand.svg diff --git a/website/i18n/en.json b/website/i18n/en.json index adc429b5a..d2461925d 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -154,7 +154,8 @@ } }, "links": { - "Documentation": "Documentation" + "Documentation": "Documentation", + "Github": "Github" }, "categories": { "Introduction": "Introduction", diff --git a/website/pages/en/index.js b/website/pages/en/index.js index 88ff7eec6..05c48e452 100755 --- a/website/pages/en/index.js +++ b/website/pages/en/index.js @@ -64,6 +64,7 @@ class HomeSplash extends React.Component { + diff --git a/website/siteConfig.js b/website/siteConfig.js index a1afc3639..9187697d7 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -49,6 +49,7 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ { doc: "intro/concepts", label: "Documentation" }, + { href: "https://github.com/mobxjs/mobx", label: "Github" }, ], // If you have users set above, you add it here: diff --git a/website/static/css/custom.css b/website/static/css/custom.css index bfc02a4fb..f3a55a996 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -25,4 +25,18 @@ article p img { } @media only screen and (min-width: 1500px) { +} + +/* Transform Github link. Lifted from Redux's CSS */ +/* https://github.com/reduxjs/redux/blob/master/website/static/css/custom.css#L134 */ + +.navigationSlider .slidingNav ul a[href*="github"] { + font-size: 0; +} + +.navigationSlider .slidingNav ul a[href*="github"]::before { + content : ""; + width : 32px; + height : 32px; + background: url("/img/github-brand.svg"); } \ No newline at end of file diff --git a/website/static/img/github-brand.svg b/website/static/img/github-brand.svg new file mode 100644 index 000000000..d1766675a --- /dev/null +++ b/website/static/img/github-brand.svg @@ -0,0 +1 @@ + \ No newline at end of file From 3f104a4887a55b36eb7efdabf9952327601c7757 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Tue, 17 Sep 2019 20:54:46 -0500 Subject: [PATCH 0131/1043] docs: enable editUrl - docs are not on master, but this is how docusaurus sets it up so I think it is correct --- website/siteConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/siteConfig.js b/website/siteConfig.js index 9187697d7..2283c3421 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -38,7 +38,7 @@ const siteConfig = { // URL for editing docs, usage example: editUrl + 'en/doc1.md'. // If this field is omitted, there will be no "Edit this Doc" button // for each document. - // editUrl: "docs/", + editUrl: 'https://github.com/mobxjs/mobx/edit/master/docs/', From f26e9d1dd19725f0cde3cf78d320877a1cf72fb9 Mon Sep 17 00:00:00 2001 From: jeffkillian Date: Wed, 18 Sep 2019 22:50:40 -0700 Subject: [PATCH 0132/1043] Use correct spelling of "suppress" (#2115) --- src/core/globalstate.ts | 2 +- src/types/observablearray.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 8dbcfcfda..24e71f8e1 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -114,7 +114,7 @@ export class MobXGlobals { disableErrorBoundaries = false /* - * If true, we are already handling an exception in an action. Any errors in reactions should be supressed, as + * If true, we are already handling an exception in an action. Any errors in reactions should be suppressed, as * they are not the cause, see: https://github.com/mobxjs/mobx/issues/1836 */ suppressReactionErrors = false diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 460e82825..53fe48798 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -389,7 +389,7 @@ const arrayExtensions = { // so we deviate from the default and just make it an dervitation if (process.env.NODE_ENV !== "production") { console.warn( - "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" + "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to suppress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" ) } const clone = (this).slice() @@ -401,7 +401,7 @@ const arrayExtensions = { // which goes against all good practices. Let's not change the array in place! if (process.env.NODE_ENV !== "production") { console.warn( - "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to supress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" + "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to suppress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" ) } const clone = (this).slice() From e2216a6280ed8d15c85e1fa7bd92dafe0ef3b440 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Wed, 25 Sep 2019 18:09:25 +0200 Subject: [PATCH 0133/1043] expose startAction and endAction (#2117) * add startActionWithFinisher * update changelog * code review fixes * more code review fixes * clarified usefulness in changelog * code review fixes --- CHANGELOG.md | 2 +- src/core/action.ts | 52 +++++++++++++++++++++++------------------ src/core/globalstate.ts | 10 ++++++++ src/mobx.ts | 5 +++- test/base/action.js | 14 +++++++++++ test/base/api.js | 4 +++- 6 files changed, 61 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd5b98312..f189be160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ * Don't use `global` and `self` keywords unless defined. Fixes [#2070](https://github.com/mobxjs/mobx/issues/2070). * onBecome(Un)Observed didn't trigger when using number as key of observable map. Fixes [#2067](https://github.com/mobxjs/mobx/issues/2067). - +* Exposed `_startAction` and `_endAction` to be able to start and action and finish it without needing a code block. This is low level stuff you shouldn't need that's mostly useful for library creators. # 5.13.0 / 4.13.0 diff --git a/src/core/action.ts b/src/core/action.ts index 94ecf03b2..afd96eaa9 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -30,36 +30,28 @@ export function createAction(actionName: string, fn: Function, ref?: Object): Fu } export function executeAction(actionName: string, fn: Function, scope?: any, args?: IArguments) { - const runInfo = startAction(actionName, fn, scope, args) - let shouldSupressReactionError = true + const runInfo = _startAction(actionName, scope, args) try { - const res = fn.apply(scope, args) - shouldSupressReactionError = false - return res + return fn.apply(scope, args) + } catch (err) { + runInfo.error = err + throw err } finally { - if (shouldSupressReactionError) { - globalState.suppressReactionErrors = shouldSupressReactionError - endAction(runInfo) - globalState.suppressReactionErrors = false - } else { - endAction(runInfo) - } + _endAction(runInfo) } } -interface IActionRunInfo { +export interface IActionRunInfo { prevDerivation: IDerivation | null prevAllowStateChanges: boolean notifySpy: boolean startTime: number + error?: any + parentActionId: number + actionId: number } -function startAction( - actionName: string, - fn: Function, - scope: any, - args?: IArguments -): IActionRunInfo { +export function _startAction(actionName: string, scope: any, args?: IArguments): IActionRunInfo { const notifySpy = isSpyEnabled() && !!actionName let startTime: number = 0 if (notifySpy && process.env.NODE_ENV !== "production") { @@ -77,20 +69,34 @@ function startAction( const prevDerivation = untrackedStart() startBatch() const prevAllowStateChanges = allowStateChangesStart(true) - return { + const runInfo = { prevDerivation, prevAllowStateChanges, notifySpy, - startTime + startTime, + actionId: globalState.nextActionId++, + parentActionId: globalState.currentActionId } + globalState.currentActionId = runInfo.actionId + return runInfo } -function endAction(runInfo: IActionRunInfo) { +export function _endAction(runInfo: IActionRunInfo) { + if (globalState.currentActionId !== runInfo.actionId) { + fail("invalid action stack. did you forget to finish an action?") + } + globalState.currentActionId = runInfo.parentActionId + + if (runInfo.error !== undefined) { + globalState.suppressReactionErrors = true + } allowStateChangesEnd(runInfo.prevAllowStateChanges) endBatch() untrackedEnd(runInfo.prevDerivation) - if (runInfo.notifySpy && process.env.NODE_ENV !== "production") + if (runInfo.notifySpy && process.env.NODE_ENV !== "production") { spyReportEnd({ time: Date.now() - runInfo.startTime }) + } + globalState.suppressReactionErrors = false } export function allowStateChanges(allowStateChanges: boolean, func: () => T): T { diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 24e71f8e1..6d87f37db 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -118,6 +118,16 @@ export class MobXGlobals { * they are not the cause, see: https://github.com/mobxjs/mobx/issues/1836 */ suppressReactionErrors = false + + /* + * Current action id. + */ + currentActionId = 0 + + /* + * Next action id. + */ + nextActionId = 1 } let canMergeGlobalState = true diff --git a/src/mobx.ts b/src/mobx.ts index cc6fe375f..725b98ef2 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -151,7 +151,10 @@ export { isComputingDerivation as _isComputingDerivation, onReactionError, interceptReads as _interceptReads, - IComputedValueOptions + IComputedValueOptions, + IActionRunInfo, + _startAction, + _endAction } from "./internal" // Devtools support diff --git a/test/base/action.js b/test/base/action.js index de4330e91..8259a4b5f 100644 --- a/test/base/action.js +++ b/test/base/action.js @@ -547,3 +547,17 @@ test("error logging, #1836 - 2", () => { expect(messages).toMatchSnapshot() }) + +test("out of order startAction / endAction", () => { + const a1 = mobx._startAction("a1") + const a2 = mobx._startAction("a2") + + expect(() => mobx._endAction(a1)).toThrow("invalid action stack") + + mobx._endAction(a2) + + // double finishing + expect(() => mobx._endAction(a2)).toThrow("invalid action stack") + + mobx._endAction(a1) +}) diff --git a/test/base/api.js b/test/base/api.js index e95e48b94..6dcc24ba0 100644 --- a/test/base/api.js +++ b/test/base/api.js @@ -64,7 +64,9 @@ test("correct api should be exposed", function() { "untracked", "values", "entries", - "when" + "when", + "_startAction", + "_endAction" ].sort() ) }) From 6fc1361e9797e0109721ae40fb383bb66c2541a0 Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Sat, 28 Sep 2019 14:41:00 +0200 Subject: [PATCH 0134/1043] Published version 5.13.1 --- package.json | 2 +- yarn.lock | 17480 ++++++++++++++++++++++++------------------------- 2 files changed, 8741 insertions(+), 8741 deletions(-) diff --git a/package.json b/package.json index 14e5735d9..fbfcdc232 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.13.0", + "version": "5.13.1", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", diff --git a/yarn.lock b/yarn.lock index 3a126c8e8..f22ba6a70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,8740 +1,8740 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.1.0", "@babel/core@^7.3.4": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" - integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helpers" "^7.4.3" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== - dependencies: - "@babel/types" "^7.4.0" - jsesc "^2.5.1" - lodash "^4.17.11" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-call-delegate@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" - integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" - -"@babel/helper-create-class-features-plugin@^7.4.0": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef" - integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" - -"@babel/helper-define-map@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" - integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.0" - lodash "^4.17.11" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-hoist-variables@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" - integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== - dependencies: - "@babel/types" "^7.4.0" - -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" - integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.2.2" - "@babel/types" "^7.2.2" - lodash "^4.17.11" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" - integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== - dependencies: - lodash "^4.17.11" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" - integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" - integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== - dependencies: - "@babel/types" "^7.4.0" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" - integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== - dependencies: - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - -"@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" - integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== - -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-class-properties@^7.3.4": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" - integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-decorators@^7.3.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" - integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.2.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" - integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" - integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.5.4" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-decorators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" - integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" - integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" - integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.11" - -"@babel/plugin-transform-classes@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz#adc7a1137ab4287a555d429cc56ecde8f40c062c" - integrity sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz#1a95f5ca2bf2f91ef0648d5de38a8d472da4350f" - integrity sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" - integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.3" - regexpu-core "^4.5.4" - -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz#c36ff40d893f2b8352202a2558824f70cd75e9fe" - integrity sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz#130c27ec7fb4f0cba30e958989449e5ec8d22bbd" - integrity sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A== - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-member-expression-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" - integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-commonjs@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" - integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== - dependencies: - "@babel/helper-module-transforms" "^7.4.3" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-systemjs@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" - integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== - dependencies: - "@babel/helper-hoist-variables" "^7.4.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" - integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== - dependencies: - regexp-tree "^0.1.0" - -"@babel/plugin-transform-new-target@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" - integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-parameters@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz#e5ff62929fdf4cf93e58badb5e2430303003800d" - integrity sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA== - dependencies: - "@babel/helper-call-delegate" "^7.4.0" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-property-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" - integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-regenerator@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz#2a697af96887e2bbf5d303ab0221d139de5e739c" - integrity sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A== - dependencies: - regenerator-transform "^0.13.4" - -"@babel/plugin-transform-reserved-words@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" - integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-runtime@^7.3.4": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz#4d6691690ecdc9f5cb8c3ab170a1576c1f556371" - integrity sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" - integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" - integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz#3868703fc0e8f443dda65654b298df576f7b863b" - integrity sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.3" - regexpu-core "^4.5.4" - -"@babel/preset-env@^7.3.4": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" - integrity sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.3" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.0" - "@babel/plugin-transform-classes" "^7.4.3" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.3" - "@babel/plugin-transform-dotall-regex" "^7.4.3" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.3" - "@babel/plugin-transform-function-name" "^7.4.3" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.3" - "@babel/plugin-transform-modules-systemjs" "^7.4.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" - "@babel/plugin-transform-new-target" "^7.4.0" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.4.3" - "@babel/plugin-transform-property-literals" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.4.3" - "@babel/plugin-transform-reserved-words" "^7.2.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.3" - "@babel/types" "^7.4.0" - browserslist "^4.5.2" - core-js-compat "^3.0.0" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.5.0" - -"@babel/runtime@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" - integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/runtime@^7.3.4": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc" - integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" - integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" - integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/types" "^7.4.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.11" - -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" - integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.11" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@condenast/perf-timeline-cli@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@condenast/perf-timeline-cli/-/perf-timeline-cli-0.1.3.tgz#bd9de5760d6cf5eca153a54400ec747be8b254c9" - integrity sha512-NedubRAGM2qDpMPjNVXYJHHuVckNpclWuj7/CUARwNoxrqqfrGik9UZo6NZGl/7mTasFNjnW3fy0fomYER/qsg== - dependencies: - cli-logger "^0.5.40" - puppeteer "^1.2.0" - yargs "^11.1.0" - -"@jest/console@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" - integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== - dependencies: - "@jest/source-map" "^24.3.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" - integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.7.0" - jest-config "^24.7.1" - jest-haste-map "^24.7.1" - jest-message-util "^24.7.1" - jest-regex-util "^24.3.0" - jest-resolve-dependencies "^24.7.1" - jest-runner "^24.7.1" - jest-runtime "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - jest-watcher "^24.7.1" - micromatch "^3.1.10" - p-each-series "^1.0.0" - pirates "^4.0.1" - realpath-native "^1.1.0" - rimraf "^2.5.4" - strip-ansi "^5.0.0" - -"@jest/environment@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" - integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== - dependencies: - "@jest/fake-timers" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - -"@jest/fake-timers@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" - integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== - dependencies: - "@jest/types" "^24.7.0" - jest-message-util "^24.7.1" - jest-mock "^24.7.0" - -"@jest/reporters@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" - integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== - dependencies: - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-api "^2.1.1" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-source-maps "^3.0.1" - jest-haste-map "^24.7.1" - jest-resolve "^24.7.1" - jest-runtime "^24.7.1" - jest-util "^24.7.1" - jest-worker "^24.6.0" - node-notifier "^5.2.1" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" - integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" - integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" - integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== - dependencies: - "@jest/test-result" "^24.7.1" - jest-haste-map "^24.7.1" - jest-runner "^24.7.1" - jest-runtime "^24.7.1" - -"@jest/transform@^24.7.1": - version "24.7.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" - integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.7.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.7.1" - jest-regex-util "^24.3.0" - jest-util "^24.7.1" - micromatch "^3.1.10" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.7.0": - version "24.7.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" - integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/yargs" "^12.0.9" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== - -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== - dependencies: - any-observable "^0.3.0" - -"@types/babel__core@^7.1.0": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" - integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" - integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" - integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/glob@^7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/istanbul-lib-coverage@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz#1eb8c033e98cf4e1a4cedcaf8bcafe8cb7591e85" - integrity sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg== - -"@types/jest-diff@*": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" - integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== - -"@types/jest@^24.0.11": - version "24.0.11" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340" - integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ== - dependencies: - "@types/jest-diff" "*" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*", "@types/node@^11.11.3", "@types/node@^11.13.5": - version "11.13.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" - integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== - -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== - dependencies: - "@types/node" "*" - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": - version "12.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" - integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== - -"@typescript-eslint/eslint-plugin@^1.4.2": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz#a5ff3128c692393fb16efa403ec7c8a5593dab0f" - integrity sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ== - dependencies: - "@typescript-eslint/parser" "1.6.0" - "@typescript-eslint/typescript-estree" "1.6.0" - requireindex "^1.2.0" - tsutils "^3.7.0" - -"@typescript-eslint/parser@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.6.0.tgz#f01189c8b90848e3b8e45a6cdad27870529d1804" - integrity sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw== - dependencies: - "@typescript-eslint/typescript-estree" "1.6.0" - eslint-scope "^4.0.0" - eslint-visitor-keys "^1.0.0" - -"@typescript-eslint/typescript-estree@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz#6cf43a07fee08b8eb52e4513b428c8cdc9751ef0" - integrity sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA== - dependencies: - lodash.unescape "4.0.1" - semver "5.5.0" - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" - integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - -acorn-globals@^4.1.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.1.tgz#deb149c59276657ebd40ba2ba849ddd529763ccf" - integrity sha512-gJSiKY8dBIjV/0jagZIFBdVMtfQyA5QHCvAT48H2q8REQoW8Fs5AOjqBql1LgSXgrMWdevcE+8cdZ33NtVbIBA== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-jsx@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" - integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== - -acorn-walk@^6.0.1, acorn-walk@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" - integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== - -acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== - -agent-base@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== - -ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^2.0.0, ansi-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== - dependencies: - default-require-extensions "^2.0.0" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-union@^1.0.1, array-union@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - -async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== - dependencies: - lodash "^4.17.11" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -babel-jest@^24.5.0, babel-jest@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" - integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== - dependencies: - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.6.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-plugin-istanbul@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.2.tgz#d8c2e2e83f72695d6bfdcd297719c66161d5f0f9" - integrity sha512-U3ZVajC+Z69Gim7ZzmD4Wcsq76i/1hqDamBfowc1tWzWjybRy70iWfngP2ME+1CrgcgZ/+muIbPY/Yi0dxdIkQ== - dependencies: - find-up "^3.0.0" - istanbul-lib-instrument "^3.2.0" - test-exclude "^5.2.2" - -babel-plugin-jest-hoist@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" - integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-preset-jest@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" - integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.6.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bfj@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" - integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== - dependencies: - bluebird "^3.5.1" - check-types "^7.3.0" - hoopy "^0.1.2" - tryer "^1.0.0" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -bigrig@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bigrig/-/bigrig-1.3.0.tgz#1f2a4822082c514659d06d7873ff4386b0d179e5" - integrity sha1-HypIIggsUUZZ0G14c/9DhrDReeU= - dependencies: - cli-color "^1.1.0" - mkdirp "^0.5.1" - yargs "^3.29.0" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bl@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -bluebird@^3.5.1, bluebird@^3.5.3: - version "3.5.4" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" - integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -boxen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-2.1.0.tgz#8d576156e33fc26a34d6be8635fd16b1d745f0b2" - integrity sha512-luq3RQOt2U5sUX+fiu+qnT+wWnHDcATLpEe63jvge6GUZO99AKbVRfp97d2jgLvq1iQa0ORzaAm4lGVG52ZSlw== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.0.0" - chalk "^2.4.1" - cli-boxes "^1.0.0" - string-width "^3.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -brotli-size@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-0.0.3.tgz#1d3855b38f182591a6f69da1516131676e5f62f2" - integrity sha512-bBIdd8uUGxKGldAVykxOqPegl+HlIm4FpXJamwWw5x77WCE8jO7AhXFE1YXOhOB28gS+2pTQete0FqRE6U5hQQ== - dependencies: - duplexer "^0.1.1" - iltorb "^2.0.5" - -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.5.2, browserslist@^4.5.4: - version "4.5.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.5.tgz#fe1a352330d2490d5735574c149a85bc18ef9b82" - integrity sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA== - dependencies: - caniuse-lite "^1.0.30000960" - electron-to-chromium "^1.3.124" - node-releases "^1.1.14" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - -buffer-from@1.x, buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" - integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cacache@^11.0.2, cacache@^11.2.0: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== - dependencies: - bluebird "^3.5.3" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.3" - graceful-fs "^4.1.15" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0, camelcase@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000960: - version "1.0.30000962" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000962.tgz#6c10c3ab304b89bea905e66adf98c0905088ee44" - integrity sha512-WXYsW38HK+6eaj5IZR16Rn91TGhU3OhbwjKZvJ4HN/XBIABLKfbij9Mnd3pM0VEwZSlltWjoWg3I8FQ0DGgNOA== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-types@^7.3.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" - integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== - -chokidar@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.0.1, chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== - -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== - dependencies: - tslib "^1.9.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-job-number@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ci-job-number/-/ci-job-number-0.3.0.tgz#34bdd114b0dece1960287bd40a57051041a2a800" - integrity sha1-NL3RFLDezhlgKHvUClcFEEGiqAA= - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/circular/-/circular-1.0.5.tgz#7da77af98bbde9ce4b5b358cd556b5dded2d3149" - integrity sha1-fad6+Yu96c5LWzWM1Va13e0tMUk= - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-color@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" - integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== - dependencies: - ansi-regex "^2.1.1" - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - memoizee "^0.4.14" - timers-ext "^0.1.5" - -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-logger@^0.5.40: - version "0.5.40" - resolved "https://registry.yarnpkg.com/cli-logger/-/cli-logger-0.5.40.tgz#097f0e11b072c7c698a26c47f588a29c20b48b0b" - integrity sha1-CX8OEbByx8aYomxH9YiinCC0iws= - dependencies: - circular "^1.0.5" - cli-util "~1.1.27" - -cli-regexp@~0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-regexp/-/cli-regexp-0.1.2.tgz#6bcd93b09fb2ed1025d30a1155d5997954a53512" - integrity sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI= - -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= - dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" - -cli-util@~1.1.27: - version "1.1.27" - resolved "https://registry.yarnpkg.com/cli-util/-/cli-util-1.1.27.tgz#42d69e36a040a321fc9cf851c1513cadc5093054" - integrity sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ= - dependencies: - cli-regexp "~0.1.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" - integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colors@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.14.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" - integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-versions@^3.2.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" - integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compression-webpack-plugin@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc" - integrity sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q== - dependencies: - cacache "^11.2.0" - find-cache-dir "^2.0.0" - neo-async "^2.5.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - webpack-sources "^1.0.1" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@1.6.2, concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.1.0, convert-source-map@^1.4.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" - integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== - dependencies: - browserslist "^4.5.4" - core-js "3.0.1" - core-js-pure "3.0.1" - semver "^6.0.0" - -core-js-pure@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" - integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== - -core-js@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" - integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7, cosmiconfig@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -coveralls@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.3.tgz#83b1c64aea1c6afa69beaf50b55ac1bc4d13e2b8" - integrity sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg== - dependencies: - growl "~> 1.10.0" - js-yaml "^3.11.0" - lcov-parse "^0.0.10" - log-driver "^1.2.7" - minimist "^1.2.0" - request "^2.86.0" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-loader@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" - integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== - dependencies: - camelcase "^5.2.0" - icss-utils "^4.1.0" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.14" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^2.0.6" - postcss-modules-scope "^2.1.0" - postcss-modules-values "^2.0.0" - postcss-value-parser "^3.3.0" - schema-utils "^1.0.0" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" - integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== - dependencies: - boolbase "^1.0.0" - css-what "^2.1.2" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.28: - version "1.0.0-alpha.28" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" - integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-tree@1.0.0-alpha.29: - version "1.0.0-alpha.29" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" - integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-unit-converter@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" - integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= - -css-url-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" - integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= - -css-what@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.0: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" - integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== - dependencies: - css-tree "1.0.0-alpha.29" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.6" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" - integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== - -cssstyle@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" - integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== - dependencies: - cssom "0.3.x" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= - dependencies: - es5-ext "^0.10.9" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -date-fns@^1.27.2: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-assign@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" - integrity sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI= - dependencies: - is-obj "^1.0.0" - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -default-require-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= - dependencies: - strip-bom "^3.0.0" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-libc@^1.0.2, detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -diff-sequences@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" - integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== - dependencies: - path-type "^3.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== - -electron-to-chromium@^1.3.124: - version "1.3.125" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.125.tgz#dbde0e95e64ebe322db0eca764d951f885a5aff2" - integrity sha512-XxowpqQxJ4nDwUXHtVtmEhRqBpm2OnjBomZmZtHD0d2Eo0244+Ojezhk3sD/MBSSe2nxCdGQFRXHIsf/LUTL9A== - -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - -elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" - integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== - dependencies: - es-to-primitive "^1.2.0" - function-bind "^1.1.1" - has "^1.0.3" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-keys "^1.0.12" - -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.50" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" - integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "^1.0.0" - -es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.0.3: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@^1.9.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" - integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^4.0.0, eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - -eslint@^5.15.2: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estimo@^0.1.9: - version "0.1.9" - resolved "https://registry.yarnpkg.com/estimo/-/estimo-0.1.9.tgz#76875dc8e3f8c7b4d0e11ad0bccae1f6e3b5368a" - integrity sha512-8154FqD1aaJuj95BKazdywVmPa8IIKOVDE7s9MFZI6s4QDbTZv+ITI39BMNwdzg8zcQ0/utAvzfzSJI6/4HcrA== - dependencies: - "@condenast/perf-timeline-cli" "^0.1.3" - bigrig "^1.3.0" - cross-spawn "^6.0.5" - nanoid "^2.0.1" - yargs "^13.2.2" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - -estree-walker@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" - integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -event-emitter@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" - integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expect@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" - integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== - dependencies: - "@jest/types" "^24.7.0" - ansi-styles "^3.2.0" - jest-get-type "^24.3.0" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-regex-util "^24.3.0" - -express@^4.16.3: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.3" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" - range-parser "~1.2.0" - safe-buffer "5.1.2" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= - dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-glob@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= - dependencies: - pend "~1.2.0" - -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - -file-loader@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" - integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== - dependencies: - loader-utils "^1.0.2" - schema-utils "^1.0.0" - -fileset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= - dependencies: - glob "^7.0.3" - minimatch "^3.0.3" - -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-parent-dir@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" - integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" - integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q== - dependencies: - locate-path "^5.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flatted@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== - -flow-bin@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.59.0.tgz#8c151ee7f09f1deed9bf0b9d1f2e8ab9d470f1bb" - integrity sha512-yJDRffvby5mCTkbwOdXwiGDjeea8Z+BPVuP53/tHqHIZC+KtQD790zopVf7mHk65v+wRn+TZ7tkRSNA9oDmyLg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -fn-name@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" - integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= - -for-each@~0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== - dependencies: - minipass "^2.2.1" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" - integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -g-status@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" - integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== - dependencies: - arrify "^1.0.1" - matcher "^1.0.0" - simple-git "^1.85.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" - integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== - -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0, globals@^11.7.0: - version "11.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" - integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" - integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^1.0.2" - dir-glob "^2.2.2" - fast-glob "^2.2.6" - glob "^7.1.3" - ignore "^4.0.3" - pify "^4.0.1" - slash "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - -"growl@~> 1.10.0": - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -gzip-size@^5.0.0, gzip-size@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== - dependencies: - duplexer "^0.1.1" - pify "^4.0.1" - -handlebars@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.1, has@^1.0.3, has@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoopy@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - -hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== - dependencies: - agent-base "^4.1.0" - debug "^3.1.0" - -husky@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" - integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== - dependencies: - cosmiconfig "^5.0.7" - execa "^1.0.0" - find-up "^3.0.0" - get-stdin "^6.0.0" - is-ci "^2.0.0" - pkg-dir "^3.0.0" - please-upgrade-node "^3.1.1" - read-pkg "^4.0.1" - run-node "^1.0.0" - slash "^2.0.0" - -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - -icss-utils@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.0.tgz#339dbbffb9f8729a243b701e1c29d4cc58c52f0e" - integrity sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ== - dependencies: - postcss "^7.0.14" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - -ignore@^4.0.3, ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -iltorb@^2.0.5: - version "2.4.2" - resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-2.4.2.tgz#51e341045ad5181bf64832a569ec576e7df0faf2" - integrity sha512-RvsVTHt1Pw1/Zcepfd+3jinu38rO8IBFVONcroT9Dwrb5RSNE/CEX7uy1yZKN/kYCQB7FWx/oQgXhN9qAwZY9Q== - dependencies: - detect-libc "^1.0.3" - nan "^2.12.1" - npmlog "^4.1.2" - prebuild-install "^5.2.4" - which-pm-runs "^1.0.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" - integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^6.2.2: - version "6.3.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" - integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.11" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ipaddr.js@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0, is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== - dependencies: - symbol-observable "^1.1.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" - integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1, is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= - dependencies: - has "^1.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== - dependencies: - has-symbols "^1.0.0" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-api@^2.1.1: - version "2.1.5" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.5.tgz#697b95ec69856c278aacafc0f86ee7392338d5b5" - integrity sha512-meYk1BwDp59Pfse1TvPrkKYgVqAufbdBLEVoqvu/hLLKSaQ054ZTksbNepyc223tMnWdm6AdK2URIJJRqdP87g== - dependencies: - async "^2.6.1" - compare-versions "^3.2.1" - fileset "^2.0.3" - istanbul-lib-coverage "^2.0.4" - istanbul-lib-hook "^2.0.6" - istanbul-lib-instrument "^3.2.0" - istanbul-lib-report "^2.0.7" - istanbul-lib-source-maps "^3.0.5" - istanbul-reports "^2.2.3" - js-yaml "^3.13.0" - make-dir "^2.1.0" - minimatch "^3.0.4" - once "^1.4.0" - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" - integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== - -istanbul-lib-hook@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" - integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== - dependencies: - append-transform "^1.0.0" - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" - integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== - dependencies: - "@babel/generator" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.4" - semver "^6.0.0" - -istanbul-lib-report@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" - integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== - dependencies: - istanbul-lib-coverage "^2.0.4" - make-dir "^2.1.0" - supports-color "^6.0.0" - -istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" - integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.4" - make-dir "^2.1.0" - rimraf "^2.6.2" - source-map "^0.6.1" - -istanbul-reports@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.3.tgz#14e0d00ecbfa9387757999cf36599b88e9f2176e" - integrity sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw== - dependencies: - handlebars "^4.1.0" - -iterall@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" - integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== - -jest-changed-files@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" - integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== - dependencies: - "@jest/types" "^24.7.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" - integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== - dependencies: - "@jest/core" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^12.0.2" - -jest-config@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" - integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.7.1" - "@jest/types" "^24.7.0" - babel-jest "^24.7.1" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.7.1" - jest-environment-node "^24.7.1" - jest-get-type "^24.3.0" - jest-jasmine2 "^24.7.1" - jest-regex-util "^24.3.0" - jest-resolve "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - micromatch "^3.1.10" - pretty-format "^24.7.0" - realpath-native "^1.1.0" - -jest-diff@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" - integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.3.0" - jest-get-type "^24.3.0" - pretty-format "^24.7.0" - -jest-docblock@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" - integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" - integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== - dependencies: - "@jest/types" "^24.7.0" - chalk "^2.0.1" - jest-get-type "^24.3.0" - jest-util "^24.7.1" - pretty-format "^24.7.0" - -jest-environment-jsdom@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" - integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== - dependencies: - "@jest/environment" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - jest-util "^24.7.1" - jsdom "^11.5.1" - -jest-environment-node@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" - integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== - dependencies: - "@jest/environment" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/types" "^24.7.0" - jest-mock "^24.7.0" - jest-util "^24.7.1" - -jest-get-type@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" - integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== - -jest-haste-map@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" - integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== - dependencies: - "@jest/types" "^24.7.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.4.0" - jest-util "^24.7.1" - jest-worker "^24.6.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" - integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.7.1" - is-generator-fn "^2.0.0" - jest-each "^24.7.1" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-runtime "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - pretty-format "^24.7.0" - throat "^4.0.0" - -jest-leak-detector@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" - integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== - dependencies: - pretty-format "^24.7.0" - -jest-matcher-utils@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" - integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== - dependencies: - chalk "^2.0.1" - jest-diff "^24.7.0" - jest-get-type "^24.3.0" - pretty-format "^24.7.0" - -jest-message-util@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" - integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" - integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== - dependencies: - "@jest/types" "^24.7.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^24.3.0: - version "24.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" - integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== - -jest-resolve-dependencies@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" - integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== - dependencies: - "@jest/types" "^24.7.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.7.1" - -jest-resolve@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" - integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== - dependencies: - "@jest/types" "^24.7.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" - integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.7.1" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.7.1" - jest-docblock "^24.3.0" - jest-haste-map "^24.7.1" - jest-jasmine2 "^24.7.1" - jest-leak-detector "^24.7.0" - jest-message-util "^24.7.1" - jest-resolve "^24.7.1" - jest-runtime "^24.7.1" - jest-util "^24.7.1" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" - integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.7.1" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/yargs" "^12.0.2" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.7.1" - jest-haste-map "^24.7.1" - jest-message-util "^24.7.1" - jest-mock "^24.7.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.7.1" - jest-snapshot "^24.7.1" - jest-util "^24.7.1" - jest-validate "^24.7.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^12.0.2" - -jest-serializer@^24.4.0: - version "24.4.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" - integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== - -jest-snapshot@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" - integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.7.0" - chalk "^2.0.1" - expect "^24.7.1" - jest-diff "^24.7.0" - jest-matcher-utils "^24.7.0" - jest-message-util "^24.7.1" - jest-resolve "^24.7.1" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.7.0" - semver "^5.5.0" - -jest-util@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" - integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/fake-timers" "^24.7.1" - "@jest/source-map" "^24.3.0" - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" - integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== - dependencies: - "@jest/types" "^24.7.0" - camelcase "^5.0.0" - chalk "^2.0.1" - jest-get-type "^24.3.0" - leven "^2.1.0" - pretty-format "^24.7.0" - -jest-watcher@^24.7.1: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" - integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== - dependencies: - "@jest/test-result" "^24.7.1" - "@jest/types" "^24.7.0" - "@types/yargs" "^12.0.9" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.7.1" - string-length "^2.0.0" - -jest-worker@^24.0.0, jest-worker@^24.6.0: - version "24.6.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" - integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== - dependencies: - merge-stream "^1.0.1" - supports-color "^6.1.0" - -jest@^24.5.0: - version "24.7.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" - integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== - dependencies: - import-local "^2.0.0" - jest-cli "^24.7.1" - -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@2.x, json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== - dependencies: - minimist "^1.2.0" - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kleur@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -lcov-parse@^0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lint-staged@^8.1.5: - version "8.1.5" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" - integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== - dependencies: - chalk "^2.3.1" - commander "^2.14.1" - cosmiconfig "^5.0.2" - debug "^3.1.0" - dedent "^0.7.0" - del "^3.0.0" - execa "^1.0.0" - find-parent-dir "^0.3.0" - g-status "^2.0.2" - is-glob "^4.0.0" - is-windows "^1.0.2" - listr "^0.14.2" - listr-update-renderer "^0.5.0" - lodash "^4.17.11" - log-symbols "^2.2.0" - micromatch "^3.1.8" - npm-which "^3.0.1" - p-map "^1.1.1" - path-is-inside "^1.0.2" - pify "^3.0.0" - please-upgrade-node "^3.0.2" - staged-git-files "1.1.2" - string-argv "^0.0.2" - stringify-object "^3.2.2" - yup "^0.26.10" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= - -listr-update-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" - integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== - dependencies: - chalk "^2.4.1" - cli-cursor "^2.1.0" - date-fns "^1.27.2" - figures "^2.0.0" - -listr@^0.14.2: - version "0.14.3" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" - integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.5.0" - listr-verbose-renderer "^0.5.0" - p-map "^2.0.0" - rxjs "^6.3.3" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.unescape@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" - integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" - -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-queue@0.1: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= - dependencies: - es5-ext "~0.10.2" - -magic-string@^0.25.2: - version "0.25.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" - integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== - dependencies: - sourcemap-codec "^1.4.4" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" - integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -matcher@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" - integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== - dependencies: - escape-string-regexp "^1.0.4" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@~1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" - integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.39.0: - version "1.39.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.39.0.tgz#f95a20275742f7d2ad0429acfe40f4233543780e" - integrity sha512-DTsrw/iWVvwHH+9Otxccdyy0Tgiil6TWK/xhfARJZF/QFhwOgZgOIvA2/VIGpM8U7Q8z5nDmdDWC6tuVMJNibw== - -mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.23" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.23.tgz#d4eacd87de99348a6858fe1e479aad877388d977" - integrity sha512-ROk/m+gMVSrRxTkMlaQOvFmFmYDc7sZgrjjM76abqmd2Cc5fCV7jAMA5XUccEtJ3cYiYdgixUVI+fApc2LkXlw== - dependencies: - mime-db "~1.39.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - -mime@^2.0.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" - integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0, minimist@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== - dependencies: - minipass "^2.2.1" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.12.1: - version "2.13.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" - integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== - -nanoid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.3.tgz#dde999e173bc9d7bd2ee2746b89909ade98e075e" - integrity sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -napi-build-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" - integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -needle@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.0.tgz#ce3fea21197267bacb310705a7bbe24f2a3a3492" - integrity sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg== - dependencies: - debug "^4.1.0" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= - -neo-async@^2.5.0, neo-async@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== - -next-tick@1, next-tick@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-abi@^2.7.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643" - integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw== - dependencies: - semver "^5.4.1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "0.0.4" - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.2.1: - version "5.4.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" - integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.1.14: - version "1.1.15" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.15.tgz#9e76a73b0eca3bf7801addaa0e6ce90c795f2b9a" - integrity sha512-cKV097BQaZr8LTSRUa2+oc/aX5L8UkZtPQrMSTgiJEeaW7ymTDCoRaGCoaTqk0lqnalcoSHu4wjSl0Cmj2+bMw== - dependencies: - semver "^5.3.0" - -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-path@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" - integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== - dependencies: - which "^1.2.10" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-which@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" - integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= - dependencies: - commander "^2.9.0" - npm-path "^2.0.2" - which "^1.2.10" - -npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7: - version "2.1.3" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" - integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== - -object-keys@^1.0.12: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" - integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.12.0" - function-bind "^1.1.1" - has "^1.0.3" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optimize-css-assets-webpack-plugin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" - integrity sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A== - dependencies: - cssnano "^4.1.0" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-locale@^3.0.0, os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -parseurl@~1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" - integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== - dependencies: - semver-compare "^1.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-calc@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== - dependencies: - css-unit-converter "^1.1.1" - postcss "^7.0.5" - postcss-selector-parser "^5.0.0-rc.4" - postcss-value-parser "^3.3.1" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" - integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - postcss-value-parser "^3.3.1" - -postcss-modules-scope@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" - integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" - integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^7.0.6" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-selector-parser@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" - integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prebuild-install@^5.2.4: - version "5.2.5" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.5.tgz#c7485911fe98950b7f7cd15bb9daee11b875cc44" - integrity sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w== - dependencies: - detect-libc "^1.0.3" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - napi-build-utils "^1.0.1" - node-abi "^2.7.0" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^2.0.1" - rc "^1.2.7" - simple-get "^2.7.0" - tar-fs "^1.13.0" - tunnel-agent "^0.6.0" - which-pm-runs "^1.0.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier@^1.16.4: - version "1.17.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" - integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== - -pretty-format@^24.7.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" - integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== - dependencies: - "@jest/types" "^24.7.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0, progress@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prompts@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" - integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== - dependencies: - kleur "^3.0.2" - sisteransi "^1.0.0" - -prop-types@^15.6.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -property-expr@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" - integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== - -proxy-addr@~2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" - integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.0" - -proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24, psl@^1.1.28: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -puppeteer@^1.2.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.17.0.tgz#371957d227a2f450fa74b78e78a2dadb2be7f14f" - integrity sha512-3EXZSximCzxuVKpIHtyec8Wm2dWZn1fc5tQi34qWfiUgubEVYHjUvr0GOJojqf3mifI6oyKnCdrGxaOI+lWReA== - dependencies: - debug "^4.1.0" - extract-zip "^1.6.6" - https-proxy-agent "^2.2.1" - mime "^2.0.3" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^2.6.1" - ws "^6.1.0" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.5.2, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - -raw-body@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^16.8.1, react-is@^16.8.4: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" - integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== - -react@16.8.6: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" - integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.13.6" - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" - integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== - dependencies: - find-up "^4.0.0" - read-pkg "^5.1.1" - type-fest "^0.5.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= - dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -read-pkg@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" - integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^4.0.0" - type-fest "^0.4.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - -regenerate-unicode-properties@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" - integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== - -regenerator-runtime@^0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" - integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== - -regenerator-transform@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" - integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== - dependencies: - private "^0.1.6" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp-tree@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" - integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpu-core@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" - integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.0.2" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.1.0" - -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" - integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== - dependencies: - lodash "^4.17.11" - -request-promise-native@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" - integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== - dependencies: - request-promise-core "1.1.2" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.86.0, request@^2.87.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requireindex@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" - integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rollup-plugin-filesize@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-6.0.1.tgz#71937b48a411374c76c4a7e6bbdb087780d8bd64" - integrity sha512-wtxHShJofSxJRuYGGxgwIJyxxW+Mgu/vGGcsOUJVN+US6jE+gQYphSS3H2PS2HCVfxDtERtL0gjptk1gYru9rA== - dependencies: - boxen "^2.0.0" - brotli-size "0.0.3" - colors "^1.3.2" - deep-assign "^2.0.0" - filesize "^3.6.1" - gzip-size "^5.0.0" - terser "^3.10.0" - -rollup-plugin-node-resolve@^4.0.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz#638a373a54287d19fcc088fdd1c6fd8a58e4d90a" - integrity sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg== - dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.10.0" - -rollup-plugin-replace@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" - integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== - dependencies: - magic-string "^0.25.2" - rollup-pluginutils "^2.6.0" - -rollup-plugin-terser@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz#6f661ef284fa7c27963d242601691dc3d23f994e" - integrity sha512-wPANT5XKVJJ8RDUN0+wIr7UPd0lIXBo4UdJ59VmlPCtlFsE20AM+14pe+tk7YunCsWEiuzkDBY3QIkSCjtrPXg== - dependencies: - "@babel/code-frame" "^7.0.0" - jest-worker "^24.0.0" - serialize-javascript "^1.6.1" - terser "^3.14.1" - -rollup-pluginutils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz#203706edd43dfafeaebc355d7351119402fc83ad" - integrity sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ== - dependencies: - estree-walker "^0.6.0" - micromatch "^3.1.10" - -rollup@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.10.1.tgz#aeb763bbe98f707dc6496708db88372fa66687e7" - integrity sha512-pW353tmBE7QP622ITkGxtqF0d5gSRCVPD9xqM+fcPjudeZfoXMFW2sCzsTe2TU/zU1xamIjiS9xuFCPVT9fESw== - dependencies: - "@types/estree" "0.0.39" - "@types/node" "^11.13.5" - acorn "^6.1.1" - -rsvp@^4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" - integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -run-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" - integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.3.3, rxjs@^6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.13.6: - version "0.13.6" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" - integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" - integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== - -semver@5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - -semver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" - integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -serialize-javascript@^1.4.0, serialize-javascript@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" - integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== - -serializr@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/serializr/-/serializr-1.5.1.tgz#8967c8af868f05d8ba6a651a9866c8797533e49b" - integrity sha512-ygrOOOB+eaYYiFCLSS1kzu2KtmhP1ZzLFsv+GPWIdhtuDMBTN3H0ldnswPLqIExrEyQWQhiExFlC9Gu8pCT9Uw== - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shelljs@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -simple-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-git@^1.85.0: - version "1.110.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" - integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== - dependencies: - debug "^4.0.1" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sisteransi@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" - integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== - -size-limit@^1.3.3: - version "1.3.5" - resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-1.3.5.tgz#29b6dd0354afa2911ad4092a795266221e5860cd" - integrity sha512-OswnALGfujpnI2tkJl982QVjsXsNTo5MypobMciZaoPMyDzvKLurTDGCvsgcEcIb4fWXAc6yMMm7kuGcKs/GfA== - dependencies: - bytes "^3.1.0" - chalk "^2.4.2" - ci-job-number "^0.3.0" - compression-webpack-plugin "^2.0.0" - cosmiconfig "^5.2.1" - css-loader "^2.1.1" - del "^4.1.1" - estimo "^0.1.9" - file-loader "^3.0.1" - globby "^9.2.0" - gzip-size "^5.1.1" - make-dir "^3.0.0" - optimize-css-assets-webpack-plugin "^5.0.1" - react "16.8.6" - read-pkg-up "^6.0.0" - style-loader "^0.23.1" - webpack "^4.32.2" - webpack-bundle-analyzer "^3.3.2" - yargs "^13.2.4" - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6, source-map-support@~0.5.10: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" - integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" - integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -staged-git-files@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" - integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -string-argv@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" - integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - -string_decoder@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-loader@^0.23.1: - version "0.23.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" - integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.0.0, supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -svgo@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" - integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.28" - css-url-regex "^1.1.0" - csso "^3.5.1" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= - -synchronous-promise@^2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" - integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== - -table@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" - integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== - dependencies: - ajv "^6.9.1" - lodash "^4.17.11" - slice-ansi "^2.1.0" - string-width "^3.0.0" - -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tape@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.10.1.tgz#f73be60888dcb120f08b57f947af65a829506a5f" - integrity sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w== - dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.3" - function-bind "~1.1.1" - glob "~7.1.3" - has "~1.0.3" - inherits "~2.0.3" - minimist "~1.2.0" - object-inspect "~1.6.0" - resolve "~1.10.0" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - -tar-fs@^1.13.0: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -terser-webpack-plugin@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== - dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.16.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser@^3.10.0, terser@^3.14.1, terser@^3.16.1: - version "3.17.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" - integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== - dependencies: - commander "^2.19.0" - source-map "~0.6.1" - source-map-support "~0.5.10" - -test-exclude@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" - integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6, through@~2.3.4, through@~2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== - dependencies: - setimmediate "^1.0.4" - -timers-ext@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" - integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== - dependencies: - es5-ext "~0.10.46" - next-tick "1" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toposort@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" - integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= - -tough-cookie@^2.3.3, tough-cookie@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -tryer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - -ts-jest@^24.0.0: - version "24.0.2" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" - integrity sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw== - dependencies: - bs-logger "0.x" - buffer-from "1.x" - fast-json-stable-stringify "2.x" - json5 "2.x" - make-error "1.x" - mkdirp "0.x" - resolve "1.x" - semver "^5.5" - yargs-parser "10.x" - -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tsutils@^3.7.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" - integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" - integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== - -type-fest@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" - integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== - -type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^3.3.3333: - version "3.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.4.tgz#aac4a08abecab8091a75f10842ffa0631818f785" - integrity sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA== - -uglify-js@^3.1.4: - version "3.5.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.5.tgz#9c5aaaf3a7586fbf559df31fa6d3bca1b3ba7e9b" - integrity sha512-e58FqZzPwaLODQetDQKlvErZaGkh1UmzP8YwU0aG65NLourKNtwVyDG8tkIyUU0vqWzxaikSvTaxrCSscmvqvQ== - dependencies: - commander "~2.20.0" - source-map "~0.6.1" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" - integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" - integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== - dependencies: - imurmurhash "^0.1.4" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" - integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0, util.promisify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -webpack-bundle-analyzer@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f" - integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA== - dependencies: - acorn "^6.0.7" - acorn-walk "^6.1.1" - bfj "^6.1.1" - chalk "^2.4.1" - commander "^2.18.0" - ejs "^2.6.1" - express "^4.16.3" - filesize "^3.6.1" - gzip-size "^5.0.0" - lodash "^4.17.10" - mkdirp "^0.5.1" - opener "^1.5.1" - ws "^6.0.0" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.32.2: - version "4.32.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" - integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.0.5" - acorn-dynamic-import "^4.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^1.0.0" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" - integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - -which@^1.2.10, which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - -ws@^6.0.0, ws@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - -y18n@^3.2.0, y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== - -yargs-parser@10.x: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.0.0, yargs-parser@^13.1.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" - integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - -yargs@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^12.0.2: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^13.2.2, yargs@^13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" - -yargs@^3.29.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= - dependencies: - fd-slicer "~1.0.1" - -yup@^0.26.10: - version "0.26.10" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" - integrity sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw== - dependencies: - "@babel/runtime" "7.0.0" - fn-name "~2.0.1" - lodash "^4.17.10" - property-expr "^1.5.0" - synchronous-promise "^2.0.5" - toposort "^2.0.2" +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0", "@babel/core@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" + integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.3.tgz#5bbd279c6c3ac6a60266b89bbfe7f8021080a1ef" + integrity sha512-UMl3TSpX11PuODYdWGrUeW6zFkdYhDn7wRLrOuNVM6f9L+S9CzmDXYyrp3MTHcwWjnzur1f/Op8A7iYZWya2Yg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" + integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.0" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" + integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz#b1e357a1c49e58a47211a6853abb8e2aaefeb064" + integrity sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.3.tgz#9d6e5428bfd638ab53b37ae4ec8caf0477495147" + integrity sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-class-properties@^7.3.4": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" + integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-decorators@^7.3.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" + integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" + integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" + integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.5.4" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" + integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" + integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" + integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz#adc7a1137ab4287a555d429cc56ecde8f40c062c" + integrity sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz#1a95f5ca2bf2f91ef0648d5de38a8d472da4350f" + integrity sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz#fceff1c16d00c53d32d980448606f812cd6d02bf" + integrity sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz#c36ff40d893f2b8352202a2558824f70cd75e9fe" + integrity sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz#130c27ec7fb4f0cba30e958989449e5ec8d22bbd" + integrity sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz#3917f260463ac08f8896aa5bd54403f6e1fed165" + integrity sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA== + dependencies: + "@babel/helper-module-transforms" "^7.4.3" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" + integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" + integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== + dependencies: + regexp-tree "^0.1.0" + +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" + integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz#e5ff62929fdf4cf93e58badb5e2430303003800d" + integrity sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA== + dependencies: + "@babel/helper-call-delegate" "^7.4.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz#2a697af96887e2bbf5d303ab0221d139de5e739c" + integrity sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A== + dependencies: + regenerator-transform "^0.13.4" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-runtime@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz#4d6691690ecdc9f5cb8c3ab170a1576c1f556371" + integrity sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz#3868703fc0e8f443dda65654b298df576f7b863b" + integrity sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.3" + regexpu-core "^4.5.4" + +"@babel/preset-env@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.3.tgz#e71e16e123dc0fbf65a52cbcbcefd072fbd02880" + integrity sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.4.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.3" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.3" + "@babel/plugin-transform-dotall-regex" "^7.4.3" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.3" + "@babel/plugin-transform-function-name" "^7.4.3" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.3" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.4.3" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.3" + "@babel/plugin-transform-reserved-words" "^7.2.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.4.3" + "@babel/types" "^7.4.0" + browserslist "^4.5.2" + core-js-compat "^3.0.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.5.0" + +"@babel/runtime@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + integrity sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/runtime@^7.3.4": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc" + integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.0", "@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@condenast/perf-timeline-cli@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@condenast/perf-timeline-cli/-/perf-timeline-cli-0.1.3.tgz#bd9de5760d6cf5eca153a54400ec747be8b254c9" + integrity sha512-NedubRAGM2qDpMPjNVXYJHHuVckNpclWuj7/CUARwNoxrqqfrGik9UZo6NZGl/7mTasFNjnW3fy0fomYER/qsg== + dependencies: + cli-logger "^0.5.40" + puppeteer "^1.2.0" + yargs "^11.1.0" + +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" + integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.7.0" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + jest-watcher "^24.7.1" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" + integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== + dependencies: + "@jest/fake-timers" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + +"@jest/fake-timers@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" + integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== + dependencies: + "@jest/types" "^24.7.0" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + +"@jest/reporters@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" + integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" + integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" + integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== + dependencies: + "@jest/test-result" "^24.7.1" + jest-haste-map "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + +"@jest/transform@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" + integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.7.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.7.1" + jest-regex-util "^24.3.0" + jest-util "^24.7.1" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.7.0": + version "24.7.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" + integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/yargs" "^12.0.9" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + +"@types/babel__core@^7.1.0": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" + integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz#1eb8c033e98cf4e1a4cedcaf8bcafe8cb7591e85" + integrity sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg== + +"@types/jest-diff@*": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" + integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== + +"@types/jest@^24.0.11": + version "24.0.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340" + integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ== + dependencies: + "@types/jest-diff" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*", "@types/node@^11.11.3", "@types/node@^11.13.5": + version "11.13.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.6.tgz#37ec75690830acb0d74ce3c6c43caab787081e85" + integrity sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/q@^1.5.1": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" + integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + +"@types/resolve@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" + integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + +"@typescript-eslint/eslint-plugin@^1.4.2": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz#a5ff3128c692393fb16efa403ec7c8a5593dab0f" + integrity sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ== + dependencies: + "@typescript-eslint/parser" "1.6.0" + "@typescript-eslint/typescript-estree" "1.6.0" + requireindex "^1.2.0" + tsutils "^3.7.0" + +"@typescript-eslint/parser@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.6.0.tgz#f01189c8b90848e3b8e45a6cdad27870529d1804" + integrity sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw== + dependencies: + "@typescript-eslint/typescript-estree" "1.6.0" + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + +"@typescript-eslint/typescript-estree@1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz#6cf43a07fee08b8eb52e4513b428c8cdc9751ef0" + integrity sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-globals@^4.1.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.1.tgz#deb149c59276657ebd40ba2ba849ddd529763ccf" + integrity sha512-gJSiKY8dBIjV/0jagZIFBdVMtfQyA5QHCvAT48H2q8REQoW8Fs5AOjqBql1LgSXgrMWdevcE+8cdZ33NtVbIBA== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + +acorn-walk@^6.0.1, acorn-walk@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1, acorn@^6.0.5, acorn@^6.0.7, acorn@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + +ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0, ansi-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^1.0.1, array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-jest@^24.5.0, babel-jest@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" + integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== + dependencies: + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-plugin-istanbul@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.2.tgz#d8c2e2e83f72695d6bfdcd297719c66161d5f0f9" + integrity sha512-U3ZVajC+Z69Gim7ZzmD4Wcsq76i/1hqDamBfowc1tWzWjybRy70iWfngP2ME+1CrgcgZ/+muIbPY/Yi0dxdIkQ== + dependencies: + find-up "^3.0.0" + istanbul-lib-instrument "^3.2.0" + test-exclude "^5.2.2" + +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.6.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bfj@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48" + integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ== + dependencies: + bluebird "^3.5.1" + check-types "^7.3.0" + hoopy "^0.1.2" + tryer "^1.0.0" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +bigrig@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bigrig/-/bigrig-1.3.0.tgz#1f2a4822082c514659d06d7873ff4386b0d179e5" + integrity sha1-HypIIggsUUZZ0G14c/9DhrDReeU= + dependencies: + cli-color "^1.1.0" + mkdirp "^0.5.1" + yargs "^3.29.0" + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bluebird@^3.5.1, bluebird@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" + integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.18.3: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" + on-finished "~2.3.0" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-2.1.0.tgz#8d576156e33fc26a34d6be8635fd16b1d745f0b2" + integrity sha512-luq3RQOt2U5sUX+fiu+qnT+wWnHDcATLpEe63jvge6GUZO99AKbVRfp97d2jgLvq1iQa0ORzaAm4lGVG52ZSlw== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.0.0" + chalk "^2.4.1" + cli-boxes "^1.0.0" + string-width "^3.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +brotli-size@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/brotli-size/-/brotli-size-0.0.3.tgz#1d3855b38f182591a6f69da1516131676e5f62f2" + integrity sha512-bBIdd8uUGxKGldAVykxOqPegl+HlIm4FpXJamwWw5x77WCE8jO7AhXFE1YXOhOB28gS+2pTQete0FqRE6U5hQQ== + dependencies: + duplexer "^0.1.1" + iltorb "^2.0.5" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.5.2, browserslist@^4.5.4: + version "4.5.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.5.tgz#fe1a352330d2490d5735574c149a85bc18ef9b82" + integrity sha512-0QFO1r/2c792Ohkit5XI8Cm8pDtZxgNl2H6HU4mHrpYz7314pEYcsAVVatM0l/YmxPnEzh9VygXouj4gkFUTKA== + dependencies: + caniuse-lite "^1.0.30000960" + electron-to-chromium "^1.3.124" + node-releases "^1.1.14" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^11.0.2, cacache@^11.2.0: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000960: + version "1.0.30000962" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000962.tgz#6c10c3ab304b89bea905e66adf98c0905088ee44" + integrity sha512-WXYsW38HK+6eaj5IZR16Rn91TGhU3OhbwjKZvJ4HN/XBIABLKfbij9Mnd3pM0VEwZSlltWjoWg3I8FQ0DGgNOA== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-types@^7.3.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4" + integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg== + +chokidar@^2.0.2: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.0.1, chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-job-number@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ci-job-number/-/ci-job-number-0.3.0.tgz#34bdd114b0dece1960287bd40a57051041a2a800" + integrity sha1-NL3RFLDezhlgKHvUClcFEEGiqAA= + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/circular/-/circular-1.0.5.tgz#7da77af98bbde9ce4b5b358cd556b5dded2d3149" + integrity sha1-fad6+Yu96c5LWzWM1Va13e0tMUk= + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-color@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" + integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== + dependencies: + ansi-regex "^2.1.1" + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + memoizee "^0.4.14" + timers-ext "^0.1.5" + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-logger@^0.5.40: + version "0.5.40" + resolved "https://registry.yarnpkg.com/cli-logger/-/cli-logger-0.5.40.tgz#097f0e11b072c7c698a26c47f588a29c20b48b0b" + integrity sha1-CX8OEbByx8aYomxH9YiinCC0iws= + dependencies: + circular "^1.0.5" + cli-util "~1.1.27" + +cli-regexp@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-regexp/-/cli-regexp-0.1.2.tgz#6bcd93b09fb2ed1025d30a1155d5997954a53512" + integrity sha1-a82TsJ+y7RAl0woRVdWZeVSlNRI= + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-util@~1.1.27: + version "1.1.27" + resolved "https://registry.yarnpkg.com/cli-util/-/cli-util-1.1.27.tgz#42d69e36a040a321fc9cf851c1513cadc5093054" + integrity sha1-QtaeNqBAoyH8nPhRwVE8rcUJMFQ= + dependencies: + cli-regexp "~0.1.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" + integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" + integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg== + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + +colors@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.14.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compression-webpack-plugin@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc" + integrity sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q== + dependencies: + cacache "^11.2.0" + find-cache-dir "^2.0.0" + neo-async "^2.5.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + webpack-sources "^1.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@1.6.2, concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.1.0, convert-source-map@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.1.tgz#bff73ba31ca8687431b9c88f78d3362646fb76f0" + integrity sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g== + dependencies: + browserslist "^4.5.4" + core-js "3.0.1" + core-js-pure "3.0.1" + semver "^6.0.0" + +core-js-pure@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.1.tgz#37358fb0d024e6b86d443d794f4e37e949098cbe" + integrity sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g== + +core-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" + integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.0, cosmiconfig@^5.0.2, cosmiconfig@^5.0.7, cosmiconfig@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +coveralls@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.3.tgz#83b1c64aea1c6afa69beaf50b55ac1bc4d13e2b8" + integrity sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg== + dependencies: + growl "~> 1.10.0" + js-yaml "^3.11.0" + lcov-parse "^0.0.10" + log-driver "^1.2.7" + minimist "^1.2.0" + request "^2.86.0" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0, cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-loader@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + integrity sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w== + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== + dependencies: + boolbase "^1.0.0" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-tree@1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + +css-unit-converter@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" + integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + +css-url-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" + integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= + +css-what@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== + dependencies: + css-declaration-sorter "^4.0.1" + cssnano-util-raw-cache "^4.0.1" + postcss "^7.0.0" + postcss-calc "^7.0.1" + postcss-colormin "^4.0.3" + postcss-convert-values "^4.0.1" + postcss-discard-comments "^4.0.2" + postcss-discard-duplicates "^4.0.2" + postcss-discard-empty "^4.0.1" + postcss-discard-overridden "^4.0.1" + postcss-merge-longhand "^4.0.11" + postcss-merge-rules "^4.0.3" + postcss-minify-font-values "^4.0.2" + postcss-minify-gradients "^4.0.2" + postcss-minify-params "^4.0.2" + postcss-minify-selectors "^4.0.2" + postcss-normalize-charset "^4.0.1" + postcss-normalize-display-values "^4.0.2" + postcss-normalize-positions "^4.0.2" + postcss-normalize-repeat-style "^4.0.2" + postcss-normalize-string "^4.0.2" + postcss-normalize-timing-functions "^4.0.2" + postcss-normalize-unicode "^4.0.1" + postcss-normalize-url "^4.0.1" + postcss-normalize-whitespace "^4.0.2" + postcss-ordered-values "^4.1.2" + postcss-reduce-initial "^4.0.3" + postcss-reduce-transforms "^4.0.2" + postcss-svgo "^4.0.2" + postcss-unique-selectors "^4.0.1" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano@^4.1.0: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" + integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== + dependencies: + css-tree "1.0.0-alpha.29" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + dependencies: + cssom "0.3.x" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-assign@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572" + integrity sha1-6+BrHwfwja5ZdiDj3RYi83GhxXI= + dependencies: + is-obj "^1.0.0" + +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2, detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-to-chromium@^1.3.124: + version "1.3.125" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.125.tgz#dbde0e95e64ebe322db0eca764d951f885a5aff2" + integrity sha512-XxowpqQxJ4nDwUXHtVtmEhRqBpm2OnjBomZmZtHD0d2Eo0244+Ojezhk3sD/MBSSe2nxCdGQFRXHIsf/LUTL9A== + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + +elliptic@^6.0.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.12.0, es-abstract@^1.5.0, es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.50" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.50.tgz#6d0e23a0abdb27018e5ac4fd09b412bc5517a778" + integrity sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "^1.0.0" + +es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.6" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^4.0.0, eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^5.15.2: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.13.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estimo@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/estimo/-/estimo-0.1.9.tgz#76875dc8e3f8c7b4d0e11ad0bccae1f6e3b5368a" + integrity sha512-8154FqD1aaJuj95BKazdywVmPa8IIKOVDE7s9MFZI6s4QDbTZv+ITI39BMNwdzg8zcQ0/utAvzfzSJI6/4HcrA== + dependencies: + "@condenast/perf-timeline-cli" "^0.1.3" + bigrig "^1.3.0" + cross-spawn "^6.0.5" + nanoid "^2.0.1" + yargs "^13.2.2" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estree-walker@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" + integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expect@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" + integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== + dependencies: + "@jest/types" "^24.7.0" + ansi-styles "^3.2.0" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + +express@^4.16.3: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.3" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.4" + qs "6.5.2" + range-parser "~1.2.0" + safe-buffer "5.1.2" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" + +file-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + +fileset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + +filesize@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" + integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" + integrity sha512-zoH7ZWPkRdgwYCDVoQTzqjG8JSPANhtvLhh4KVUHyKnaUJJrNeFmWIkTcNuJmR3GLMEmGYEf2S2bjgx26JTF+Q== + dependencies: + locate-path "^5.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + +flow-bin@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.59.0.tgz#8c151ee7f09f1deed9bf0b9d1f2e8ab9d470f1bb" + integrity sha512-yJDRffvby5mCTkbwOdXwiGDjeea8Z+BPVuP53/tHqHIZC+KtQD790zopVf7mHk65v+wRn+TZ7tkRSNA9oDmyLg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +fn-name@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= + +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" + integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +g-status@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" + integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== + dependencies: + arrify "^1.0.1" + matcher "^1.0.0" + simple-git "^1.85.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" + integrity sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0, globals@^11.7.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +"growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +gzip-size@^5.0.0, gzip-size@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +handlebars@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1, has@^1.0.3, has@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoopy@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-comment-regex@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" + integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +husky@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" + integrity sha512-86U6sVVVf4b5NYSZ0yvv88dRgBSSXXmHaiq5pP4KDj5JVzdwKgBjEtUPOm8hcoytezFwbU+7gotXNhpHdystlg== + dependencies: + cosmiconfig "^5.0.7" + execa "^1.0.0" + find-up "^3.0.0" + get-stdin "^6.0.0" + is-ci "^2.0.0" + pkg-dir "^3.0.0" + please-upgrade-node "^3.1.1" + read-pkg "^4.0.1" + run-node "^1.0.0" + slash "^2.0.0" + +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.0.tgz#339dbbffb9f8729a243b701e1c29d4cc58c52f0e" + integrity sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +ignore@^4.0.3, ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +iltorb@^2.0.5: + version "2.4.2" + resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-2.4.2.tgz#51e341045ad5181bf64832a569ec576e7df0faf2" + integrity sha512-RvsVTHt1Pw1/Zcepfd+3jinu38rO8IBFVONcroT9Dwrb5RSNE/CEX7uy1yZKN/kYCQB7FWx/oQgXhN9qAwZY9Q== + dependencies: + detect-libc "^1.0.3" + nan "^2.12.1" + npmlog "^4.1.2" + prebuild-install "^5.2.4" + which-pm-runs "^1.0.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^6.2.2: + version "6.3.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.3.1.tgz#7a413b5e7950811013a3db491c61d1f3b776e8e7" + integrity sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.3, is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0, is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.1.0.tgz#2e0c7e463ff5b7a0eb60852d851a6809347a124c" + integrity sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1, is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-svg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" + integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== + dependencies: + html-comment-regex "^1.1.0" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-api@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.5.tgz#697b95ec69856c278aacafc0f86ee7392338d5b5" + integrity sha512-meYk1BwDp59Pfse1TvPrkKYgVqAufbdBLEVoqvu/hLLKSaQ054ZTksbNepyc223tMnWdm6AdK2URIJJRqdP87g== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.4" + istanbul-lib-hook "^2.0.6" + istanbul-lib-instrument "^3.2.0" + istanbul-lib-report "^2.0.7" + istanbul-lib-source-maps "^3.0.5" + istanbul-reports "^2.2.3" + js-yaml "^3.13.0" + make-dir "^2.1.0" + minimatch "^3.0.4" + once "^1.4.0" + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== + +istanbul-lib-hook@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" + +istanbul-lib-report@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== + dependencies: + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + supports-color "^6.0.0" + +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + rimraf "^2.6.2" + source-map "^0.6.1" + +istanbul-reports@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.3.tgz#14e0d00ecbfa9387757999cf36599b88e9f2176e" + integrity sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw== + dependencies: + handlebars "^4.1.0" + +iterall@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== + +jest-changed-files@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" + integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== + dependencies: + "@jest/types" "^24.7.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" + integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== + dependencies: + "@jest/core" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" + integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.7.1" + "@jest/types" "^24.7.0" + babel-jest "^24.7.1" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.7.1" + jest-environment-node "^24.7.1" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + micromatch "^3.1.10" + pretty-format "^24.7.0" + realpath-native "^1.1.0" + +jest-diff@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" + integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" + +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" + integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== + dependencies: + "@jest/types" "^24.7.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + jest-util "^24.7.1" + pretty-format "^24.7.0" + +jest-environment-jsdom@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" + integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" + jsdom "^11.5.1" + +jest-environment-node@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" + integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" + +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== + +jest-haste-map@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" + integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== + dependencies: + "@jest/types" "^24.7.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.4.0" + jest-util "^24.7.1" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" + integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.7.1" + is-generator-fn "^2.0.0" + jest-each "^24.7.1" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + pretty-format "^24.7.0" + throat "^4.0.0" + +jest-leak-detector@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" + integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== + dependencies: + pretty-format "^24.7.0" + +jest-matcher-utils@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" + integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== + dependencies: + chalk "^2.0.1" + jest-diff "^24.7.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" + +jest-message-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" + integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" + integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== + dependencies: + "@jest/types" "^24.7.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" + integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== + dependencies: + "@jest/types" "^24.7.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.7.1" + +jest-resolve@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" + integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== + dependencies: + "@jest/types" "^24.7.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" + integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-docblock "^24.3.0" + jest-haste-map "^24.7.1" + jest-jasmine2 "^24.7.1" + jest-leak-detector "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" + integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.2" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== + +jest-snapshot@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" + integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + expect "^24.7.1" + jest-diff "^24.7.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.7.0" + semver "^5.5.0" + +jest-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" + integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" + integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== + dependencies: + "@jest/types" "^24.7.0" + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + leven "^2.1.0" + pretty-format "^24.7.0" + +jest-watcher@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" + integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== + dependencies: + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.9" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.7.1" + string-length "^2.0.0" + +jest-worker@^24.0.0, jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" + +jest@^24.5.0: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" + integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== + dependencies: + import-local "^2.0.0" + jest-cli "^24.7.1" + +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.11.0, js-yaml@^3.13.0, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lint-staged@^8.1.5: + version "8.1.5" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.5.tgz#372476fe1a58b8834eb562ed4c99126bd60bdd79" + integrity sha512-e5ZavfnSLcBJE1BTzRTqw6ly8OkqVyO3GL2M6teSmTBYQ/2BuueD5GIt2RPsP31u/vjKdexUyDCxSyK75q4BDA== + dependencies: + chalk "^2.3.1" + commander "^2.14.1" + cosmiconfig "^5.0.2" + debug "^3.1.0" + dedent "^0.7.0" + del "^3.0.0" + execa "^1.0.0" + find-parent-dir "^0.3.0" + g-status "^2.0.2" + is-glob "^4.0.0" + is-windows "^1.0.2" + listr "^0.14.2" + listr-update-renderer "^0.5.0" + lodash "^4.17.11" + log-symbols "^2.2.0" + micromatch "^3.1.8" + npm-which "^3.0.1" + p-map "^1.1.1" + path-is-inside "^1.0.2" + pify "^3.0.0" + please-upgrade-node "^3.0.2" + staged-git-files "1.1.2" + string-argv "^0.0.2" + stringify-object "^3.2.2" + yup "^0.26.10" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@^0.14.2: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +magic-string@^0.25.2: + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" + integrity sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +matcher@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" + integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== + dependencies: + escape-string-regexp "^1.0.4" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memoizee@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge2@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.39.0: + version "1.39.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.39.0.tgz#f95a20275742f7d2ad0429acfe40f4233543780e" + integrity sha512-DTsrw/iWVvwHH+9Otxccdyy0Tgiil6TWK/xhfARJZF/QFhwOgZgOIvA2/VIGpM8U7Q8z5nDmdDWC6tuVMJNibw== + +mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.23" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.23.tgz#d4eacd87de99348a6858fe1e479aad877388d977" + integrity sha512-ROk/m+gMVSrRxTkMlaQOvFmFmYDc7sZgrjjM76abqmd2Cc5fCV7jAMA5XUccEtJ3cYiYdgixUVI+fApc2LkXlw== + dependencies: + mime-db "~1.39.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@^2.0.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" + integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.1, mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + +nanoid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.3.tgz#dde999e173bc9d7bd2ee2746b89909ade98e075e" + integrity sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.0.tgz#ce3fea21197267bacb310705a7bbe24f2a3a3492" + integrity sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg== + dependencies: + debug "^4.1.0" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= + +neo-async@^2.5.0, neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + +next-tick@1, next-tick@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-abi@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643" + integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw== + dependencies: + semver "^5.4.1" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-libs-browser@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "0.0.4" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node-releases@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.15.tgz#9e76a73b0eca3bf7801addaa0e6ce90c795f2b9a" + integrity sha512-cKV097BQaZr8LTSRUa2+oc/aX5L8UkZtPQrMSTgiJEeaW7ymTDCoRaGCoaTqk0lqnalcoSHu4wjSl0Cmj2+bMw== + dependencies: + semver "^5.3.0" + +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-path@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== + dependencies: + which "^1.2.10" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" + +npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7: + version "2.1.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" + integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" + integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.12.0" + function-bind "^1.1.1" + has "^1.0.3" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opener@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" + integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimize-css-assets-webpack-plugin@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" + integrity sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A== + dependencies: + cssnano "^4.1.0" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseurl@~1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +please-upgrade-node@^3.0.2, please-upgrade-node@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" + integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== + dependencies: + semver-compare "^1.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-calc@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== + dependencies: + css-unit-converter "^1.1.1" + postcss "^7.0.5" + postcss-selector-parser "^5.0.0-rc.4" + postcss-value-parser "^3.3.1" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + cssnano-util-same-parent "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + vendors "^1.0.0" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + alphanum-sort "^1.0.0" + browserslist "^4.0.0" + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" + integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-selector-parser@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" + integrity sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU= + dependencies: + dot-prop "^4.1.1" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== + dependencies: + is-svg "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" + integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prebuild-install@^5.2.4: + version "5.2.5" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.5.tgz#c7485911fe98950b7f7cd15bb9daee11b875cc44" + integrity sha512-6uZgMVg7yDfqlP5CPurVhtq3hUKBFNufiar4J5hZrlHTo59DDBEtyxw01xCdFss9j0Zb9+qzFVf/s4niayba3w== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^2.0.1" + rc "^1.2.7" + simple-get "^2.7.0" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.0.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier@^1.16.4: + version "1.17.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.0.tgz#53b303676eed22cc14a9f0cec09b477b3026c008" + integrity sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw== + +pretty-format@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" + integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== + dependencies: + "@jest/types" "^24.7.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +progress@^2.0.0, progress@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" + +prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-expr@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" + integrity sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g== + +proxy-addr@~2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +puppeteer@^1.2.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.17.0.tgz#371957d227a2f450fa74b78e78a2dadb2be7f14f" + integrity sha512-3EXZSximCzxuVKpIHtyec8Wm2dWZn1fc5tQi34qWfiUgubEVYHjUvr0GOJojqf3mifI6oyKnCdrGxaOI+lWReA== + dependencies: + debug "^4.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.1" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^6.1.0" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +raw-body@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== + dependencies: + bytes "3.0.0" + http-errors "1.6.3" + iconv-lite "0.4.23" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.8.1, react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +react@16.8.6: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" + integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.6" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-6.0.0.tgz#da75ce72762f2fa1f20c5a40d4dd80c77db969e3" + integrity sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw== + dependencies: + find-up "^4.0.0" + read-pkg "^5.1.1" + type-fest "^0.5.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" + integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= + dependencies: + normalize-package-data "^2.3.2" + parse-json "^4.0.0" + pify "^3.0.0" + +read-pkg@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5" + integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^4.0.0" + type-fest "^0.4.1" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" + integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== + dependencies: + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp-tree@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" + integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.86.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1, resolve@~1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup-plugin-filesize@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-filesize/-/rollup-plugin-filesize-6.0.1.tgz#71937b48a411374c76c4a7e6bbdb087780d8bd64" + integrity sha512-wtxHShJofSxJRuYGGxgwIJyxxW+Mgu/vGGcsOUJVN+US6jE+gQYphSS3H2PS2HCVfxDtERtL0gjptk1gYru9rA== + dependencies: + boxen "^2.0.0" + brotli-size "0.0.3" + colors "^1.3.2" + deep-assign "^2.0.0" + filesize "^3.6.1" + gzip-size "^5.0.0" + terser "^3.10.0" + +rollup-plugin-node-resolve@^4.0.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.3.tgz#638a373a54287d19fcc088fdd1c6fd8a58e4d90a" + integrity sha512-r+WaesPzdGEynpLZLALFEDugA4ACa5zn7bc/+LVX4vAXQQ8IgDHv0xfsSvJ8tDXUtprfBtrDtRFg27ifKjcJTg== + dependencies: + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + is-module "^1.0.0" + resolve "^1.10.0" + +rollup-plugin-replace@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz#f41ae5372e11e7a217cde349c8b5d5fd115e70e3" + integrity sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA== + dependencies: + magic-string "^0.25.2" + rollup-pluginutils "^2.6.0" + +rollup-plugin-terser@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-4.0.4.tgz#6f661ef284fa7c27963d242601691dc3d23f994e" + integrity sha512-wPANT5XKVJJ8RDUN0+wIr7UPd0lIXBo4UdJ59VmlPCtlFsE20AM+14pe+tk7YunCsWEiuzkDBY3QIkSCjtrPXg== + dependencies: + "@babel/code-frame" "^7.0.0" + jest-worker "^24.0.0" + serialize-javascript "^1.6.1" + terser "^3.14.1" + +rollup-pluginutils@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.6.0.tgz#203706edd43dfafeaebc355d7351119402fc83ad" + integrity sha512-aGQwspEF8oPKvg37u3p7h0cYNwmJR1sCBMZGZ5b9qy8HGtETknqjzcxrDRrcAnJNXN18lBH4Q9vZYth/p4n8jQ== + dependencies: + estree-walker "^0.6.0" + micromatch "^3.1.10" + +rollup@^1.6.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.10.1.tgz#aeb763bbe98f707dc6496708db88372fa66687e7" + integrity sha512-pW353tmBE7QP622ITkGxtqF0d5gSRCVPD9xqM+fcPjudeZfoXMFW2sCzsTe2TU/zU1xamIjiS9xuFCPVT9fESw== + dependencies: + "@types/estree" "0.0.39" + "@types/node" "^11.13.5" + acorn "^6.1.1" + +rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +run-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rxjs@^6.3.3, rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.13.6: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serialize-javascript@^1.4.0, serialize-javascript@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== + +serializr@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/serializr/-/serializr-1.5.1.tgz#8967c8af868f05d8ba6a651a9866c8797533e49b" + integrity sha512-ygrOOOB+eaYYiFCLSS1kzu2KtmhP1ZzLFsv+GPWIdhtuDMBTN3H0ldnswPLqIExrEyQWQhiExFlC9Gu8pCT9Uw== + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shelljs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-git@^1.85.0: + version "1.110.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.110.0.tgz#54eb179089d055a7783d32399246cebc9d9933e9" + integrity sha512-UYY0rQkknk0P5eb+KW+03F4TevZ9ou0H+LoGaj7iiVgpnZH4wdj/HTViy/1tNNkmIPcmtxuBqXWiYt2YwlRKOQ== + dependencies: + debug "^4.0.1" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + +size-limit@^1.3.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/size-limit/-/size-limit-1.3.5.tgz#29b6dd0354afa2911ad4092a795266221e5860cd" + integrity sha512-OswnALGfujpnI2tkJl982QVjsXsNTo5MypobMciZaoPMyDzvKLurTDGCvsgcEcIb4fWXAc6yMMm7kuGcKs/GfA== + dependencies: + bytes "^3.1.0" + chalk "^2.4.2" + ci-job-number "^0.3.0" + compression-webpack-plugin "^2.0.0" + cosmiconfig "^5.2.1" + css-loader "^2.1.1" + del "^4.1.1" + estimo "^0.1.9" + file-loader "^3.0.1" + globby "^9.2.0" + gzip-size "^5.1.1" + make-dir "^3.0.0" + optimize-css-assets-webpack-plugin "^5.0.1" + react "16.8.6" + read-pkg-up "^6.0.0" + style-loader "^0.23.1" + webpack "^4.32.2" + webpack-bundle-analyzer "^3.3.2" + yargs "^13.2.4" + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@~0.5.10: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +staged-git-files@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" + integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + +string-argv@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" + integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-loader@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.0.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +svgo@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" + integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.28" + css-url-regex "^1.1.0" + csso "^3.5.1" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + +synchronous-promise@^2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" + integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== + +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tape@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.10.1.tgz#f73be60888dcb120f08b57f947af65a829506a5f" + integrity sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w== + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.3" + has "~1.0.3" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.6.0" + resolve "~1.10.0" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + +tar-fs@^1.13.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +terser-webpack-plugin@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" + integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.10.0, terser@^3.14.1, terser@^3.16.1: + version "3.17.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" + integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== + dependencies: + commander "^2.19.0" + source-map "~0.6.1" + source-map-support "~0.5.10" + +test-exclude@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" + integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6, through@~2.3.4, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== + dependencies: + setimmediate "^1.0.4" + +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" + integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA= + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tryer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-jest@^24.0.0: + version "24.0.2" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.2.tgz#8dde6cece97c31c03e80e474c749753ffd27194d" + integrity sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tsutils@^3.7.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.10.0.tgz#6f1c95c94606e098592b0dff06590cf9659227d6" + integrity sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" + integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== + +type-fest@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" + integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== + +type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.3.3333: + version "3.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.4.tgz#aac4a08abecab8091a75f10842ffa0631818f785" + integrity sha512-xt5RsIRCEaf6+j9AyOBgvVuAec0i92rgCaS3S+UVf5Z/vF2Hvtsw08wtUTJqp4djwznoAgjSxeCcU4r+CcDBJA== + +uglify-js@^3.1.4: + version "3.5.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.5.tgz#9c5aaaf3a7586fbf559df31fa6d3bca1b3ba7e9b" + integrity sha512-e58FqZzPwaLODQetDQKlvErZaGkh1UmzP8YwU0aG65NLourKNtwVyDG8tkIyUU0vqWzxaikSvTaxrCSscmvqvQ== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0, util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" + integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= + dependencies: + indexof "0.0.1" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webpack-bundle-analyzer@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f" + integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA== + dependencies: + acorn "^6.0.7" + acorn-walk "^6.1.1" + bfj "^6.1.1" + chalk "^2.4.1" + commander "^2.18.0" + ejs "^2.6.1" + express "^4.16.3" + filesize "^3.6.1" + gzip-size "^5.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + opener "^1.5.1" + ws "^6.0.0" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.32.2: + version "4.32.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" + integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^1.0.0" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + +which@^1.2.10, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +ws@^6.0.0, ws@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +y18n@^3.2.0, y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@10.x: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.0.0, yargs-parser@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" + integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + +yargs@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^13.2.2, yargs@^13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + +yargs@^3.29.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= + dependencies: + fd-slicer "~1.0.1" + +yup@^0.26.10: + version "0.26.10" + resolved "https://registry.yarnpkg.com/yup/-/yup-0.26.10.tgz#3545839663289038faf25facfc07e11fd67c0cb1" + integrity sha512-keuNEbNSnsOTOuGCt3UJW69jDE3O4P+UHAakO7vSeFMnjaitcmlbij/a3oNb9g1Y1KvSKH/7O1R2PQ4m4TRylw== + dependencies: + "@babel/runtime" "7.0.0" + fn-name "~2.0.1" + lodash "^4.17.10" + property-expr "^1.5.0" + synchronous-promise "^2.0.5" + toposort "^2.0.2" From 81c1bcd5b2de8f662210bdb8ef753a5e9f0edb9b Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Sat, 28 Sep 2019 14:45:29 +0200 Subject: [PATCH 0135/1043] fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f189be160..9c9e117ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 5.13.1 / 4.13.1 (TO BE RELEASED) +# 5.13.1 / 4.13.1 * Don't use `global` and `self` keywords unless defined. Fixes [#2070](https://github.com/mobxjs/mobx/issues/2070). * onBecome(Un)Observed didn't trigger when using number as key of observable map. Fixes [#2067](https://github.com/mobxjs/mobx/issues/2067). From 9089f983fd9652aa556a99d67127c6a90348d30d Mon Sep 17 00:00:00 2001 From: Bnaya Peretz Date: Sun, 18 Aug 2019 11:48:46 +0300 Subject: [PATCH 0136/1043] feat: Add additional optional dev time checks --- flow-typed/mobx.js | 6 ++ src/api/autorun.ts | 18 ++++-- src/api/configure.ts | 22 ++++++- src/api/when.ts | 5 ++ src/core/action.ts | 5 ++ src/core/derivation.ts | 45 ++++++++++++++ src/core/globalstate.ts | 21 +++++++ src/core/observable.ts | 6 +- src/core/reaction.ts | 3 +- test/base/autorun.js | 70 ++++++++++++++++------ test/base/autorunAsync.js | 89 ++++++++++++++++++--------- test/base/reaction.js | 31 ++++++++++ test/base/strict-mode.js | 123 +++++++++++++++++++++++++++++++++++++- 13 files changed, 388 insertions(+), 56 deletions(-) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index 1c739a1ac..d1a423185 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -5,6 +5,8 @@ export type IObservableMapInitialValues = IMapEntries | KeyValueMap< export interface IMobxConfigurationOptions { +enforceActions?: boolean | "strict" | "never" | "always" | "observed"; computedRequiresReaction?: boolean; + reactionRequiresObservable?: boolean; + observableRequiresReaction?: boolean; isolateGlobalState?: boolean; disableErrorBoundaries?: boolean; arrayBuffer?: number; @@ -16,6 +18,10 @@ declare export function configure(options: IMobxConfigurationOptions): void export interface IAutorunOptions { delay?: number; name?: string; + /** + * warn if the derivation has no dependencies after creation/update + */ + requiresObservable?: boolean; scheduler?: (callback: () => void) => any; onError?: (error: any) => void; } diff --git a/src/api/autorun.ts b/src/api/autorun.ts index 57de14628..d83d70739 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -15,6 +15,11 @@ import { export interface IAutorunOptions { delay?: number name?: string + /** + * Experimental. + * Warns if the view doesn't track observables + */ + requiresObservable?: boolean scheduler?: (callback: () => void) => any onError?: (error: any) => void } @@ -48,7 +53,8 @@ export function autorun( function(this: Reaction) { this.track(reactionRunner) }, - opts.onError + opts.onError, + opts.requiresObservable ) } else { const scheduler = createSchedulerFromOptions(opts) @@ -66,7 +72,8 @@ export function autorun( }) } }, - opts.onError + opts.onError, + opts.requiresObservable ) } @@ -89,8 +96,8 @@ function createSchedulerFromOptions(opts: IReactionOptions) { return opts.scheduler ? opts.scheduler : opts.delay - ? (f: Lambda) => setTimeout(f, opts.delay!) - : run + ? (f: Lambda) => setTimeout(f, opts.delay!) + : run } export function reaction( @@ -131,7 +138,8 @@ export function reaction( scheduler!(reactionRunner) } }, - opts.onError + opts.onError, + opts.requiresObservable ) function reactionRunner() { diff --git a/src/api/configure.ts b/src/api/configure.ts index e99328107..e1112ac56 100644 --- a/src/api/configure.ts +++ b/src/api/configure.ts @@ -9,6 +9,16 @@ import { export function configure(options: { enforceActions?: boolean | "strict" | "never" | "always" | "observed" computedRequiresReaction?: boolean + /** + * (Experimental) + * Warn if you try to create to derivation / reactive context without accessing any observable. + */ + reactionRequiresObservable?: boolean + /** + * (Experimental) + * Warn if observables are accessed outside a reactive context + */ + observableRequiresReaction?: boolean computedConfigurable?: boolean isolateGlobalState?: boolean disableErrorBoundaries?: boolean @@ -19,7 +29,9 @@ export function configure(options: { computedRequiresReaction, computedConfigurable, disableErrorBoundaries, - reactionScheduler + reactionScheduler, + reactionRequiresObservable, + observableRequiresReaction } = options if (options.isolateGlobalState === true) { isolateGlobalState() @@ -54,6 +66,14 @@ export function configure(options: { if (computedRequiresReaction !== undefined) { globalState.computedRequiresReaction = !!computedRequiresReaction } + if (reactionRequiresObservable !== undefined) { + globalState.reactionRequiresObservable = !!reactionRequiresObservable + } + if (observableRequiresReaction !== undefined) { + globalState.observableRequiresReaction = !!observableRequiresReaction + + globalState.allowStateReads = !globalState.observableRequiresReaction + } if (computedConfigurable !== undefined) { globalState.computedConfigurable = !!computedConfigurable } diff --git a/src/api/when.ts b/src/api/when.ts index 1276a29b1..7df51a1e0 100644 --- a/src/api/when.ts +++ b/src/api/when.ts @@ -11,6 +11,11 @@ import { export interface IWhenOptions { name?: string timeout?: number + /** + * Experimental. + * Warns if the view doesn't track observables + */ + requiresObservable?: boolean onError?: (error: any) => void } diff --git a/src/core/action.ts b/src/core/action.ts index afd96eaa9..ddff349b3 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -11,6 +11,7 @@ import { untrackedEnd, untrackedStart } from "../internal" +import { allowStateReadsStart, allowStateReadsEnd } from "./derivation" export interface IAction { isMobxAction: boolean @@ -44,6 +45,7 @@ export function executeAction(actionName: string, fn: Function, scope?: any, arg export interface IActionRunInfo { prevDerivation: IDerivation | null prevAllowStateChanges: boolean + prevAllowStateReads: boolean notifySpy: boolean startTime: number error?: any @@ -69,9 +71,11 @@ export function _startAction(actionName: string, scope: any, args?: IArguments): const prevDerivation = untrackedStart() startBatch() const prevAllowStateChanges = allowStateChangesStart(true) + const prevAllowStateReads = allowStateReadsStart(true) const runInfo = { prevDerivation, prevAllowStateChanges, + prevAllowStateReads, notifySpy, startTime, actionId: globalState.nextActionId++, @@ -91,6 +95,7 @@ export function _endAction(runInfo: IActionRunInfo) { globalState.suppressReactionErrors = true } allowStateChangesEnd(runInfo.prevAllowStateChanges) + allowStateReadsEnd(runInfo.prevAllowStateReads) endBatch() untrackedEnd(runInfo.prevDerivation) if (runInfo.notifySpy && process.env.NODE_ENV !== "production") { diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 7599b8ccc..61c124734 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -55,6 +55,11 @@ export interface IDerivation extends IDepTreeNode { __mapid: string onBecomeStale(): void isTracing: TraceMode + + /** + * warn if the derivation has no dependencies after creation/update + */ + requiresObservable?: boolean } export class CaughtException { @@ -155,12 +160,23 @@ export function checkIfStateModificationsAreAllowed(atom: IAtom) { ) } +export function checkIfStateReadsAreAllowed(observable: IObservable) { + if ( + process.env.NODE_ENV !== "production" && + !globalState.allowStateReads && + globalState.observableRequiresReaction + ) { + console.warn(`[mobx] Observable ${observable.name} being read outside a reactive context`) + } +} + /** * Executes the provided function `f` and tracks which observables are being accessed. * The tracking information is stored on the `derivation` object and the derivation is registered * as observer of any of the accessed observables. */ export function trackDerivedFunction(derivation: IDerivation, f: () => T, context: any) { + const prevAllowStateReads = allowStateReadsStart(true) // pre allocate array allocation + room for variation in deps // array will be trimmed by bindDependencies changeDependenciesStateTo0(derivation) @@ -181,9 +197,28 @@ export function trackDerivedFunction(derivation: IDerivation, f: () => T, con } globalState.trackingDerivation = prevTracking bindDependencies(derivation) + + warnAboutDerivationWithoutDependencies(derivation) + + allowStateReadsEnd(prevAllowStateReads) + return result } +function warnAboutDerivationWithoutDependencies(derivation: IDerivation) { + if (process.env.NODE_ENV === "production") return + + if (derivation.observing.length !== 0) return + + if (globalState.reactionRequiresObservable || derivation.requiresObservable) { + console.warn( + `[mobx] Derivation ${ + derivation.name + } is created/updated without reading any observable value` + ) + } +} + /** * diffs newObserving with observing. * update observing to be newObserving with unique observables @@ -278,6 +313,16 @@ export function untrackedEnd(prev: IDerivation | null) { globalState.trackingDerivation = prev } +export function allowStateReadsStart(allowStateReads: boolean) { + const prev = globalState.allowStateReads + globalState.allowStateReads = allowStateReads + return prev +} + +export function allowStateReadsEnd(prev: boolean) { + globalState.allowStateReads = prev +} + /** * needed to keep `lowestObserverState` correct. when changing from (2 or 1) to 0 * diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 6d87f37db..8399d8444 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -8,6 +8,9 @@ const persistentKeys: (keyof MobXGlobals)[] = [ "spyListeners", "enforceActions", "computedRequiresReaction", + "reactionRequiresObservable", + "observableRequiresReaction", + "allowStateReads", "disableErrorBoundaries", "runId", "UNCHANGED" @@ -81,6 +84,12 @@ export class MobXGlobals { */ allowStateChanges = true + /** + * Is it allowed to read observables at this point? + * Used to hold the state needed for `observableRequiresReaction` + */ + allowStateReads = true + /** * If strict mode is enabled, state changes are by default not allowed */ @@ -101,6 +110,18 @@ export class MobXGlobals { */ computedRequiresReaction = false + /** + * (Experimental) + * Warn if you try to create to derivation / reactive context without accessing any observable. + */ + reactionRequiresObservable = false + + /** + * (Experimental) + * Warn if observables are accessed outside a reactive context + */ + observableRequiresReaction = false + /** * Allows overwriting of computed properties, useful in tests but not prod as it can cause * memory leaks. See https://github.com/mobxjs/mobx/issues/1867 diff --git a/src/core/observable.ts b/src/core/observable.ts index f8ab4f7a4..6e4ffcf7c 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -7,7 +7,8 @@ import { TraceMode, getDependencyTree, globalState, - runReactions + runReactions, + checkIfStateReadsAreAllowed } from "../internal" export interface IDepTreeNode { @@ -131,6 +132,8 @@ export function endBatch() { } export function reportObserved(observable: IObservable): boolean { + checkIfStateReadsAreAllowed(observable) + const derivation = globalState.trackingDerivation if (derivation !== null) { /** @@ -151,6 +154,7 @@ export function reportObserved(observable: IObservable): boolean { } else if (observable.observers.size === 0 && globalState.inBatch > 0) { queueForUnobservation(observable) } + return false } diff --git a/src/core/reaction.ts b/src/core/reaction.ts index bfd0fcbd8..b89045b8a 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -67,7 +67,8 @@ export class Reaction implements IDerivation, IReactionPublic { constructor( public name: string = "Reaction@" + getNextId(), private onInvalidate: () => void, - private errorHandler?: (error: any, derivation: IDerivation) => void + private errorHandler?: (error: any, derivation: IDerivation) => void, + public requiresObservable = false ) {} onBecomeStale() { diff --git a/test/base/autorun.js b/test/base/autorun.js index 8b18bd7e0..65216cd2b 100644 --- a/test/base/autorun.js +++ b/test/base/autorun.js @@ -1,10 +1,14 @@ -const m = require("../../src/mobx.ts") +/** + * @type {typeof import("./../../src/mobx")} + */ +const mobx = require("../../src/mobx.ts") +const utils = require("../utils/test-utils") test("autorun passes Reaction as an argument to view function", function() { - const a = m.observable.box(1) + const a = mobx.observable.box(1) const values = [] - m.autorun(r => { + mobx.autorun(r => { expect(typeof r.dispose).toBe("function") if (a.get() === "pleaseDispose") r.dispose() values.push(a.get()) @@ -20,10 +24,10 @@ test("autorun passes Reaction as an argument to view function", function() { }) test("autorun can be disposed on first run", function() { - const a = m.observable.box(1) + const a = mobx.observable.box(1) const values = [] - m.autorun(r => { + mobx.autorun(r => { r.dispose() values.push(a.get()) }) @@ -34,9 +38,9 @@ test("autorun can be disposed on first run", function() { }) test("autorun warns when passed an action", function() { - const action = m.action(() => {}) + const action = mobx.action(() => {}) expect.assertions(1) - expect(() => m.autorun(action)).toThrowError(/Autorun does not accept actions/) + expect(() => mobx.autorun(action)).toThrowError(/Autorun does not accept actions/) }) test("autorun batches automatically", function() { @@ -44,7 +48,7 @@ test("autorun batches automatically", function() { let a1runs = 0 let a2runs = 0 - const x = m.observable({ + const x = mobx.observable({ a: 1, b: 1, c: 1, @@ -54,12 +58,12 @@ test("autorun batches automatically", function() { } }) - const d1 = m.autorun(() => { + const d1 = mobx.autorun(() => { a1runs++ x.d // read }) - const d2 = m.autorun(() => { + const d2 = mobx.autorun(() => { a2runs++ x.b = x.a x.c = x.a @@ -80,12 +84,12 @@ test("autorun batches automatically", function() { }) test("autorun tracks invalidation of unbound dependencies", function() { - const a = m.observable.box(0) - const b = m.observable.box(0) - const c = m.computed(() => a.get() + b.get()) + const a = mobx.observable.box(0) + const b = mobx.observable.box(0) + const c = mobx.computed(() => a.get() + b.get()) const values = [] - m.autorun(() => { + mobx.autorun(() => { values.push(c.get()) b.set(100) }) @@ -95,21 +99,49 @@ test("autorun tracks invalidation of unbound dependencies", function() { }) test("when effect is an action", function(done) { - const a = m.observable.box(0) + const a = mobx.observable.box(0) - m.configure({ enforceActions: "observed" }) - m.when( + mobx.configure({ enforceActions: "observed" }) + mobx.when( () => a.get() === 1, () => { a.set(2) - m.configure({ enforceActions: "never" }) + mobx.configure({ enforceActions: "never" }) done() }, { timeout: 1 } ) - m.runInAction(() => { + mobx.runInAction(() => { a.set(1) }) }) + +describe("autorun opts requiresObservable", () => { + test("warn when no observable", () => { + utils.consoleWarn(() => { + const disposer = mobx.autorun(() => 2, { + requiresObservable: true + }) + + disposer() + }, /is created\/updated without reading any observable value/) + }) + + test("Don't warn when observable", () => { + const obsr = mobx.observable({ + x: 1 + }) + + const messages = utils.supressConsole(() => { + const disposer = mobx.autorun(() => obsr.x, { + requiresObservable: true + }) + + disposer() + }) + + expect(messages.length).toBe(0) + }) +}) diff --git a/test/base/autorunAsync.js b/test/base/autorunAsync.js index 15590a376..100f2e77d 100644 --- a/test/base/autorunAsync.js +++ b/test/base/autorunAsync.js @@ -1,6 +1,11 @@ -const m = require("../../src/mobx.ts") +/** + * @type {typeof import("../../src/mobx")} + */ +const mobx = require("../../src/mobx.ts") -const { $mobx } = m +const utils = require("../utils/test-utils") + +const { $mobx } = mobx test("autorun 1", function(done) { let _fired = 0 @@ -16,24 +21,24 @@ test("autorun 1", function(done) { _cCalcs = 0 } - const a = m.observable.box(2) - const b = m.observable.box(3) - const c = m.computed(function() { + const a = mobx.observable.box(2) + const b = mobx.observable.box(3) + const c = mobx.computed(function() { _cCalcs++ return a.get() * b.get() }) - const d = m.observable.box(1) + const d = mobx.observable.box(1) const autorun = function() { _fired++ _result = d.get() > 0 ? a.get() * c.get() : d.get() } - let disp = m.autorun(autorun, { delay: 20 }) + let disp = mobx.autorun(autorun, { delay: 20 }) check(0, 0, null) disp() to(function() { check(0, 0, null) - disp = m.autorun(autorun, { delay: 20 }) + disp = mobx.autorun(autorun, { delay: 20 }) to(function() { check(1, 1, 12) @@ -82,12 +87,12 @@ test("autorun 1", function(done) { test("autorun should not result in loop", function(done) { let i = 0 - const a = m.observable({ + const a = mobx.observable({ x: i }) let autoRunsCalled = 0 - const d = m.autorun( + const d = mobx.autorun( function() { autoRunsCalled++ a.x = ++i @@ -108,11 +113,11 @@ test("autorun should not result in loop", function(done) { }) test("autorunAsync passes Reaction as an argument to view function", function(done) { - const a = m.observable.box(1) + const a = mobx.observable.box(1) let autoRunsCalled = 0 - m.autorun( + mobx.autorun( r => { expect(typeof r.dispose).toBe("function") autoRunsCalled++ @@ -133,7 +138,7 @@ test("autorunAsync passes Reaction as an argument to view function", function(do }) test("autorunAsync accepts a scheduling function", function(done) { - const a = m.observable({ + const a = mobx.observable({ x: 0, y: 1 }) @@ -141,7 +146,7 @@ test("autorunAsync accepts a scheduling function", function(done) { let autoRunsCalled = 0 let schedulingsCalled = 0 - m.autorun( + mobx.autorun( function() { autoRunsCalled++ expect(a.y).toBe(a.x + 1) @@ -172,7 +177,7 @@ test("autorunAsync accepts a scheduling function", function(done) { }) test("reaction accepts a scheduling function", function(done) { - const a = m.observable({ + const a = mobx.observable({ x: 0, y: 1 }) @@ -183,7 +188,7 @@ test("reaction accepts a scheduling function", function(done) { const values = [] - m.reaction( + mobx.reaction( () => { exprCalled++ return a.x @@ -220,26 +225,26 @@ test("reaction accepts a scheduling function", function(done) { }) test("autorunAsync warns when passed an action", function() { - const action = m.action(() => {}) + const action = mobx.action(() => {}) expect.assertions(1) - expect(() => m.autorun(action)).toThrowError(/Autorun does not accept actions/) + expect(() => mobx.autorun(action)).toThrowError(/Autorun does not accept actions/) }) test("whenWithTimeout should operate normally", done => { - const a = m.observable.box(1) + const a = mobx.observable.box(1) - m.when(() => a.get() === 2, () => done(), { + mobx.when(() => a.get() === 2, () => done(), { timeout: 500, onError: () => done.fail("error triggered") }) - setTimeout(m.action(() => a.set(2)), 200) + setTimeout(mobx.action(() => a.set(2)), 200) }) test("whenWithTimeout should timeout", done => { - const a = m.observable.box(1) + const a = mobx.observable.box(1) - m.when(() => a.get() === 2, () => done.fail("should have timed out"), { + mobx.when(() => a.get() === 2, () => done.fail("should have timed out"), { timeout: 500, onError: e => { expect("" + e).toMatch(/WHEN_TIMEOUT/) @@ -247,18 +252,18 @@ test("whenWithTimeout should timeout", done => { } }) - setTimeout(m.action(() => a.set(2)), 1000) + setTimeout(mobx.action(() => a.set(2)), 1000) }) test("whenWithTimeout should dispose", done => { - const a = m.observable.box(1) + const a = mobx.observable.box(1) - const d1 = m.when(() => a.get() === 2, () => done.fail("1 should not finsih"), { + const d1 = mobx.when(() => a.get() === 2, () => done.fail("1 should not finsih"), { timeout: 100, onError: () => done.fail("1 should not timeout") }) - const d2 = m.when(() => a.get() === 2, () => t.fail("2 should not finsih"), { + const d2 = mobx.when(() => a.get() === 2, () => t.fail("2 should not finsih"), { timeout: 200, onError: () => done.fail("2 should not timeout") }) @@ -267,10 +272,38 @@ test("whenWithTimeout should dispose", done => { d2() setTimeout( - m.action(() => { + mobx.action(() => { a.set(2) done() }), 150 ) }) + +describe("when opts requiresObservable", () => { + test("warn when no observable", () => { + utils.consoleWarn(() => { + const disposer = mobx.when(() => 2, { + requiresObservable: true + }) + + disposer.cancel() + }, /is created\/updated without reading any observable value/) + }) + + test("Don't warn when observable", () => { + const obsr = mobx.observable({ + x: 1 + }) + + const messages = utils.supressConsole(() => { + const disposer = mobx.when(() => obsr.x, { + requiresObservable: true + }) + + disposer.cancel() + }) + + expect(messages.length).toBe(0) + }) +}) diff --git a/test/base/reaction.js b/test/base/reaction.js index 3d7d7085b..1b58614e1 100644 --- a/test/base/reaction.js +++ b/test/base/reaction.js @@ -1,3 +1,6 @@ +/** + * @type {typeof import("./../../src/mobx")} + */ const mobx = require("../../src/mobx.ts") const reaction = mobx.reaction const utils = require("../utils/test-utils") @@ -613,3 +616,31 @@ test("Introduce custom onError for - when - 2", () => { expect(globalHandlerCalled).toBe(false) d() }) + +describe("reaction opts requiresObservable", () => { + test("warn when no observable", () => { + utils.consoleWarn(() => { + const disposer = mobx.reaction(() => 2, () => 1, { + requiresObservable: true + }) + + disposer() + }, /is created\/updated without reading any observable value/) + }) + + test("Don't warn when observable", () => { + const obsr = mobx.observable({ + x: 1 + }) + + const messages = utils.supressConsole(() => { + const disposer = mobx.reaction(() => obsr.x, () => 1, { + requiresObservable: true + }) + + disposer() + }) + + expect(messages.length).toBe(0) + }) +}) diff --git a/test/base/strict-mode.js b/test/base/strict-mode.js index 17bcf982e..f5840dbd6 100644 --- a/test/base/strict-mode.js +++ b/test/base/strict-mode.js @@ -1,3 +1,6 @@ +/** + * @type {typeof import("../../src/mobx")} + */ const mobx = require("../../src/mobx.ts") const utils = require("../utils/test-utils") @@ -224,7 +227,7 @@ test("enforceActions 'strict' should not throw exception while observable array } }) -test("warn on unsafe reads", function() { +test("warn on unsafe reads of computed", function() { try { mobx.configure({ computedRequiresReaction: true }) const x = mobx.observable({ @@ -241,6 +244,124 @@ test("warn on unsafe reads", function() { } }) +describe("observableRequiresReaction", function() { + test("warn on unsafe reads of observable", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + y: 3 + }) + utils.consoleWarn(() => { + x.y + }, /being read outside a reactive context/) + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) + + test("warn on unsafe reads of observable also when there are other subscriptions", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + y: 3 + }) + + const dispose = mobx.autorun(() => x.y) + + utils.consoleWarn(() => { + x.y + }, /being read outside a reactive context/) + + dispose() + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) + + test("warn on unsafe reads of observable array", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + arr: [1, 2, 3] + }) + utils.consoleWarn(() => { + x.arr[1] + }, /being read outside a reactive context/) + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) + test("don't warn on reads inside a computed", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + y: 1 + }) + + const fooComputed = mobx.computed(() => x.y + 1) + + const messages = utils.supressConsole(() => { + const dispose = mobx.autorun(() => fooComputed.get()) + dispose() + }) + + expect(messages.length).toBe(0) + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) + + test("don't warn on reads inside an action", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + y: 1 + }) + + const fooAction = mobx.action(() => x.y) + + const messages = utils.supressConsole(() => { + fooAction() + }) + + expect(messages.length).toBe(0) + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) + + test("warn on reads inside a transaction", function() { + try { + mobx.configure({ observableRequiresReaction: true }) + const x = mobx.observable({ + y: 1 + }) + + utils.consoleWarn(() => { + mobx.transaction(() => x.y) + }, /being read outside a reactive context/) + } finally { + mobx.configure({ observableRequiresReaction: false }) + } + }) +}) + +describe("reactionRequiresObservable", function() { + test("warn on reaction creation without dependencies", function() { + try { + mobx.configure({ reactionRequiresObservable: true }) + + utils.consoleWarn(() => { + const dispose = mobx.reaction(() => "plain value", newValue => newValue) + + dispose() + }, /is created\/updated without reading any observable value/) + } finally { + mobx.configure({ reactionRequiresObservable: false }) + } + }) +}) + test("#1869", function() { const x = mobx.observable.box(3) mobx.configure({ enforceActions: "always", isolateGlobalState: true }) From b1a30f5a0b93be71407c33100dda90332a26dd6c Mon Sep 17 00:00:00 2001 From: Bnaya Peretz Date: Mon, 19 Aug 2019 19:20:49 +0300 Subject: [PATCH 0137/1043] docs: Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c9e117ae..6cb135243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 5.14.0 / 4.14.0 + +* Added experimental `reactionRequiresObservable` & `observableRequiresReaction` config [#2079](https://github.com/mobxjs/mobx/pull/2079), [Docs](https://github.com/mobxjs/mobx/pull/2082) +* Added experimental `requiresObservable` config to `reaction`, `autorun` & `when` options [#2079](https://github.com/mobxjs/mobx/pull/2079), [Docs](https://github.com/mobxjs/mobx/pull/2082) + # 5.13.1 / 4.13.1 * Don't use `global` and `self` keywords unless defined. Fixes [#2070](https://github.com/mobxjs/mobx/issues/2070). From d73a0e8915d708c2d97a347a14b6d67f733aaf65 Mon Sep 17 00:00:00 2001 From: Bnaya Peretz Date: Mon, 30 Sep 2019 15:54:00 +0300 Subject: [PATCH 0138/1043] docs: polish/add flowtype for requiresObservable --- flow-typed/mobx.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index d1a423185..f5c7b0fdb 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -5,7 +5,15 @@ export type IObservableMapInitialValues = IMapEntries | KeyValueMap< export interface IMobxConfigurationOptions { +enforceActions?: boolean | "strict" | "never" | "always" | "observed"; computedRequiresReaction?: boolean; + /** + * (Experimental) + * Warn if you try to create to derivation / reactive context without accessing any observable. + */ reactionRequiresObservable?: boolean; + /** + * (Experimental) + * Warn if observables are accessed outside a reactive context + */ observableRequiresReaction?: boolean; isolateGlobalState?: boolean; disableErrorBoundaries?: boolean; @@ -338,6 +346,10 @@ export interface IWhenOptions { name?: string; timeout?: number; onError?: (error: any) => void; + /** + * warn if the derivation has no dependencies after creation/update + */ + requiresObservable?: boolean; } declare export function when( From 55ff676c0405780754169bb18afd365ef4a88b5a Mon Sep 17 00:00:00 2001 From: devendra-synerzip <44597996+devendra-synerzip@users.noreply.github.com> Date: Tue, 1 Oct 2019 13:05:54 +0530 Subject: [PATCH 0139/1043] Update sponsors.md (#2132) --- sponsors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sponsors.md b/sponsors.md index f2f1a3add..a3d776952 100644 --- a/sponsors.md +++ b/sponsors.md @@ -3,8 +3,8 @@ MobX Sponsors This is the list of individual or one time contributions! -Our montly donors can be found on open collective https://opencollective.com/mobx#contributors! -Montly donations can be done through https://opencollective.com/mobx. +Our monthly donors can be found on open collective https://opencollective.com/mobx#contributors! +Monthly donations can be done through https://opencollective.com/mobx. Want to make a one-time contribution? https://mobxjs.github.io/mobx/donate.html From a827df04733f5faa07f32075b3ff86a61ad4fca1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 2 Oct 2019 13:39:08 +0100 Subject: [PATCH 0140/1043] Published version 5.14.0 --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fbfcdc232..bed0a7762 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "5.13.1", + "version": "5.14.0", "description": "Simple, scalable state management.", "main": "lib/mobx.js", "umd:main": "lib/mobx.umd.js", diff --git a/yarn.lock b/yarn.lock index f22ba6a70..b75206e0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8639,7 +8639,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.0.0, yargs-parser@^13.1.0: +yargs-parser@^13.1.0: version "13.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== From 568a4a887c0e67196f0fe9200cb02be255b79d50 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 2 Oct 2019 13:54:21 +0100 Subject: [PATCH 0141/1043] Add convenience commands to package.json --- package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2e7f9b3ae..d725c3e86 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,10 @@ "small-build": "node scripts/build.js", "lint": "eslint src/**/*.ts", "size": "size-limit", - "publish-script": "node scripts/publish.js" + "publish-script": "node scripts/publish.js", + "docs:build": "yarn --cwd website build", + "docs:start": "yarn --cwd website start", + "postinstall": "yarn --cwd website install" }, "repository": { "type": "git", @@ -130,4 +133,4 @@ "pre-commit": "lint-staged" } } -} \ No newline at end of file +} From 85a33fba00becd7464a10d42b7d52edcfc98d718 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 4 Oct 2019 11:13:54 -0500 Subject: [PATCH 0142/1043] docs: merge upstream docs changes - merge https://github.com/mobxjs/mobx/pull/2082 (#2082) --- docs/refguide/api.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 040b5f5ad..5d4c30477 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -354,6 +354,7 @@ Returns a disposer function to cancel the side effect. - **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. - **`onError?: (error) => void`**: error handler that will be triggered if the autorun function throws an exception - **`scheduler?: (callback) => void`**: Set a custom scheduler to determine how re-running the autorun function should be scheduled +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the autorun ### `when` @@ -373,6 +374,7 @@ If no effect function is passed to `when`, it will return a promise that can be - **`name?: string`**: A name for easier identification and debugging - **`onError?: (error) => void`**: error handler that will be triggered if the _predicate-function_ or the _effect-function_ throws an exception - **`timeout: number`** a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the when ### `reaction` Usage: `reaction(() => data, data => { sideEffect }, options)`. @@ -388,6 +390,7 @@ The side effect can be debounced, just like `autorunAsync`. - **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. - **`equals`**: Custom equality function to determine whether the expr function differed from it's previous result, and hence should fire effect. Accepts the same options as the equals option of `computed`. - Also accepts all of the options from [`autorun`](#autorun) +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the reaction ### `onReactionError` @@ -525,6 +528,22 @@ Use this if you want to check whether you are using computed properties without configure({ computedRequiresReaction: true }); ``` +#### `observableRequiresReaction: boolean` +Warns about any unobserved observable access. +Use this if you want to check whether you are using observables without a reactive context (eg not inside an autorun, action, or react component without observer wrapping). + +```javascript +configure({ observableRequiresReaction: true }); +``` + +#### `reactionRequiresObservable: boolean` +Warns when a reaction (eg `autorun`) is created without any observable access. +Use this to check whether you are unneededly wrapping react components with `observer`, or to find possible related bugs. + +```javascript +configure({ reactionRequiresObservable: true }); +``` + #### `computedConfigurable: boolean` Allows overwriting computed values. This is useful for testing purposes *only*. Don't enable this on production as it can cause memory-leaks. From 72062e8ad936cff0b2952bc188b5f0f7d914cec6 Mon Sep 17 00:00:00 2001 From: Christopher Loverich Date: Fri, 4 Oct 2019 11:20:58 -0500 Subject: [PATCH 0143/1043] docs: make readme the docs landing page - delete the docusaurus default landing page, and instead re-direct users to the first documentation page - https://docusaurus.io/docs/en/site-creation#docs-landing-page --- website/pages/en/index.js | 202 -------------------------------------- website/static/index.html | 14 +++ 2 files changed, 14 insertions(+), 202 deletions(-) delete mode 100755 website/pages/en/index.js create mode 100644 website/static/index.html diff --git a/website/pages/en/index.js b/website/pages/en/index.js deleted file mode 100755 index 05c48e452..000000000 --- a/website/pages/en/index.js +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Copyright (c) 2017-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -const React = require('react'); - -const CompLibrary = require('../../core/CompLibrary.js'); - -const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */ -const Container = CompLibrary.Container; -const GridBlock = CompLibrary.GridBlock; - -class HomeSplash extends React.Component { - render() { - const { siteConfig, language = '' } = this.props; - const { baseUrl, docsUrl } = siteConfig; - const docsPart = `${docsUrl ? `${docsUrl}/` : ''}`; - const langPart = `${language ? `${language}/` : ''}`; - const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`; - - const SplashContainer = props => ( -
    -
    -
    {props.children}
    -
    -
    - ); - - const Logo = props => ( -
    - Project Logo -
    - ); - - const ProjectTitle = () => ( -

    - {siteConfig.title} - {siteConfig.tagline} -

    - ); - - const PromoSection = props => ( -
    -
    -
    {props.children}
    -
    -
    - ); - - const Button = props => ( - - ); - - return ( - -
    - - - - - -
    -
    - ); - } -} - -class Index extends React.Component { - render() { - const { config: siteConfig, language = '' } = this.props; - const { baseUrl } = siteConfig; - - const Block = props => ( - - - - ); - - const FeatureCallout = () => ( -
    -

    Feature Callout

    - These are features of this project -
    - ); - - const TryOut = () => ( - - {[ - { - content: - 'To make your landing page more attractive, use illustrations! Check out ' + - '[**unDraw**](https://undraw.co/) which provides you with customizable illustrations which are free to use. ' + - 'The illustrations you see on this page are from unDraw.', - image: `${baseUrl}img/undraw_code_review.svg`, - imageAlign: 'left', - title: 'Wonderful SVG Illustrations', - }, - ]} - - ); - - const Description = () => ( - - {[ - { - content: - 'This is another description of how this project is useful', - image: `${baseUrl}img/undraw_note_list.svg`, - imageAlign: 'right', - title: 'Description', - }, - ]} - - ); - - const LearnHow = () => ( - - {[ - { - content: - 'Each new Docusaurus project has **randomly-generated** theme colors.', - image: `${baseUrl}img/undraw_youtube_tutorial.svg`, - imageAlign: 'right', - title: 'Randomly Generated Theme Colors', - }, - ]} - - ); - - const Features = () => ( - - {[ - { - content: 'This is the content of my feature', - image: `${baseUrl}img/undraw_react.svg`, - imageAlign: 'top', - title: 'Feature One', - }, - { - content: 'The content of my second feature', - image: `${baseUrl}img/undraw_operating_system.svg`, - imageAlign: 'top', - title: 'Feature Two', - }, - ]} - - ); - - const Showcase = () => { - if ((siteConfig.users || []).length === 0) { - return null; - } - - const showcase = siteConfig.users - .filter(user => user.pinned) - .map(user => ( - - {user.caption} - - )); - - const pageUrl = page => baseUrl + (language ? `${language}/` : '') + page; - - return ( -
    -

    Who is Using This?

    -

    This project is used by all these people

    -
    {showcase}
    - -
    - ); - }; - - return ( -
    - -
    - ); - } -} - -module.exports = Index; diff --git a/website/static/index.html b/website/static/index.html new file mode 100644 index 000000000..5a0f92f87 --- /dev/null +++ b/website/static/index.html @@ -0,0 +1,14 @@ + + + + + + + Your Site Title Here + + + If you are not redirected automatically, follow this link. + + From c3b4254648a6e66e7ecd508f9b25c2efae68a9e5 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 5 Oct 2019 23:46:42 +0100 Subject: [PATCH 0144/1043] Fixed site config to work on mobx.js.org, with urls compatible with old site --- package.json | 1 + scripts/publish.js | 5 ++ website/siteConfig.js | 167 +++++++++++++++++++------------------- website/static/index.html | 8 +- 4 files changed, 93 insertions(+), 88 deletions(-) diff --git a/package.json b/package.json index ff63ba7be..0f55b708d 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "publish-script": "node scripts/publish.js", "docs:build": "yarn --cwd website build", "docs:start": "yarn --cwd website start", + "docs:publish": "yarn --cwd website publish-gh-pages", "postinstall": "yarn --cwd website install", "dedup": "npx yarn-deduplicate -s fewer yarn.lock" }, diff --git a/scripts/publish.js b/scripts/publish.js index e60c996e0..8aa16564c 100755 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -35,6 +35,10 @@ async function prompt(question, defaultValue) { } async function main() { + const gitUser = + process.env.GIT_USER || + (await prompt("Please enter the github user to publish the docs with")) + // build run("npm run small-build") @@ -75,6 +79,7 @@ async function main() { run("git push") run("git push --tags") + run(`GIT_USER=${gitUser} USE_SSH=true yarn docs:publish`) console.log("Published!") exit(0) } else { diff --git a/website/siteConfig.js b/website/siteConfig.js index 2283c3421..b5158a52e 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -10,64 +10,63 @@ // List of projects/orgs using your project for the users page. const users = [ - { - caption: "User1", - // You will need to prepend the image path with your baseUrl - // if it is not '/', like: '/test-site/img/image.jpg'. - image: "/img/undraw_open_source.svg", - infoLink: "https://www.facebook.com", - pinned: true - } + { + caption: "User1", + // You will need to prepend the image path with your baseUrl + // if it is not '/', like: '/test-site/img/image.jpg'. + image: "/img/undraw_open_source.svg", + infoLink: "https://www.facebook.com", + pinned: true + } ] const siteConfig = { - title: "MobX", // Title for your website. - tagline: "Simple, scalable state management", - - // For github.io type URLs, you would set the url and baseUrl like: - // url: 'https://facebook.github.io', - // baseUrl: '/test-site/', - url: "https://mobx-docs.netlify.com/", // Your website URL - baseUrl: "/", // Base URL for your project */ - // Used for publishing and more - - projectName: "mobx", - organizationName: "mobxjs", - - - // URL for editing docs, usage example: editUrl + 'en/doc1.md'. - // If this field is omitted, there will be no "Edit this Doc" button - // for each document. - editUrl: 'https://github.com/mobxjs/mobx/edit/master/docs/', - - - - // For top-level user or org sites, the organization is still the same. - // e.g., for the https://JoelMarcey.github.io site, it would be set like... - // organizationName: 'JoelMarcey' - - // For no header links in the top nav bar -> headerLinks: [], - headerLinks: [ - { doc: "intro/concepts", label: "Documentation" }, - { href: "https://github.com/mobxjs/mobx", label: "Github" }, - ], - - // If you have users set above, you add it here: - users, - - /* path to images for header/footer */ - headerIcon: "img/mobx.png", - footerIcon: "img/mobx.png", - favicon: "img/favicon.png", - - /* Colors for website */ - colors: { - primaryColor: "#035193", - secondaryColor: "#023866" - }, - - /* Custom fonts for website */ - /* + title: "MobX", // Title for your website. + tagline: "Simple, scalable state management", + + // For github.io type URLs, you would set the url and baseUrl like: + // url: 'https://facebook.github.io', + // baseUrl: '/test-site/', + url: "https://mobx.js.org/", // Your website URL + baseUrl: "/", // Base URL for your project */ + docsUrl: "", // trim 'docs/ prefix + cname: "mobx.js.org", // needed for github pages to work under a domain + // Used for publishing and more + + projectName: "mobx", + organizationName: "mobxjs", + + // URL for editing docs, usage example: editUrl + 'en/doc1.md'. + // If this field is omitted, there will be no "Edit this Doc" button + // for each document. + editUrl: "https://github.com/mobxjs/mobx/edit/master/docs/", + + // For top-level user or org sites, the organization is still the same. + // e.g., for the https://JoelMarcey.github.io site, it would be set like... + // organizationName: 'JoelMarcey' + + // For no header links in the top nav bar -> headerLinks: [], + headerLinks: [ + { doc: "intro/concepts", label: "Documentation" }, + { href: "https://github.com/mobxjs/mobx", label: "Github" } + ], + + // If you have users set above, you add it here: + users, + + /* path to images for header/footer */ + headerIcon: "img/mobx.png", + footerIcon: "img/mobx.png", + favicon: "img/favicon.png", + + /* Colors for website */ + colors: { + primaryColor: "#035193", + secondaryColor: "#023866" + }, + + /* Custom fonts for website */ + /* fonts: { myFont: [ "Times New Roman", @@ -80,43 +79,43 @@ myOtherFont: [ }, */ - // This copyright info is used in /core/Footer.js and blog RSS/Atom feeds. - copyright: `Copyright © ${new Date().getFullYear()} Your Name or Your Company Name`, + // This copyright info is used in /core/Footer.js and blog RSS/Atom feeds. + copyright: `Copyright © ${new Date().getFullYear()} Your Name or Your Company Name`, - highlight: { - // Highlight.js theme to use for syntax highlighting in code blocks. - theme: "default" - }, + highlight: { + // Highlight.js theme to use for syntax highlighting in code blocks. + theme: "default" + }, - // Add custom scripts here that would be placed in - Your Site Title Here + MobX - If you are not redirected automatically, follow this link. + If you are not redirected automatically, follow this link. From 59ce31a5953fed2f3a242e853c8454ec35270e9f Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 5 Oct 2019 23:53:31 +0100 Subject: [PATCH 0145/1043] Don't run CI on gh-pages branch --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a0b6dddef..7e8761059 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -114,6 +114,9 @@ jobs: workflows: version: 2 build-and-test: + branches: + ignore: + - gh-pages jobs: - build From 1a77b959dde0ca629e61dd1e4bc10535e8806610 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 5 Oct 2019 23:58:22 +0100 Subject: [PATCH 0146/1043] Fixed CI config (?) --- .circleci/config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e8761059..f1bfdf810 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -114,12 +114,12 @@ jobs: workflows: version: 2 build-and-test: - branches: - ignore: - - gh-pages jobs: - - build - + - build: + filters: + branches: + ignore: + - gh-pages - test-all: requires: - build From a38376287c997d9b670479d2427a03e08d46c277 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 6 Oct 2019 00:05:56 +0100 Subject: [PATCH 0147/1043] Removed notion of `gh-pages` branch --- PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md index b7bba3813..050b1debb 100644 --- a/PULL_REQUEST_TEMPLATE.md +++ b/PULL_REQUEST_TEMPLATE.md @@ -5,7 +5,7 @@ PR checklist: * [ ] Added unit tests * [ ] Updated changelog -* [ ] Updated docs (either in the description of this PR as markdown, or as separate PR on the `gh-pages` branch. Please refer to this PR). For new functionality, at least [API.md](https://github.com/mobxjs/mobx/blob/gh-pages/docs/refguide/api.md) should be updated +* [ ] Updated `/docs`. For new functionality, at least `API.md` should be updated * [ ] Added typescript typings * [ ] Verified that there is no significant performance drop (`npm run perf`) From a480b9cab8ca0ef964464dea5891c4697e99486d Mon Sep 17 00:00:00 2001 From: Dmitriy Khabarov Date: Mon, 7 Oct 2019 19:56:37 +0300 Subject: [PATCH 0148/1043] Fix dead links in docs about Action (#2138) --- docs/refguide/action.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index fb08c450f..418a773ab 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -37,9 +37,9 @@ This makes sure intermediate or incomplete values produced during an action are It is advised to use `(@)action` on any function that modifies observables or has side effects. `action` also provides useful debugging information in combination with the devtools. -Using the `@action` decorator with setters (i.e. `@action set propertyName`) is not supported; however, setters of [computed properties are automatically actions](https://github.com/mobxjs/mobx/blob/gh-pages/docs/refguide/computed-decorator.md#setters-for-computed-values). +Using the `@action` decorator with setters (i.e. `@action set propertyName`) is not supported; however, setters of [computed properties are automatically actions](computed-decorator.md). -Note: using `action` is mandatory when MobX is configured to require actions to make state changes, see [`enforceActions`](https://github.com/mobxjs/mobx/blob/gh-pages/docs/refguide/api.md#configure). +Note: using `action` is mandatory when MobX is configured to require actions to make state changes, see [`enforceActions`](api.md#configure). ## When to use actions? @@ -47,7 +47,7 @@ Actions should only, and always, be used on functions that _modify_ state. Functions that just perform look-ups, filters etc should _not_ be marked as actions; to allow MobX to track their invocations. -["enforce actions"](https://github.com/mobxjs/mobx/blob/gh-pages/docs/refguide/api.md#configure) enforces that all state modifications are done by an action. This is a useful best practice in larger, long term code bases. +["enforce actions"](api.md#configure) enforces that all state modifications are done by an action. This is a useful best practice in larger, long term code bases. ## Bound actions From 2fe7ed1bc2b65db7c548e022382ba8845d620323 Mon Sep 17 00:00:00 2001 From: Benno Daenen Date: Tue, 8 Oct 2019 17:43:16 +0200 Subject: [PATCH 0149/1043] Fixed a typo in the OrderLine example (#2141) --- docs/best/pitfalls.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 3343c49d6..7c48da2cf 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -147,7 +147,7 @@ Example: ```javascript const VAT = observable(1.20) -class OrderLIne { +class OrderLine { @observable price = 10; @observable amount = 1; constructor() { From 2b6f301a743f7ad259952f2130883969ad0a43d2 Mon Sep 17 00:00:00 2001 From: Daniel K Date: Wed, 9 Oct 2019 08:17:51 +0200 Subject: [PATCH 0150/1043] Prettier docs (#2143) --- docs/LINKS.md | 36 +-- docs/README.md | 135 ++++----- docs/best/actions.md | 243 ++++++++-------- docs/best/decorators.md | 95 ++++--- docs/best/devtools.md | 2 +- docs/best/pitfalls.md | 99 ++++--- docs/best/react-performance.md | 26 +- docs/best/react.md | 142 +++++----- docs/best/stateless-HMR.md | 44 ++- docs/best/store.md | 208 +++++++------- docs/best/trace.md | 1 + docs/faq/faq.md | 5 +- docs/intro/concepts.md | 48 ++-- docs/intro/overview.md | 33 ++- docs/refguide/action.md | 29 +- docs/refguide/api.md | 392 ++++++++++++++------------ docs/refguide/array.md | 55 ++-- docs/refguide/autorun.md | 71 +++-- docs/refguide/boxed.md | 22 +- docs/refguide/computed-decorator.md | 75 +++-- docs/refguide/create-transformer.md | 36 +-- docs/refguide/expr.md | 11 +- docs/refguide/extend-observable.md | 39 +-- docs/refguide/extending.md | 91 +++--- docs/refguide/map.md | 35 +-- docs/refguide/mobx-utils.md | 1 - docs/refguide/modifiers.md | 93 +++--- docs/refguide/object-api.md | 20 +- docs/refguide/object.md | 60 ++-- docs/refguide/observable-decorator.md | 10 +- docs/refguide/observable.md | 43 +-- docs/refguide/observe.md | 132 ++++----- docs/refguide/observer-component.md | 47 ++- docs/refguide/reaction.md | 49 ++-- docs/refguide/spy.md | 40 +-- docs/refguide/tojson.md | 16 +- docs/refguide/when.md | 33 +-- package.json | 4 +- src/api/object-api.ts | 4 +- src/api/observable.ts | 16 +- website/core/Footer.js | 177 ++++++------ 41 files changed, 1401 insertions(+), 1317 deletions(-) diff --git a/docs/LINKS.md b/docs/LINKS.md index 5e3cc5739..3ac6232f3 100644 --- a/docs/LINKS.md +++ b/docs/LINKS.md @@ -2,32 +2,32 @@ # Resources -* [Ten minute interactive introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html#demo) -* How MobX works: [In depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.wnlo6bw8y) -* Clone the boilerplate repository containing the above example from: https://github.com/mweststrate/react-mobservable-boilerplate. -* Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). +- [Ten minute interactive introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html#demo) +- How MobX works: [In depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.wnlo6bw8y) +- Clone the boilerplate repository containing the above example from: https://github.com/mweststrate/react-mobservable-boilerplate. +- Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). ## Related projects -* [mobx-connect](https://github.com/nightwolfz/mobx-connect) MobX @connect decorator for react components. Similar to redux's @connect. -* [rfx-stack](https://github.com/foxhound87/rfx-stack) RFX Stack - Universal App featuring: React + Feathers + MobX -* [mobx-reactor](https://github.com/amsb/mobx-reactor) Connect MobX data stores to functional stateless React components with async actions and unidirectional data flow. -* [mobx-model](https://github.com/ikido/mobx-model) Simplify mobx data stores that mimic backend models -* [rx-mobx](https://github.com/chicoxyzzy/rx-mobx) Convert Mobx observables to RxJS and vice versa +- [mobx-connect](https://github.com/nightwolfz/mobx-connect) MobX @connect decorator for react components. Similar to redux's @connect. +- [rfx-stack](https://github.com/foxhound87/rfx-stack) RFX Stack - Universal App featuring: React + Feathers + MobX +- [mobx-reactor](https://github.com/amsb/mobx-reactor) Connect MobX data stores to functional stateless React components with async actions and unidirectional data flow. +- [mobx-model](https://github.com/ikido/mobx-model) Simplify mobx data stores that mimic backend models +- [rx-mobx](https://github.com/chicoxyzzy/rx-mobx) Convert Mobx observables to RxJS and vice versa ## More examples A nice list is WIP, but see this [github issue](https://github.com/mobxjs/mobx/issues/104) for a list of example projects, including routing, authorization, server side rendering etc. -* [TodoMVC using MobX and React](https://github.com/mweststrate/mobx-todomvc) -* The [ports of the _Notes_ and _Kanban_ examples](https://github.com/survivejs/mobservable-demo) from the book "SurviveJS - Webpack and React" to mobservable. -* A simple webshop using [React + mobx](https://jsfiddle.net/mweststrate/46vL0phw) or [JQuery + mobx](http://jsfiddle.net/mweststrate/vxn7qgdw). -* [Simple timer](https://jsfiddle.net/mweststrate/wgbe4guu/) application in JSFiddle. -* [Simple ES5 MobX examples](https://github.com/mattruby/mobx-examples) Bite sized MobX examples all setup to run in jsFiddle. +- [TodoMVC using MobX and React](https://github.com/mweststrate/mobx-todomvc) +- The [ports of the _Notes_ and _Kanban_ examples](https://github.com/survivejs/mobservable-demo) from the book "SurviveJS - Webpack and React" to mobservable. +- A simple webshop using [React + mobx](https://jsfiddle.net/mweststrate/46vL0phw) or [JQuery + mobx](http://jsfiddle.net/mweststrate/vxn7qgdw). +- [Simple timer](https://jsfiddle.net/mweststrate/wgbe4guu/) application in JSFiddle. +- [Simple ES5 MobX examples](https://github.com/mattruby/mobx-examples) Bite sized MobX examples all setup to run in jsFiddle. ## Philosophy -* [Making React reactive: the pursuit of high performing, easily maintainable React apps](https://www.mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/) -* [SurviveJS interview on Mobservable, React and Flux](http://survivejs.com/blog/mobservable-interview/) -* [Pure rendering in the light of time and state](https://medium.com/@mweststrate/pure-rendering-in-the-light-of-time-and-state-4b537d8d40b1) -* [Official homepage](http://mobxjs.github.io/mobx/) +- [Making React reactive: the pursuit of high performing, easily maintainable React apps](https://www.mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/) +- [SurviveJS interview on Mobservable, React and Flux](http://survivejs.com/blog/mobservable-interview/) +- [Pure rendering in the light of time and state](https://medium.com/@mweststrate/pure-rendering-in-the-light-of-time-and-state-4b537d8d40b1) +- [Official homepage](http://mobxjs.github.io/mobx/) diff --git a/docs/README.md b/docs/README.md index 797c5a8be..9278da605 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,40 +39,39 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo Algolia talentplot - # Installation -- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. -- CDN: +- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. +- CDN: -* https://unpkg.com/mobx/lib/mobx.umd.js -* https://cdnjs.com/libraries/mobx +* https://unpkg.com/mobx/lib/mobx.umd.js +* https://cdnjs.com/libraries/mobx # Browser support -- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). -- MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). +- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). It will throw an error on startup on older environments such as IE11, Node.js <6 or React Native Android on old JavaScriptCore [how-to-upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app). +- MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). _Tip: the main entry point of the MobX 5 package ships with ES5 code for backward compatibility with all build tools. But since MobX 5 runs only on modern browsers anyway, consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ ## Translations -- [中文](http://cn.mobx.js.org) +- [中文](http://cn.mobx.js.org) ## Getting started -- egghead.io course -- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -- Videos: - - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -- [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) -- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) +- egghead.io course +- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) +- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- Videos: + - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +- [Boilerplates and related projects](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) ## Introduction @@ -104,9 +103,9 @@ This can simply be done by annotating your class properties with the [@observabl import { observable } from "mobx" class Todo { - id = Math.random() - @observable title = "" - @observable finished = false + id = Math.random() + @observable title = "" + @observable finished = false } ``` @@ -122,13 +121,13 @@ Many MobX users do prefer the decorator syntax though, as it is slightly more co import { decorate, observable } from "mobx" class Todo { - id = Math.random() - title = "" - finished = false + id = Math.random() + title = "" + finished = false } decorate(Todo, { - title: observable, - finished: observable + title: observable, + finished: observable }) ``` @@ -141,10 +140,10 @@ By using the [`@computed`](http://mobxjs.github.io/mobx/refguide/computed-decora ```javascript class TodoList { - @observable todos = [] - @computed get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } + @observable todos = [] + @computed get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } } ``` @@ -171,25 +170,29 @@ import { observer } from "mobx-react" @observer class TodoListView extends Component { - render() { - return ( -
    -
      - {this.props.todoList.todos.map(todo => ( - - ))} -
    - Tasks left: {this.props.todoList.unfinishedTodoCount} -
    - ) - } + render() { + return ( +
    +
      + {this.props.todoList.todos.map(todo => ( + + ))} +
    + Tasks left: {this.props.todoList.unfinishedTodoCount} +
    + ) + } } const TodoView = observer(({ todo }) => ( -
  • - (todo.finished = !todo.finished)} /> - {todo.title} -
  • +
  • + (todo.finished = !todo.finished)} + /> + {todo.title} +
  • )) const store = new TodoList() @@ -210,7 +213,7 @@ For example the following `autorun` prints a log message each time the amount of ```javascript autorun(() => { - console.log("Tasks left: " + todos.unfinishedTodoCount) + console.log("Tasks left: " + todos.unfinishedTodoCount) }) ``` @@ -228,9 +231,9 @@ For an in-depth explanation about how MobX determines to which observables needs Unlike many flux frameworks, MobX is unopinionated about how user events should be handled. -- This can be done in a Flux like manner. -- Or by processing events using RxJS. -- Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. +- This can be done in a Flux like manner. +- Or by processing events using RxJS. +- Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. In the end it all boils down to: Somehow the state should be updated. @@ -299,12 +302,12 @@ And finally kudos for all the people that believed in, tried, validated and even ## Further resources and documentation -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) -- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -- [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) -- [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) -- [Related projects](http://mobxjs.github.io/mobx/faq/related.html) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) +- [MobX homepage](http://mobxjs.github.io/mobx/faq/blogs.html) +- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) +- [Tutorials, Blogs & Videos](http://mobxjs.github.io/mobx/faq/blogs.html) +- [Boilerplates](http://mobxjs.github.io/mobx/faq/boilerplates.html) +- [Related projects](http://mobxjs.github.io/mobx/faq/related.html) ## What others are saying... @@ -322,9 +325,9 @@ And finally kudos for all the people that believed in, tried, validated and even ## Contributing -- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -- Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. -- Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. +- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. +- Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. +- Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. # MobX 4 vs MobX 5 @@ -332,8 +335,8 @@ The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do p The most noteable limitations of MobX 4: -- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. -- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. +- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. +- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). @@ -343,9 +346,9 @@ MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-t To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js) shipped with MobX: -- In `.flowconfig`, you **cannot** ignore `node_modules`. -- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). +- In `.flowconfig`, you **cannot** ignore `node_modules`. +- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. +- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). ## Donating diff --git a/docs/best/actions.md b/docs/best/actions.md index 8645b9cec..203b17b94 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -4,8 +4,8 @@ title: Writing asynchronous actions hide_title: true --- - # Writing asynchronous actions +
    The `action` wrapper / decorator only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! @@ -18,24 +18,24 @@ Let's start with a basic example: mobx.configure({ enforceActions: "observed" }) // don't allow state modifications outside actions class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - @action - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - projects => { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - }, - error => { - this.state = "error" - } - ) - } + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + projects => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + }, + error => { + this.state = "error" + } + ) + } } ``` @@ -47,27 +47,27 @@ A first simple fix is to extract the callbacks to actions. (Note that binding us mobx.configure({ enforceActions: "observed" }) class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - @action - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then(this.fetchProjectsSuccess, this.fetchProjectsError) - } - - @action.bound - fetchProjectsSuccess(projects) { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - } - - @action.bound - fetchProjectsError(error) { - this.state = "error" - } + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then(this.fetchProjectsSuccess, this.fetchProjectsError) + } + + @action.bound + fetchProjectsSuccess(projects) { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + } + + @action.bound + fetchProjectsError(error) { + this.state = "error" + } } ``` @@ -77,26 +77,26 @@ Although this is clean and explicit, it might get a bit verbose with complex asy mobx.configure({ enforceActions: "observed" }) class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - @action - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - // inline created action - action("fetchSuccess", projects => { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - }), - // inline created action - action("fetchError", error => { - this.state = "error" - }) - ) - } + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + // inline created action + action("fetchSuccess", projects => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + }), + // inline created action + action("fetchError", error => { + this.state = "error" + }) + ) + } } ``` @@ -110,30 +110,30 @@ The advantage of this pattern is that it encourages you to not litter the place mobx.configure({ enforceActions: "observed" }) class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - @action - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - projects => { - const filteredProjects = somePreprocessing(projects) - // put the 'final' modification in an anonymous action - runInAction(() => { - this.githubProjects = filteredProjects - this.state = "done" - }) - }, - error => { - // the alternative ending of this process:... - runInAction(() => { - this.state = "error" - }) - } - ) - } + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + projects => { + const filteredProjects = somePreprocessing(projects) + // put the 'final' modification in an anonymous action + runInAction(() => { + this.githubProjects = filteredProjects + this.state = "done" + }) + }, + error => { + // the alternative ending of this process:... + runInAction(() => { + this.state = "error" + }) + } + ) + } } ``` @@ -152,27 +152,27 @@ This is where `runInAction` comes in handy again: mobx.configure({ enforceActions: "observed" }) class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - @action - async fetchProjects() { - this.githubProjects = [] - this.state = "pending" - try { - const projects = await fetchGithubProjectsSomehow() - const filteredProjects = somePreprocessing(projects) - // after await, modifying state again, needs an actions: - runInAction(() => { - this.state = "done" - this.githubProjects = filteredProjects - }) - } catch (error) { - runInAction(() => { - this.state = "error" - }) - } - } + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" + + @action + async fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = await fetchGithubProjectsSomehow() + const filteredProjects = somePreprocessing(projects) + // after await, modifying state again, needs an actions: + runInAction(() => { + this.state = "done" + this.githubProjects = filteredProjects + }) + } catch (error) { + runInAction(() => { + this.state = "error" + }) + } + } } ``` @@ -188,22 +188,23 @@ The advantage of `flow` is that it is syntactically very close to async / await mobx.configure({ enforceActions: "observed" }) class Store { - @observable githubProjects = [] - @observable state = "pending" - - fetchProjects = flow(function * () { // <- note the star, this a generator function! - this.githubProjects = [] - this.state = "pending" - try { - const projects = yield fetchGithubProjectsSomehow() // yield instead of await - const filteredProjects = somePreprocessing(projects) - // the asynchronous blocks will automatically be wrapped in actions and can modify state - this.state = "done" - this.githubProjects = filteredProjects - } catch (error) { - this.state = "error" - } - }) + @observable githubProjects = [] + @observable state = "pending" + + fetchProjects = flow(function*() { + // <- note the star, this a generator function! + this.githubProjects = [] + this.state = "pending" + try { + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) + // the asynchronous blocks will automatically be wrapped in actions and can modify state + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + }) } ``` diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 28188ee7d..43e29016b 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -4,21 +4,21 @@ title: How to (not) use decorators hide_title: true --- - # How to (not) use decorators +
    Using ES.next decorators in MobX is optional. This section explains how to use them, or how to avoid them. Advantages of using decorator syntax: -* Minimizes boilerplate, declarative. -* Easy to use and read. A majority of the MobX users use them. +- Minimizes boilerplate, declarative. +- Easy to use and read. A majority of the MobX users use them. Disadvantages of using decorator syntax: -* Stage-2 ES.next feature -* Requires a little setup and transpilation, only supported with Babel / Typescript transpilation so far +- Stage-2 ES.next feature +- Requires a little setup and transpilation, only supported with Babel / Typescript transpilation so far You can approach using decorators in two ways in MobX @@ -28,47 +28,47 @@ You can approach using decorators in two ways in MobX Using decorator syntax: ```javascript -import { observable, computed, action } from "mobx"; +import { observable, computed, action } from "mobx" class Timer { - @observable start = Date.now(); - @observable current = Date.now(); - - @computed - get elapsedTime() { - return this.current - this.start + "milliseconds"; - } - - @action - tick() { - this.current = Date.now(); - } + @observable start = Date.now() + @observable current = Date.now() + + @computed + get elapsedTime() { + return this.current - this.start + "milliseconds" + } + + @action + tick() { + this.current = Date.now() + } } ``` Using the `decorate` utility: ```javascript -import { observable, computed, action, decorate } from "mobx"; +import { observable, computed, action, decorate } from "mobx" class Timer { - start = Date.now(); - current = Date.now(); + start = Date.now() + current = Date.now() - get elapsedTime() { - return this.current - this.start + "milliseconds"; - } + get elapsedTime() { + return this.current - this.start + "milliseconds" + } - tick() { - this.current = Date.now(); - } + tick() { + this.current = Date.now() + } } decorate(Timer, { - start: observable, - current: observable, - elapsedTime: computed, - tick: action -}); + start: observable, + current: observable, + elapsedTime: computed, + tick: action +}) ``` For applying multiple decorators on a single property, you can pass an array of decorators. The decorators application order is from right to left. @@ -76,18 +76,19 @@ For applying multiple decorators on a single property, you can pass an array of ```javascript import { decorate, observable } from "mobx" import { serializable, primitive } from "serializr" -import persist from "mobx-persist"; +import persist from "mobx-persist" class Todo { - id = Math.random(); - title = ""; - finished = false; + id = Math.random() + title = "" + finished = false } decorate(Todo, { title: [serializable(primitive), persist("object"), observable], finished: [serializable(primitive), observable] }) ``` + Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. --- @@ -129,7 +130,7 @@ npm install --save-dev babel-preset-mobx ```json { - "presets": ["mobx"] + "presets": ["mobx"] } ``` @@ -140,8 +141,8 @@ Install support for decorators: `npm i --save-dev babel-plugin-transform-decorat ```json { - "presets": ["es2015", "stage-1"], - "plugins": ["transform-decorators-legacy"] + "presets": ["es2015", "stage-1"], + "plugins": ["transform-decorators-legacy"] } ``` @@ -155,8 +156,8 @@ Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-p ```json { "plugins": [ - ["@babel/plugin-proposal-decorators", { "legacy": true}], - ["@babel/plugin-proposal-class-properties", { "loose": true}] + ["@babel/plugin-proposal-decorators", { "legacy": true }], + ["@babel/plugin-proposal-class-properties", { "loose": true }] ] } ``` @@ -165,11 +166,11 @@ Note that the `legacy` mode is important (as is putting the decorators proposal ## Decorator syntax and Create React App (v1) -* Decorators are not supported out of the box in `create-react-app@1.*`. To fix this, you can either use the `decorate` utility, eject, or use the [react-app-rewired](https://github.com/timarney/react-app-rewired/tree/master/packages/react-app-rewire-mobx) package. +- Decorators are not supported out of the box in `create-react-app@1.*`. To fix this, you can either use the `decorate` utility, eject, or use the [react-app-rewired](https://github.com/timarney/react-app-rewired/tree/master/packages/react-app-rewire-mobx) package. ## Decorator syntax and Create React App (v2) -* Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1`. In older versions or when using vanilla JavaScript use either the `decorate` utility, eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. +- Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1`. In older versions or when using vanilla JavaScript use either the `decorate` utility, eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. --- @@ -182,10 +183,10 @@ behave consistently accross all environments_ The following patterns are not officially supported by the MobX community: -* Redefining decorated class members in inheritance trees -* Decorating static class members -* Combining decorators provided by MobX with other decorators -* Hot module reloading (HMR) / React-hot-loader might not work as expected +- Redefining decorated class members in inheritance trees +- Decorating static class members +- Combining decorators provided by MobX with other decorators +- Hot module reloading (HMR) / React-hot-loader might not work as expected Decorated properties might not be visible yet on class instances as _own_ property until the first read / write to that property occurred. diff --git a/docs/best/devtools.md b/docs/best/devtools.md index 473daa59c..672cdad09 100644 --- a/docs/best/devtools.md +++ b/docs/best/devtools.md @@ -5,6 +5,7 @@ hide_title: true --- # MobX + React DevTools +
    @@ -16,7 +17,6 @@ hide_title: true Hosted on egghead.io
    - MobX ships with DevTools that can be used to track the rendering behavior and data dependencies of your app. ![devtools](../assets/devtools.gif) diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 7c48da2cf..b5ef76f03 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -5,6 +5,7 @@ hide_title: true --- # Common pitfalls & best practices +
    Stuck with MobX? This section contains a list of common issues people new to MobX might run into. @@ -63,22 +64,22 @@ Observer components only track data that is accessed _during_ the render method. ```javascript class User { - @observable name + @observable name } class Profile extends React.Component { - name + name - componentWillMount() { - // Wrong - // This dereferences user.name and just copies the value once! Future updates will not be tracked, as lifecycle hooks are not reactive - // assignments like these create redundant data - this.name = this.props.user.name - } + componentWillMount() { + // Wrong + // This dereferences user.name and just copies the value once! Future updates will not be tracked, as lifecycle hooks are not reactive + // assignments like these create redundant data + this.name = this.props.user.name + } - render() { - return
    {this.name}
    - } + render() { + return
    {this.name}
    + } } ``` @@ -86,22 +87,22 @@ The correct approach is either by not storing the values of observables locally ```javascript class User { - @observable name + @observable name } class Profile extends React.Component { - @computed get name() { - // correct; computed property will track the `user.name` property - return this.props.user.name - } + @computed get name() { + // correct; computed property will track the `user.name` property + return this.props.user.name + } - render() { - return
    {this.name}
    - } + render() { + return
    {this.name}
    + } } ``` -### Render callbacks are *not* part of the render method +### Render callbacks are _not_ part of the render method Because `observer` only applies to exactly the `render` function of the current component; passing a render callback or component to a child component doesn't become reactive automatically. For more details, see the [what will Mobx react to](https://github.com/mobxjs/mobx/blob/gh-pages/docs/best/react.md#mobx-only-tracks-data-accessed-for-observer-components-if-they-are-directly-accessed-by-render) guide. @@ -118,12 +119,12 @@ ReactDOM.render(, document.body) In this snippet just the current value of `secondsPassed` is passed to the `Timer`, which is the immutable value `0` (all primitives are immutable in JS). That number won't change anymore in the future, so `Timer` will never update. It is the property `secondsPassed` that will change in the future, -so we need to access it *in* the component. Or in other words: always try to pass the owning object of an observable property. +so we need to access it _in_ the component. Or in other words: always try to pass the owning object of an observable property. For more info see [what will MobX react to?](react.md). #### Computed values run more often than expected -If a computed property is *not* in use by some reaction (`autorun`, `observer` etc), computed expressions will be evaluated lazily; each time their value is requested (so they just act as normal property). +If a computed property is _not_ in use by some reaction (`autorun`, `observer` etc), computed expressions will be evaluated lazily; each time their value is requested (so they just act as normal property). Computed values will only track their dependencies if they are observed. This allows MobX to automatically suspend computations that are not actively in use. See this [blog](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254) or [issue #356](https://github.com/mobxjs/mobx/issues/356) for an explanation. @@ -145,11 +146,11 @@ So make sure to always dispose your reactions when you no longer need them! Example: ```javascript -const VAT = observable(1.20) +const VAT = observable(1.2) class OrderLine { - @observable price = 10; - @observable amount = 1; + @observable price = 10 + @observable amount = 1 constructor() { // this autorun will be GC-ed together with the current orderline instance this.handler = autorun(() => { @@ -166,7 +167,6 @@ class OrderLine { // When the reaction is no longer needed! } } - ``` #### I have a weird exception when using `@observable` in a React component. @@ -209,31 +209,28 @@ Observable arrays are actually objects, so they comply to `propTypes.object` ins ```javascript class ListStore { - @observable list = [ - 'Hello World!', - 'Hello React Native!', - 'Hello MobX!' - ]; + @observable list = ["Hello World!", "Hello React Native!", "Hello MobX!"] - ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }); + ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }) - @computed get dataSource() { - return this.ds.cloneWithRows(this.list.slice()); - } + @computed get dataSource() { + return this.ds.cloneWithRows(this.list.slice()) + } } -const listStore = new ListStore(); - -@observer class List extends Component { - render() { - return ( - {row}} - enableEmptySections={true} - /> - ); - } +const listStore = new ListStore() + +@observer +class List extends Component { + render() { + return ( + {row}} + enableEmptySections={true} + /> + ) + } } ``` @@ -250,12 +247,12 @@ As mentioned above, all React components which used observable data should be ma ```js class ExampleComponent extends React.Component { @observable disposer // <--- this value is disposed in addActed - + @action.bound addActed() { this.dispose() } - + @action.bound componentDidMount() { this.disposer = this.observe(....) //<-- details don't matter @@ -270,12 +267,12 @@ On the other hand, consider the following: ```js class ExampleComponent extends React.Component { @observable disposer // <--- this value is disposed in addActed - + @action.bound componentWillUnmount() { this.dispose() } - + @action.bound componentDidMount() { this.disposer = this.observe(....) //<-- details don't matter diff --git a/docs/best/react-performance.md b/docs/best/react-performance.md index 7312534d2..aa654a721 100644 --- a/docs/best/react-performance.md +++ b/docs/best/react-performance.md @@ -5,6 +5,7 @@ hide_title: true --- # Optimizing rendering React components +
    MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). But here are some tips to get most out of React and MobX. Note that most tips apply to React in general and are not specific for MobX. @@ -23,15 +24,20 @@ It is therefore recommended to have components that just map over a collection a Bad: ```javascript -@observer class MyComponent extends Component { +@observer +class MyComponent extends Component { render() { - const {todos, user} = this.props; - return (
    - {user.name} -
      - {todos.map(todo => )} -
    -
    ) + const { todos, user } = this.props + return ( +
    + {user.name} +
      + {todos.map(todo => ( + + ))} +
    +
    + ) } } ``` @@ -124,9 +130,9 @@ This approach will allow `GenericNameDisplayer` to be reused throughout your app This tip applies to React in general and libraries using `PureRenderMixin` especially, try to avoid creating new closures in render methods. See also these resources: -* [Autobinding with property initializers](https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding) -* [ESLint rule for no-bind](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md) +- [Autobinding with property initializers](https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding) +- [ESLint rule for no-bind](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md) Bad: diff --git a/docs/best/react.md b/docs/best/react.md index a4eb6d288..a1deb38ed 100644 --- a/docs/best/react.md +++ b/docs/best/react.md @@ -5,6 +5,7 @@ hide_title: true --- # What does MobX react to? +
    MobX usually reacts to exactly the things you expect it to. @@ -14,13 +15,14 @@ At that point it is invaluable to understand how MobX determines what to react t > MobX reacts to any _existing_ **observable** _property_ that is read during the execution of a tracked function. -* _"reading"_ is dereferencing an object's property, which can be done through "dotting into" it (eg. `user.name`) or using the bracket notation (eg. `user['name']`). -* _"trackable functions"_ are the expression of `computed`, the `render()` method of an observer component, and the functions that are passed as the first param to `when`, `reaction` and `autorun`. -* _"during"_ means that only those observables that are being read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. +- _"reading"_ is dereferencing an object's property, which can be done through "dotting into" it (eg. `user.name`) or using the bracket notation (eg. `user['name']`). +- _"trackable functions"_ are the expression of `computed`, the `render()` method of an observer component, and the functions that are passed as the first param to `when`, `reaction` and `autorun`. +- _"during"_ means that only those observables that are being read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. In other words, MobX will not react to: - * Values that are obtained from observables, but outside a tracked function - * Observables that are read in an asynchronously invoked code block + +- Values that are obtained from observables, but outside a tracked function +- Observables that are read in an asynchronously invoked code block ## MobX tracks property access, not values @@ -32,9 +34,7 @@ let message = observable({ author: { name: "Michel" }, - likes: [ - "John", "Sara" - ] + likes: ["John", "Sara"] }) ``` @@ -94,18 +94,17 @@ message = observable({ title: "Bar" }) This will **not** react. `message` was changed, but `message` is not an observable, just a variable which _refers to_ an observable, but the variable (reference) itself is not observable. - #### Incorrect: dereference outside a tracked function ```javascript -var title = message.title; +var title = message.title autorun(() => { console.log(title) }) message.title = "Bar" ``` -This will **not** react. `message.title` was dereferenced outside the `autorun`, and just contains the value of `message.title` at the moment of dereferencing (the string `"Foo"`). +This will **not** react. `message.title` was dereferenced outside the `autorun`, and just contains the value of `message.title` at the moment of dereferencing (the string `"Foo"`). `title` is not an observable so `autorun` will never react. #### Correct: dereference inside the tracked function @@ -114,8 +113,8 @@ This will **not** react. `message.title` was dereferenced outside the `autorun`, autorun(() => { console.log(message.author.name) }) -message.author.name = "Sara"; -message.author = { name: "John" }; +message.author.name = "Sara" +message.author = { name: "John" } ``` This will react to both changes. Both `author` and `author.name` are dotted into, allowing MobX to track these references. @@ -123,12 +122,12 @@ This will react to both changes. Both `author` and `author.name` are dotted into #### Incorrect: store a local reference to an observable object without tracking ```javascript -const author = message.author; +const author = message.author autorun(() => { console.log(author.name) }) -message.author.name = "Sara"; -message.author = { name: "John" }; +message.author.name = "Sara" +message.author = { name: "John" } ``` The first change will be picked up, `message.author` and `author` are the same object, and the `.name` property is dereferenced in the autorun. @@ -164,7 +163,7 @@ autorun(() => { }) autorun(() => { - console.log({...message}) // creates a shallow clone, also using `.title` in the process + console.log({ ...message }) // creates a shallow clone, also using `.title` in the process }) autorun(() => { @@ -174,25 +173,24 @@ autorun(() => { #### Correct: access array properties in tracked function - ```javascript autorun(() => { - console.log(message.likes.length); + console.log(message.likes.length) }) -message.likes.push("Jennifer"); +message.likes.push("Jennifer") ``` This will react as expected. `.length` counts towards a property. -Note that this will react to *any* change in the array. +Note that this will react to _any_ change in the array. Arrays are not tracked per index / property (like observable objects and maps) but as a whole. #### Incorrect: access out-of-bounds indices in tracked function ```javascript autorun(() => { - console.log(message.likes[0]); + console.log(message.likes[0]) }) -message.likes.push("Jennifer"); +message.likes.push("Jennifer") ``` This will react with the above sample data, array indexers count as property access. But **only** if the provided `index < length`. @@ -203,9 +201,9 @@ So always guard your array index based access with a `.length` check. ```javascript autorun(() => { - console.log(message.likes.join(", ")); + console.log(message.likes.join(", ")) }) -message.likes.push("Jennifer"); +message.likes.push("Jennifer") ``` This will react as expected. All array functions that do not mutate the array are tracked automatically. @@ -214,9 +212,9 @@ This will react as expected. All array functions that do not mutate the array ar ```javascript autorun(() => { - console.log(message.likes.join(", ")); + console.log(message.likes.join(", ")) }) -message.likes[2] = "Jennifer"; +message.likes[2] = "Jennifer" ``` This will react as expected. All array index assignments are detected, but only if `index <= length`. @@ -225,9 +223,9 @@ This will react as expected. All array index assignments are detected, but only ```javascript autorun(() => { - message.likes; + message.likes }) -message.likes.push("Jennifer"); +message.likes.push("Jennifer") ``` This will **not** react. Simply because the `likes` array itself is not being used by the `autorun`, only the reference to the array. @@ -235,7 +233,6 @@ So in contrast, `messages.likes = ["Jennifer"]` would be picked up; that stateme #### Using non-observable object properties - ```javascript autorun(() => { console.log(message.postDate) @@ -252,7 +249,7 @@ However, it is possible to use the `get` and `set` methods as exposed by MobX to autorun(() => { console.log(get(message, "postDate")) }) -set(message, "postDate", new Date()) +set(message, "postDate", new Date()) ``` _MobX 5_ @@ -275,12 +272,11 @@ extendObservable(message, { This will **not** react. MobX will not react to observable properties that did not exist when tracking started. If the two statements are swapped, or if any other observable causes the `autorun` to re-run, the `autorun` will start tracking the `postDate` as well. - #### Correct: using not yet existing map entries ```javascript const twitterUrls = observable.map({ - "John": "twitter.com/johnny" + John: "twitter.com/johnny" }) autorun(() => { @@ -298,18 +294,17 @@ So for dynamically keyed collections, always use observable maps. Since MobX 4 it is also possible to use observable objects as dynamic collection, if they are read / updated by using the mobx apis, so that mobx can keep track of the property changes. The following will react as well: - ```javascript import { get, set, observable } from "mobx" const twitterUrls = observable.object({ - "John": "twitter.com/johnny" + John: "twitter.com/johnny" }) autorun(() => { console.log(get(twitterUrls, "Sara")) // get can track not yet existing properties }) -set(twitterUrls, { "Sara" : "twitter.com/horsejs"}) +set(twitterUrls, { Sara: "twitter.com/horsejs" }) ``` See the [object manipulation api](https://mobx.js.org/refguide/api.html#direct-observable-manipulation) for more details @@ -318,28 +313,26 @@ See the [object manipulation api](https://mobx.js.org/refguide/api.html#direct-o ```javascript function upperCaseAuthorName(author) { - const baseName = author.name; - return baseName.toUpperCase(); + const baseName = author.name + return baseName.toUpperCase() } autorun(() => { console.log(upperCaseAuthorName(message.author)) }) message.author.name = "Chesterton" ``` + This will react. Even though `author.name` is not dereferenced by the thunk passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. ----- +--- ```javascript autorun(() => { - setTimeout( - () => console.log(message.likes.join(", ")), - 10 - ) + setTimeout(() => console.log(message.likes.join(", ")), 10) }) -message.likes.push("Jennifer"); +message.likes.push("Jennifer") ``` This will **not** react, during the execution of the `autorun` no observables where accessed, only during the `setTimeout`. @@ -353,11 +346,9 @@ but in practice is actually rendered out by a different component. This often ha Take for example the following contrived example: ```javascript -const MyComponent = observer(({ message }) => -
    {message.title}
    } - /> -) +const MyComponent = observer(({ message }) => ( +
    {message.title}
    } /> +)) message.title = "Bar" ``` @@ -384,14 +375,9 @@ message.title = "Bar" Alternatively, to avoid creating additional components, it is also possible to use the mobx-react built-in `Observer` component, which takes no arguments, and a single render function as children: ```javascript -const MyComponent = ({ message }) => - - - {() =>
    {message.title}
    } -
    - } - /> +const MyComponent = ({ message }) => ( + {() =>
    {message.title}
    }
    } /> +) message.title = "Bar" ``` @@ -401,11 +387,12 @@ message.title = "Bar" A common mistake is to store local variables that dereference observables, and then expect components to react. For example: ```javascript -@observer class MyComponent extends React.component { - author; +@observer +class MyComponent extends React.component { + author constructor(props) { super(props) - this.author = props.message.author; + this.author = props.message.author } render() { @@ -432,37 +419,36 @@ This can simply be solved by doing the dereferencing inside `render()`, or by in Suppose that the following components are used to render our above `message` object. ```javascript -const Message = observer(({ message }) => +const Message = observer(({ message }) => (
    {message.title} - - + +
    -) +)) -const Author = observer(({ author }) => - {author.name} -) +const Author = observer(({ author }) => {author.name}) -const Likes = observer(({ likes }) => +const Likes = observer(({ likes }) => (
      - {likes.map(like => + {likes.map(like => (
    • {like}
    • - )} + ))}
    -) +)) ``` -| change | re-rendering component | -| --- | --- | -| `message.title = "Bar"` | `Message` | -| `message.author.name = "Susan"` | `Author` (`.author` is dereferenced in `Message`, but didn't change)* | -| `message.author = { name: "Susan"}` | `Message`, `Author` | -| `message.likes[0] = "Michel"` | `Likes` | +| change | re-rendering component | +| ----------------------------------- | ---------------------------------------------------------------------- | +| `message.title = "Bar"` | `Message` | +| `message.author.name = "Susan"` | `Author` (`.author` is dereferenced in `Message`, but didn't change)\* | +| `message.author = { name: "Susan"}` | `Message`, `Author` | +| `message.likes[0] = "Michel"` | `Likes` | Notes: + 1. \* If the `Author` component was invoked like: ``. Then `Message` would be the dereferencing component and react to changes to `message.author.name`. Nonetheless `` would rerender as well, because it receives a new value. So performance wise it is best to dereference as late as possible. -2. \** If likes were objects instead of strings, and if they were rendered by their own `Like` component, the `Likes` component would not rerender for changes happening inside a specific like. +2. \*\* If likes were objects instead of strings, and if they were rendered by their own `Like` component, the `Likes` component would not rerender for changes happening inside a specific like. ## TL;DR diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index 2d4560c1f..ee688f43b 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -5,6 +5,7 @@ hide_title: true --- # Hot Module Reloading with Stateless Components +
    One thing that can be a challenge when getting started with MobX (and React in general) is understanding why Hot Module Reloading (HMR) sometimes breaks. When you initially get it working, it seems like magic (and it kind of is), however there's at least one rough edge with regard to HMR and React: stateless components. Since stateless components don't explicitly identify themselves as React components, HMR doesn't quite know what to do with them, and so you'll often see warnings in your console like this: @@ -24,10 +25,9 @@ Function declarations still do the exact same thing as arrow functions, but they For instance, here's a stateless component built with an arrow function: ```javascript -const ToDoItem = observer(props =>
    {props.item}
    ); - -export default ToDoItem; +const ToDoItem = observer(props =>
    {props.item}
    ) +export default ToDoItem ``` And here's how that will appear in the React DevTools: @@ -38,11 +38,10 @@ On the other hand, using a function declaration will allow you to build the same ```javascript function ToDoItem(props) { - return
    {props.item}
    + return
    {props.item}
    } -export default observer(ToDoItem); - +export default observer(ToDoItem) ``` And now the component shows up correctly in the DevTools: @@ -54,27 +53,26 @@ And now the component shows up correctly in the DevTools: By "stateful observer", all I really mean is a component created with `React.Component` or `React.createClass` and which uses the `@observer` decorator, like so: ```javascript -import { observer } from 'mobx-react'; +import { observer } from "mobx-react" @observer class App extends React.Component { - constructor(props) { - super(props); - this.store = props.store; - } - - render() { - return ( -
    -

    Todos:

    - { - this.store.todos.map((t, idx) => ) - } -
    - ); - } + constructor(props) { + super(props) + this.store = props.store + } + + render() { + return ( +
    +

    Todos:

    + {this.store.todos.map((t, idx) => ( + + ))} +
    + ) + } } - ``` In this case, `ToDoItem` is stateless, but will still work with HMR because the root-level of the UI tree is a stateful observer. As a result, whenever we change **any** stateless component, it will be hot-reloaded because the observers will trigger computations in the root-level component as well. And since the root-level component is a good old-fashioned React component, it'll trigger the HMR for all of its children and voila! All the magic of stateless components, observables, and hot module reloading working together beautifully. diff --git a/docs/best/store.md b/docs/best/store.md index 17254c342..3494516e9 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -5,6 +5,7 @@ hide_title: true --- # Best Practices for building large scale maintainable projects +
    This section contains some best practices we discovered at Mendix while working with MobX. @@ -29,19 +30,20 @@ This store typically doesn't have much logic in it, but will store a plethora of This is ideal as most applications will change the UI state often during the development process. Things you will typically find in UI stores: -* Session information -* Information about how far your application has loaded -* Information that will not be stored in the backend -* Information that affects the UI globally - * Window dimensions - * Accessibility information - * Current language - * Currently active theme -* User interface state as soon as it affects multiple, further unrelated components: - * Current selection - * Visibility of toolbars, etc. - * State of a wizard - * State of a global overlay + +- Session information +- Information about how far your application has loaded +- Information that will not be stored in the backend +- Information that affects the UI globally + - Window dimensions + - Accessibility information + - Current language + - Currently active theme +- User interface state as soon as it affects multiple, further unrelated components: + - Current selection + - Visibility of toolbars, etc. + - State of a wizard + - State of a global overlay It might very well be that these pieces of information start as internal state of a specific component (for example the visibility of a toolbar). But after a while you discover that you need this information somewhere else in your application. @@ -53,24 +55,24 @@ You might distribute the _ui-state-store_ through your application by passing it Example of a store (using ES6 syntax): ```javascript -import {observable, computed, asStructure} from 'mobx'; -import jquery from 'jquery'; +import { observable, computed, asStructure } from "mobx" +import jquery from "jquery" export class UiState { - @observable language = "en_US"; - @observable pendingRequestCount = 0; + @observable language = "en_US" + @observable pendingRequestCount = 0 // .struct makes sure observer won't be signaled unless the // dimensions object changed in a deepEqual manner @observable.struct windowDimensions = { width: jquery(window).width(), height: jquery(window).height() - }; + } - constructor() { + constructor() { jquery.resize(() => { - this.windowDimensions = getWindowDimensions(); - }); + this.windowDimensions = getWindowDimensions() + }) } @computed get appIsInSync() { @@ -93,16 +95,17 @@ As a rule of thumb: if the nature of the relationship between two items is conta So a store just manages _domain objects_. These are the responsibilities of a store: -* Instantiate domain objects. Make sure domain objects know the store they belong to. -* Make sure there is only one instance of each of your domain objects. -The same user, order or todo should not be stored twice in memory. -This way you can safely use references and also be sure you are looking at the latest instance, without ever having to resolve a reference. -This is fast, straightforward and convenient when debugging. -* Provide backend integration. Store data when needed. -* Update existing instances if updates are received from the backend. -* Provide a stand-alone, universal, testable component of your application. -* To make sure your store is testable and can be run server-side, you probably will move doing actual websocket / http requests to a separate object so that you can abstract over your communication layer. -* There should be only one instance of a store. + +- Instantiate domain objects. Make sure domain objects know the store they belong to. +- Make sure there is only one instance of each of your domain objects. + The same user, order or todo should not be stored twice in memory. + This way you can safely use references and also be sure you are looking at the latest instance, without ever having to resolve a reference. + This is fast, straightforward and convenient when debugging. +- Provide backend integration. Store data when needed. +- Update existing instances if updates are received from the backend. +- Provide a stand-alone, universal, testable component of your application. +- To make sure your store is testable and can be run server-side, you probably will move doing actual websocket / http requests to a separate object so that you can abstract over your communication layer. +- There should be only one instance of a store. ### Domain objects @@ -117,44 +120,46 @@ your business rules, actions and user interface. Domain objects can delegate all their logic to the store they belong to if that suits your application well. It is possible to express your domain objects as plain objects, but classes have some important advantages over plain objects: -* They can have methods. -This makes your domain concepts easier to use stand-alone and reduces the amount of contextual awareness that is needed in your application. -Just pass objects around. -You don't have to pass stores around, or have to figure out which actions can be applied to an object if they are just available as instance methods. -Especially in large applications this is important. -* They offer fine grained control over the visibility of attributes and methods. -* Objects created using a constructor function can freely mix observable properties and functions, and non-observable properties and methods. -* They are easily recognizable and can strictly be type-checked. +- They can have methods. + This makes your domain concepts easier to use stand-alone and reduces the amount of contextual awareness that is needed in your application. + Just pass objects around. + You don't have to pass stores around, or have to figure out which actions can be applied to an object if they are just available as instance methods. + Especially in large applications this is important. +- They offer fine grained control over the visibility of attributes and methods. +- Objects created using a constructor function can freely mix observable properties and functions, and non-observable properties and methods. +- They are easily recognizable and can strictly be type-checked. ### Example domain store ```javascript -import {observable, autorun} from 'mobx'; -import uuid from 'node-uuid'; +import { observable, autorun } from "mobx" +import uuid from "node-uuid" export class TodoStore { - authorStore; - transportLayer; - @observable todos = []; - @observable isLoading = true; + authorStore + transportLayer + @observable todos = [] + @observable isLoading = true constructor(transportLayer, authorStore) { - this.authorStore = authorStore; // Store that can resolve authors for us - this.transportLayer = transportLayer; // Thing that can make server requests for us - this.transportLayer.onReceiveTodoUpdate(updatedTodo => this.updateTodoFromServer(updatedTodo)); - this.loadTodos(); + this.authorStore = authorStore // Store that can resolve authors for us + this.transportLayer = transportLayer // Thing that can make server requests for us + this.transportLayer.onReceiveTodoUpdate(updatedTodo => + this.updateTodoFromServer(updatedTodo) + ) + this.loadTodos() } /** * Fetches all todos from the server */ loadTodos() { - this.isLoading = true; + this.isLoading = true this.transportLayer.fetchTodos().then(fetchedTodos => { - fetchedTodos.forEach(json => this.updateTodoFromServer(json)); - this.isLoading = false; - }); + fetchedTodos.forEach(json => this.updateTodoFromServer(json)) + this.isLoading = false + }) } /** @@ -163,15 +168,15 @@ export class TodoStore { * or remove a todo if it has been deleted on the server. */ updateTodoFromServer(json) { - var todo = this.todos.find(todo => todo.id === json.id); + var todo = this.todos.find(todo => todo.id === json.id) if (!todo) { - todo = new Todo(this, json.id); - this.todos.push(todo); + todo = new Todo(this, json.id) + this.todos.push(todo) } if (json.isDeleted) { - this.removeTodo(todo); + this.removeTodo(todo) } else { - todo.updateFromJson(json); + todo.updateFromJson(json) } } @@ -179,71 +184,70 @@ export class TodoStore { * Creates a fresh todo on the client and server */ createTodo() { - var todo = new Todo(this); - this.todos.push(todo); - return todo; + var todo = new Todo(this) + this.todos.push(todo) + return todo } /** * A todo was somehow deleted, clean it from the client memory */ removeTodo(todo) { - this.todos.splice(this.todos.indexOf(todo), 1); - todo.dispose(); + this.todos.splice(this.todos.indexOf(todo), 1) + todo.dispose() } } export class Todo { - /** * unique id of this todo, immutable. */ - id = null; + id = null - @observable completed = false; - @observable task = ""; + @observable completed = false + @observable task = "" /** * reference to an Author object (from the authorStore) */ - @observable author = null; + @observable author = null - store = null; + store = null /** * Indicates whether changes in this object * should be submitted to the server */ - autoSave = true; + autoSave = true /** * Disposer for the side effect that automatically * stores this Todo, see @dispose. */ - saveHandler = null; + saveHandler = null - constructor(store, id=uuid.v4()) { - this.store = store; - this.id = id; + constructor(store, id = uuid.v4()) { + this.store = store + this.id = id this.saveHandler = reaction( // observe everything that is used in the JSON: () => this.asJson, // if autoSave is on, send json to server - (json) => { + json => { if (this.autoSave) { - this.store.transportLayer.saveTodo(json); + this.store.transportLayer.saveTodo(json) } } - ); + ) } /** * Remove this todo from the client and server */ delete() { - this.store.transportLayer.deleteTodo(this.id); - this.store.removeTodo(this); + this.store.transportLayer.deleteTodo(this.id) + this.store.removeTodo(this) } @computed get asJson() { @@ -252,7 +256,7 @@ export class Todo { completed: this.completed, task: this.task, authorId: this.author ? this.author.id : null - }; + } } /** @@ -260,16 +264,16 @@ export class Todo { */ updateFromJson(json) { // make sure our changes aren't sent back to the server - this.autoSave = false; - this.completed = json.completed; - this.task = json.task; - this.author = this.store.authorStore.resolveAuthor(json.authorId); - this.autoSave = true; + this.autoSave = false + this.completed = json.completed + this.task = json.task + this.author = this.store.authorStore.resolveAuthor(json.authorId) + this.autoSave = true } dispose() { // clean up the observer - this.saveHandler(); + this.saveHandler() } } ``` @@ -288,29 +292,29 @@ Example: ```javascript class RootStore { - constructor() { - this.userStore = new UserStore(this) - this.todoStore = new TodoStore(this) - } + constructor() { + this.userStore = new UserStore(this) + this.todoStore = new TodoStore(this) + } } class UserStore { - constructor(rootStore) { - this.rootStore = rootStore - } - - getTodos(user) { - // access todoStore through the root store - return this.rootStore.todoStore.todos.filter(todo => todo.author === user) - } + constructor(rootStore) { + this.rootStore = rootStore + } + + getTodos(user) { + // access todoStore through the root store + return this.rootStore.todoStore.todos.filter(todo => todo.author === user) + } } class TodoStore { - @observable todos = [] + @observable todos = [] - constructor(rootStore) { - this.rootStore = rootStore - } + constructor(rootStore) { + this.rootStore = rootStore + } } ``` diff --git a/docs/best/trace.md b/docs/best/trace.md index ba859baa7..364dce8f4 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -5,6 +5,7 @@ hide_title: true --- # Using `trace` for debugging +
    Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. diff --git a/docs/faq/faq.md b/docs/faq/faq.md index d1f2d28c2..174495189 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -5,6 +5,7 @@ hide_title: true --- ## FAQ +
    ##### Which browsers are supported? @@ -12,9 +13,11 @@ hide_title: true MobX runs on any ES5 environment. That means that Node.js, Rhino and all browsers except for IE8 are supported. See [caniuse.com](http://caniuse.com/#feat=es5) ##### Can MobX be combined with RxJS? + Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. ##### When to use RxJS instead of MobX? + For anything that involves explictly working with the concept of time, or when you need to reason about the historical values / events of an observable (and not just the latest), RxJs is recommended as it provides more low-level primitives. Whenever you want to react to _state_ instead of _events_, MobX offers an easier and more high-level approach. @@ -33,7 +36,7 @@ See this [issue](https://github.com/mobxjs/mobx/issues/18) for some consideratio ##### Is MobX a framework? -MobX is *not* a framework. It does not tell you how to structure your code, where to store state or how to process events. Yet it might free you from frameworks that poses all kinds of restrictions on your code in the name of performance. +MobX is _not_ a framework. It does not tell you how to structure your code, where to store state or how to process events. Yet it might free you from frameworks that poses all kinds of restrictions on your code in the name of performance. ##### Can I combine MobX with Flux? diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 7b7861a07..3b93710c6 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -5,6 +5,7 @@ hide_title: true --- # Concepts & Principles +
    ## Concepts @@ -22,18 +23,19 @@ Remember, state is like spreadsheets cells that hold a value. _Anything_ that can be derived from the _state_ without any further interaction is a derivation. Derivations exist in many forms: -* The _user interface_. -* _Derived data_, such as the number of todos left. -* _Backend integrations_ like sending changes to the server. +- The _user interface_. +- _Derived data_, such as the number of todos left. +- _Backend integrations_ like sending changes to the server. MobX distinguishes two kind of derivations: -* *Computed values*. These are values that can always be derived from the current observable state using a pure function. -* *Reactions*. Reactions are side effects that need to happen automatically if the state changes. These are needed as a bridge between imperative and reactive programming. Or to make it more clear, they are ultimately needed to achieve I/O. + +- _Computed values_. These are values that can always be derived from the current observable state using a pure function. +- _Reactions_. Reactions are side effects that need to happen automatically if the state changes. These are needed as a bridge between imperative and reactive programming. Or to make it more clear, they are ultimately needed to achieve I/O. People starting with MobX tend to use reactions too often. The golden rule is: if you want to create a value based on the current state, use `computed`. -Back to the spreadsheet analogy, formulas are derivations that *compute* a value. But for you as a user to be able to see it on the screen a *reaction* is needed that repaints part of the GUI. +Back to the spreadsheet analogy, formulas are derivations that _compute_ a value. But for you as a user to be able to see it on the screen a _reaction_ is needed that repaints part of the GUI. ### 3. Actions @@ -41,7 +43,7 @@ An _action_ is any piece of code that changes the _state_. User events, backend An action is like a user that enters a new value in a spreadsheet cell. Actions can be defined explicitly in MobX to help you to structure code more clearly. -If MobX is used in [*strict mode*](../refguide/api##-enforceactions-), MobX will enforce that no state can be modified outside actions. +If MobX is used in [_strict mode_](../refguide/api##-enforceactions-), MobX will enforce that no state can be modified outside actions. ## Principles @@ -63,36 +65,32 @@ All _Computed values_ should be **pure**. They are not supposed to change _state The following listing illustrates the above concepts and principles: ```javascript -import {observable, autorun} from 'mobx'; +import { observable, autorun } from "mobx" var todoStore = observable({ - /* some observable state */ - todos: [], + /* some observable state */ + todos: [], - /* a derived value */ - get completedCount() { - return this.todos.filter(todo => todo.completed).length; - } -}); + /* a derived value */ + get completedCount() { + return this.todos.filter(todo => todo.completed).length + } +}) /* a function that observes the state */ autorun(function() { - console.log("Completed %d of %d items", - todoStore.completedCount, - todoStore.todos.length - ); -}); + console.log("Completed %d of %d items", todoStore.completedCount, todoStore.todos.length) +}) /* ..and some actions that modify the state */ todoStore.todos[0] = { - title: "Take a walk", - completed: false -}; + title: "Take a walk", + completed: false +} // -> synchronously prints 'Completed 0 of 1 items' -todoStore.todos[0].completed = true; +todoStore.todos[0].completed = true // -> synchronously prints 'Completed 1 of 1 items' - ``` In the [10 minute introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 6805ef3ad..44ced45e9 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -5,6 +5,7 @@ hide_title: true --- # The gist of MobX +
    @@ -16,7 +17,6 @@ hide_title: true Hosted on egghead.io
    - So far it all might sound a bit fancy, but making an app reactive using MobX boils down to just these three steps: ## 1. Define your state and make it observable @@ -26,11 +26,11 @@ Cyclic data structures, references, it doesn't matter. Just make sure that all properties that you want to change over time are marked by `mobx` to make them observable. ```javascript -import {observable} from 'mobx'; +import { observable } from "mobx" var appState = observable({ timer: 0 -}); +}) ``` ## 2. Create a view that responds to changes in the State @@ -44,7 +44,7 @@ Generally speaking any function can become a reactive view that observes its dat But here is an (ES6) example of a view in the form of a React component. ```javascript -import {observer} from 'mobx-react'; +import { observer } from "mobx-react" @observer class TimerView extends React.Component { @@ -53,15 +53,15 @@ class TimerView extends React.Component { - ); + ) } onReset() { - this.props.appState.resetTimer(); + this.props.appState.resetTimer() } -}; +} -ReactDOM.render(, document.body); +ReactDOM.render(, document.body) ``` (For the implementation of `resetTimer` function see the next section) @@ -72,7 +72,7 @@ The third thing to do is to modify the state. That is what your app is all about after all. Unlike many other frameworks, MobX doesn't dictate how you do this. There are best practices, but the key thing to remember is: -***MobX helps you do things in a simple straightforward way***. +**_MobX helps you do things in a simple straightforward way_**. The following code will alter your data every second, and the UI will update automatically when needed. No explicit relations are defined in either the controller functions that _change_ the state or in the views that should _update_. @@ -81,12 +81,15 @@ Here are two examples of changing the state: ```javascript appState.resetTimer = action(function reset() { - appState.timer = 0; -}); - -setInterval(action(function tick() { - appState.timer += 1; -}), 1000); + appState.timer = 0 +}) + +setInterval( + action(function tick() { + appState.timer += 1 + }), + 1000 +) ``` The `action` wrapper is only needed when using MobX in strict mode (by default off). diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 418a773ab..8f8df5843 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -5,6 +5,7 @@ hide_title: true --- # action +
    @@ -17,13 +18,14 @@ hide_title: true
    Usage: -* `action(fn)` -* `action(name, fn)` -* `@action classMethod() {}` -* `@action(name) classMethod () {}` -* `@action boundClassMethod = (args) => { body }` -* `@action(name) boundClassMethod = (args) => { body }` -* `@action.bound classMethod() {}` + +- `action(fn)` +- `action(name, fn)` +- `@action classMethod() {}` +- `@action(name) classMethod () {}` +- `@action boundClassMethod = (args) => { body }` +- `@action(name) boundClassMethod = (args) => { body }` +- `@action.bound classMethod() {}` Any application has actions. Actions are anything that modify the state. With MobX you can make it explicit in your code where your actions live by marking them. @@ -46,7 +48,6 @@ Note: using `action` is mandatory when MobX is configured to require actions to Actions should only, and always, be used on functions that _modify_ state. Functions that just perform look-ups, filters etc should _not_ be marked as actions; to allow MobX to track their invocations. - ["enforce actions"](api.md#configure) enforces that all state modifications are done by an action. This is a useful best practice in larger, long term code bases. ## Bound actions @@ -59,12 +60,12 @@ Example: ```javascript class Ticker { - @observable tick = 0 + @observable tick = 0 - @action.bound - increment() { - this.tick++ // 'this' will always be correct - } + @action.bound + increment() { + this.tick++ // 'this' will always be correct + } } const ticker = new Ticker() @@ -73,8 +74,6 @@ setInterval(ticker.increment, 1000) _Note: don't use *action.bound* with arrow functions; arrow functions are already bound and cannot be rebound._ - ## `runInAction(name?, thunk)` `runInAction` is a simple utility that takes an code block and executes in an (anonymous) action. This is useful to create and execute actions on the fly, for example inside an asynchronous process. `runInAction(f)` is sugar for `action(f)()` - diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 5d4c30477..4b3630538 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -5,42 +5,44 @@ hide_title: true --- # MobX Api Reference +
    **Applies to MobX 4 and higher** -- Using Mobx 3? Use this [migration guide](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) to switch gears. -- [MobX 3 documentation](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md) -- For MobX 2, the old documentation is still available on [github](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md). +- Using Mobx 3? Use this [migration guide](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) to switch gears. +- [MobX 3 documentation](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md) +- For MobX 2, the old documentation is still available on [github](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md). # Core API _These are the most important MobX API's._ > Understanding `observable`, `computed`, `reaction` and `action` is enough - to master MobX and use it in your applications! +> to master MobX and use it in your applications! ## Creating observables - ### `observable(value)` + Usage: -* `observable(value)` -* `@observable classProperty = value` + +- `observable(value)` +- `@observable classProperty = value` Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. **Note:** `observable(value)` is a convenience API that will succeed only if it can be made into - an observable data structure (_Array_, _Map_, or _observable-object_). For all other values, no conversion will be performed. +an observable data structure (_Array_, _Map_, or _observable-object_). For all other values, no conversion will be performed. You can also directly create the desired observable type, see below. -The following conversion rules are applied, but can be fine-tuned by using [*decorators*](#decorators). See below. +The following conversion rules are applied, but can be fine-tuned by using [_decorators_](#decorators). See below. -1. If *value* is an instance of an [ES6 Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -1. If *value* is an array, a new [Observable Array](array.md) will be returned. -1. If *value* is an object *without* prototype or its prototype is `Object.prototype`, the object will be cloned and all its current properties will be made observable. See [Observable Object](object.md) -1. If *value* is an object *with* a prototype, a JavaScript primitive or function, there will be no change made to the value. If you do need a [Boxed Observable](boxed.md), you can do one of the following: +1. If _value_ is an instance of an [ES6 Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. +1. If _value_ is an array, a new [Observable Array](array.md) will be returned. +1. If _value_ is an object _without_ prototype or its prototype is `Object.prototype`, the object will be cloned and all its current properties will be made observable. See [Observable Object](object.md) +1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, there will be no change made to the value. If you do need a [Boxed Observable](boxed.md), you can do one of the following: - Call `observable.box(value)` explicitly - Use `@observable` in the class definition - Call [`decorate()`](#decorate) @@ -52,13 +54,13 @@ These rules might seem complicated at first sight, but you will notice that in p **Some notes:** -* To use the `@observable` decorator, make sure that [decorators are enabled](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) in your transpiler (babel or typescript). -* By default making a data structure observable is *infective*; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [*decorators*](#decorators). -* _[MobX 4 and below]_ To create dynamically keyed objects, always use maps! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. +- To use the `@observable` decorator, make sure that [decorators are enabled](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) in your transpiler (babel or typescript). +- By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [_decorators_](#decorators). +- _[MobX 4 and below]_ To create dynamically keyed objects, always use maps! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. -[«`observable`»](observable.md) — [«`@observable`»](observable-decorator.md) +[«`observable`»](observable.md) — [«`@observable`»](observable-decorator.md) -### `@observable property = value` +### `@observable property = value` `observable` can also be used as property decorator. It requires [decorators to be enabled](../best/decorators.md) and is syntactic sugar for `extendObservable(this, { property: value })`. @@ -66,6 +68,7 @@ sugar for `extendObservable(this, { property: value })`. [«`details`»](observable-decorator.md) ### `observable.box(value, options?)` + Creates an observable _box_ that stores an observable reference to a value. Use `get()` to get the current value of the box, and `set()` to update it. This is the foundation on which all other observables are built, but in practice you will use it rarely. @@ -115,7 +118,7 @@ Usage: `extendObservable(target, properties, decorators?, options?)`. For each key/value pair in each `properties` a (new) observable property will be introduced on the target object. This can be used in constructor functions to introduce observable properties without using decorators. -If a value of the `properties` is a getter function, a *computed* property will be introduced. +If a value of the `properties` is a getter function, a _computed_ property will be introduced. Use `extendObservable(target, properties, decorators?, {deep: false})` if the new properties should not be infective (that is; newly assigned values should not be turned into observables automatically). Note that `extendObservable` enhances existing objects, unlike `observable.object` which creates a new object. @@ -128,21 +131,23 @@ Use decorators to fine tune the observability of properties defined via `observa The following decorators are available: -* **`observable.deep`**: This is the default decorator, used by any observable. It converts any assigned, non-primitive value into an observable if it isn't one yet. -* **`observable.ref`**: Disables automatic observable conversion, just creates an observable reference instead. -* **`observable.shallow`**: Can only be used in combination with collections. Turns any assigned collection into a collection, which is shallowly observable (instead of deep). In other words; the values inside the collection won't become observables automatically. -* **`computed`**: Creates a derived property, see [`computed`](computed-decorator.md) -* **`action`**: Creates an action, see [`action`](action.md) -* **`action.bound`**: Creates a bound action, see [`action`](action.md) +- **`observable.deep`**: This is the default decorator, used by any observable. It converts any assigned, non-primitive value into an observable if it isn't one yet. +- **`observable.ref`**: Disables automatic observable conversion, just creates an observable reference instead. +- **`observable.shallow`**: Can only be used in combination with collections. Turns any assigned collection into a collection, which is shallowly observable (instead of deep). In other words; the values inside the collection won't become observables automatically. +- **`computed`**: Creates a derived property, see [`computed`](computed-decorator.md) +- **`action`**: Creates an action, see [`action`](action.md) +- **`action.bound`**: Creates a bound action, see [`action`](action.md) You can apply these decorators using the _@decorator_ syntax: ```javascript -import {observable, action} from 'mobx'; +import { observable, action } from "mobx" class TaskStore { @observable.shallow tasks = [] - @action addTask(task) { /* ... */ } + @action addTask(task) { + /* ... */ + } } ``` @@ -150,20 +155,26 @@ Or by passing in property decorators via `observable.object` / `observable.exten Note that decorators always 'stick' to the property. So they will remain in effect even if a new value is assigned. ```javascript -import {observable, action} from 'mobx'; - -const taskStore = observable({ - tasks: [], - addTask(task) { /* ... */ } -}, { - tasks: observable.shallow, - addTask: action -}) +import { observable, action } from "mobx" + +const taskStore = observable( + { + tasks: [], + addTask(task) { + /* ... */ + } + }, + { + tasks: observable.shallow, + addTask: action + } +) ``` [«details»](modifiers.md) ### `decorate` + Usage: `decorate(object, decorators)` This is a convenience method to apply observability [decorators](#decorators) to the properties of a plain object or class instance. The second argument is an object with properties set to certain decorators. @@ -177,7 +188,7 @@ class TodoList { } addTodo() { const t = new Todo() - t.title = 'Test_' + Math.random() + t.title = "Test_" + Math.random() set(this.todos, t.id, t) } } @@ -190,46 +201,48 @@ decorate(TodoList, { ``` For applying multiple decorators on a single property, you can pass an array of decorators. The decorators application order is from right to left. + ```javascript -import { decorate, observable } from 'mobx' -import { serializable, primitive } from 'serializr' -import persist from 'mobx-persist' +import { decorate, observable } from "mobx" +import { serializable, primitive } from "serializr" +import persist from "mobx-persist" class Todo { - id = Math.random(); - title = ''; - finished = false; + id = Math.random() + title = "" + finished = false } decorate(Todo, { - title: [serializable(primitive), persist('object'), observable], + title: [serializable(primitive), persist("object"), observable], finished: [serializable(primitive), observable] }) ``` -Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. +Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. ## Computed values Usage: -* `computed(() => expression)` -* `computed(() => expression, (newValue) => void)` -* `computed(() => expression, options)` -* `@computed get classProperty() { return expression; }` -* `@computed({equals: compareFn}) get classProperty() { return expression; }` -* `@computed.struct get classProperty() { return expression; }` + +- `computed(() => expression)` +- `computed(() => expression, (newValue) => void)` +- `computed(() => expression, options)` +- `@computed get classProperty() { return expression; }` +- `@computed({equals: compareFn}) get classProperty() { return expression; }` +- `@computed.struct get classProperty() { return expression; }` Creates a computed property. The `expression` should not have side effects but return a value. -The expression will automatically be re-evaluated if any observables it uses changes, but only if it is in use by some *reaction*. +The expression will automatically be re-evaluated if any observables it uses changes, but only if it is in use by some _reaction_. There are various `options` that can be used to control the behavior of `computed`. These include: -* **`equals: (value, value) => boolean`** Comparison method can be used to override the default detection on when something is changed. Built-in comparers are: `comparer.identity`, `comparer.default`, `comparer.structural`. -* **`name: string`** Provide a debug name to this computed property -* **`requiresReaction: boolean`** Wait for a change in value of the tracked observables, before recomputing the derived property -* **`get: () => value)`** Override the getter for the computed property. -* **`set: (value) => void`** Override the setter for the computed property -* **`keepAlive: boolean`** Set to true to automatically keep computed values alive, rather then suspending then when there are no observers. +- **`equals: (value, value) => boolean`** Comparison method can be used to override the default detection on when something is changed. Built-in comparers are: `comparer.identity`, `comparer.default`, `comparer.structural`. +- **`name: string`** Provide a debug name to this computed property +- **`requiresReaction: boolean`** Wait for a change in value of the tracked observables, before recomputing the derived property +- **`get: () => value)`** Override the getter for the computed property. +- **`set: (value) => void`** Override the setter for the computed property +- **`keepAlive: boolean`** Set to true to automatically keep computed values alive, rather then suspending then when there are no observers. [«details»](computed-decorator.md) @@ -241,16 +254,17 @@ With MobX you can make it explicit in your code where your actions live by marki Actions helps you to structure your code better. It is advised to use them on any function that modifies observables or has side effects. `action` also provides useful debugging information in combination with the devtools. -Note: using `action` is mandatory when *strict mode* is enabled, see `enforceActions`. +Note: using `action` is mandatory when _strict mode_ is enabled, see `enforceActions`. [«details»](action.md) Usage: -* `action(fn)` -* `action(name, fn)` -* `@action classMethod` -* `@action(name) classMethod` -* `@action boundClassMethod = (args) => { body }` -* `@action.bound boundClassMethod(args) { body }` + +- `action(fn)` +- `action(name, fn)` +- `@action classMethod` +- `@action(name) classMethod` +- `@action boundClassMethod = (args) => { body }` +- `@action.bound boundClassMethod(args) { body }` For one-time-actions `runInAction(name?, fn)` can be used, which is sugar for `action(name, fn)()`. @@ -265,28 +279,28 @@ When dealing with _async actions_, the code that executes in the callback is not Note that the async function must be a _generator_ and you must only _yield_ to promises inside. `flow` gives you back a promise that you can `cancel()` if you want. ```js -import { configure } from 'mobx'; +import { configure } from "mobx" // don't allow state modifications outside actions -configure({enforceActions: "always"}); +configure({ enforceActions: "always" }) class Store { - @observable githubProjects = []; - @observable state = "pending"; // "pending" / "done" / "error" - + @observable githubProjects = [] + @observable state = "pending" // "pending" / "done" / "error" - fetchProjects = flow(function* fetchProjects() { // <- note the star, this a generator function! - this.githubProjects = []; - this.state = "pending"; + fetchProjects = flow(function* fetchProjects() { + // <- note the star, this a generator function! + this.githubProjects = [] + this.state = "pending" try { - const projects = yield fetchGithubProjectsSomehow(); // yield instead of await - const filteredProjects = somePreprocessing(projects); + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) // the asynchronous blocks will automatically be wrapped actions - this.state = "done"; - this.githubProjects = filteredProjects; + this.state = "done" + this.githubProjects = filteredProjects } catch (error) { - this.state = "error"; + this.state = "error" } }) } @@ -323,12 +337,13 @@ const res = await count() // 6 ## Reactions & Derivations -*Computed values* are **values** that react automatically to state changes. -*Reactions* are **side effects** that react automatically to state changes. +_Computed values_ are **values** that react automatically to state changes. +_Reactions_ are **side effects** that react automatically to state changes. Reactions _can_ be used to ensure that a certain side effect (mainly I/O) is automatically executed when relevant state changes, like logging, network requests etc. The most commonly used reaction is the `observer` decorator for React components (see below). ### `observer` + Can be used as higher order component around a React component. The component will then automatically re-render if any of the observables used in the `render` function of the component has changed. Note that `observer` is provided by the `"mobx-react"` package and not by `"mobx"` itself. @@ -336,13 +351,14 @@ Note that `observer` is provided by the `"mobx-react"` package and not by `"mobx [«details»](observer-component.md) Usage: -* `observer(React.createClass({ ... }))` -* `observer((props, context) => ReactElement)` -* `observer(class MyComponent extends React.Component { ... })` -* `@observer class MyComponent extends React.Component { ... }` +- `observer(React.createClass({ ... }))` +- `observer((props, context) => ReactElement)` +- `observer(class MyComponent extends React.Component { ... })` +- `@observer class MyComponent extends React.Component { ... }` ### `autorun` + Usage: `autorun(() => { sideEffect }, options)`. Autorun runs the provided `sideEffect` and tracks which observable state is accessed while running the side effect. Whenever one of the used observables is changed in the future, the same sideEffect will be run again. Returns a disposer function to cancel the side effect. @@ -350,14 +366,15 @@ Returns a disposer function to cancel the side effect. [«details»](autorun.md) **options** -- **`name?: string`**: A name for easier identification and debugging -- **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. -- **`onError?: (error) => void`**: error handler that will be triggered if the autorun function throws an exception -- **`scheduler?: (callback) => void`**: Set a custom scheduler to determine how re-running the autorun function should be scheduled -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the autorun +- **`name?: string`**: A name for easier identification and debugging +- **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. +- **`onError?: (error) => void`**: error handler that will be triggered if the autorun function throws an exception +- **`scheduler?: (callback) => void`**: Set a custom scheduler to determine how re-running the autorun function should be scheduled +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the autorun ### `when` + Usage: `when(() => condition, () => { sideEffect }, options)`. The condition expression will react automatically to any observables it uses. As soon as the expression returns true the sideEffect function will be invoked, but only once. @@ -371,12 +388,14 @@ If no effect function is passed to `when`, it will return a promise that can be [«details»](when.md). **options** -- **`name?: string`**: A name for easier identification and debugging -- **`onError?: (error) => void`**: error handler that will be triggered if the _predicate-function_ or the _effect-function_ throws an exception -- **`timeout: number`** a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the when + +- **`name?: string`**: A name for easier identification and debugging +- **`onError?: (error) => void`**: error handler that will be triggered if the _predicate-function_ or the _effect-function_ throws an exception +- **`timeout: number`** a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the when ### `reaction` + Usage: `reaction(() => data, data => { sideEffect }, options)`. A variation on `autorun` that gives more fine-grained control on which observables that will be tracked. It takes two function, the first one is tracked and returns data that is used as input for the second one, the side effect. @@ -386,11 +405,12 @@ The side effect can be debounced, just like `autorunAsync`. [«details»](reaction.md) **options** -- **`fireImmediately?: boolean`**: Wait for a change before firing the _effect function_. Defaults to `false`. -- **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. -- **`equals`**: Custom equality function to determine whether the expr function differed from it's previous result, and hence should fire effect. Accepts the same options as the equals option of `computed`. -- Also accepts all of the options from [`autorun`](#autorun) -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the reaction + +- **`fireImmediately?: boolean`**: Wait for a change before firing the _effect function_. Defaults to `false`. +- **`delay?: number`**: the sideEffect will be delayed and debounced with the given `delay`. Defaults to `0`. +- **`equals`**: Custom equality function to determine whether the expr function differed from it's previous result, and hence should fire effect. Accepts the same options as the equals option of `computed`. +- Also accepts all of the options from [`autorun`](#autorun) +- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the reaction ### `onReactionError` @@ -399,12 +419,12 @@ Usage: `onReactionError(handler: (error: any, derivation) => void)` This method attaches a global error listener, which is invoked for every error that is thrown from a _reaction_. This can be used for monitoring or test purposes. ------- +--- # Utilities _Here are some utilities that might make working with observable objects or computed values more convenient. -More, less trivial utilities can be found in the * [mobx-utils](https://github.com/mobxjs/mobx-utils) package._ +More, less trivial utilities can be found in the \* [mobx-utils](https://github.com/mobxjs/mobx-utils) package._ ### `Provider` (`mobx-react` package) @@ -413,54 +433,64 @@ Can be used to pass stores to child components using React's context mechanism. ### `inject` (`mobx-react` package) Higher order component and counterpart of `Provider`. Can be used to pick stores from React's context and pass it as props to the target component. Usage: -* `inject("store1", "store2")(observer(MyComponent))` -* `@inject("store1", "store2") @observer MyComponent` -* `@inject((stores, props, context) => props) @observer MyComponent` -* `@observer(["store1", "store2"]) MyComponent` is a shorthand for the the `@inject() @observer` combo. + +- `inject("store1", "store2")(observer(MyComponent))` +- `@inject("store1", "store2") @observer MyComponent` +- `@inject((stores, props, context) => props) @observer MyComponent` +- `@observer(["store1", "store2"]) MyComponent` is a shorthand for the the `@inject() @observer` combo. ### `toJS` + Usage: `toJS(observableDataStructure, options?)`. Converts observable data structures back to plain javascript objects, ignoring computed values. The `options` include: -- **`detectCycles: boolean`**: Checks for cyclical references in the observable data-structure. Defaults to `true`. -- **`exportMapsAsObjects: boolean`**: Treats ES6 Maps as regular objects for export. Defaults to `true` +- **`detectCycles: boolean`**: Checks for cyclical references in the observable data-structure. Defaults to `true`. +- **`exportMapsAsObjects: boolean`**: Treats ES6 Maps as regular objects for export. Defaults to `true` [«details»](tojson.md). ### `isObservable` and `isObservableProp` + Usage: `isObservable(thing)` or `isObservableProp(thing, property?)`. Returns true if the given thing, or the `property` of the given thing is observable. Works for all observables, computed values and disposer functions of reactions. [«details»](is-observable) ### `isObservableObject|Array|Map` and `isBoxedObservable` + Usage: `isObservableObject(thing)`, `isObservableArray(thing)`, `isObservableMap(thing)`, `isBoxedObservable(thing)`. Returns `true` if.., well, do the math. ### `isArrayLike` + Usage: `isArrayLike(thing)`. Returns `true` if the given thing is either a true JS-array or an observable (MobX-)array. This is intended as convenience/shorthand. Note that observable arrays can be `.slice()`d to turn them into true JS-arrays. ### `isAction` + Usage: `isAction(func)`. Returns true if the given function is wrapped / decorated with `action`. ### `isComputed` and `isComputedProp` + Usage: `isComputed(thing)` or `isComputedProp(thing, property?)`. Returns true if the given thing is a boxed computed value, or if the designated property is a computed value. ### `intercept` + Usage: `intercept(object, property?, interceptor)`. Api that can be used to intercept changes before they are applied to an observable api. Useful for validation, normalization or cancellation. [«details»](observe.md) ### `observe` + Usage: `observe(object, property?, listener, fireImmediately = false)` Low-level api that can be used to observe a single observable value. [«details»](observe.md) ### `onBecomeObserved` and `onBecomeUnobserved` + Usage: `onBecomeObserved(observable, property?, listener: () => void): (() => void)` and `onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` @@ -469,7 +499,6 @@ These functions are hooks into the observability system of MobX and get notified The return value is a _diposer-function_ that will detach the _listener_. ```javascript - export class City { @observable location @observable temperature @@ -478,8 +507,8 @@ export class City { constructor(location) { this.location = location // only start data fetching if temperature is actually used! - onBecomeObserved(this, 'temperature', this.resume) - onBecomeUnobserved(this, 'temperature', this.suspend) + onBecomeObserved(this, "temperature", this.resume) + onBecomeUnobserved(this, "temperature", this.suspend) } resume = () => { @@ -500,19 +529,21 @@ export class City { ``` ### `configure` + Usage: `configure(options)`. Sets global behavior settings on the active MobX instance. Use this to change how MobX behaves as a whole. ```javascript -import { configure } from "mobx"; +import { configure } from "mobx" configure({ // ... -}); +}) ``` #### `arrayBuffer: number` + Increases the default created size of observable arrays to `arrayBuffer`, if the maximum size isn't yet there. Observable arrays lazily create getters on members of `ObservableArray.prototype` starting at `0`. @@ -521,44 +552,49 @@ Use `arrayBuffer` if you know you'll have a common minimum array size and don't See also `observable`. #### `computedRequiresReaction: boolean` + Forbids the access of any unobserved computed value. Use this if you want to check whether you are using computed properties without a reactive context. ```javascript -configure({ computedRequiresReaction: true }); +configure({ computedRequiresReaction: true }) ``` #### `observableRequiresReaction: boolean` + Warns about any unobserved observable access. Use this if you want to check whether you are using observables without a reactive context (eg not inside an autorun, action, or react component without observer wrapping). ```javascript -configure({ observableRequiresReaction: true }); +configure({ observableRequiresReaction: true }) ``` #### `reactionRequiresObservable: boolean` + Warns when a reaction (eg `autorun`) is created without any observable access. Use this to check whether you are unneededly wrapping react components with `observer`, or to find possible related bugs. ```javascript -configure({ reactionRequiresObservable: true }); +configure({ reactionRequiresObservable: true }) ``` #### `computedConfigurable: boolean` -Allows overwriting computed values. This is useful for testing purposes *only*. Don't enable this - on production as it can cause memory-leaks. + +Allows overwriting computed values. This is useful for testing purposes _only_. Don't enable this +on production as it can cause memory-leaks. ```javascript -configure({ computedConfigurable: true }); +configure({ computedConfigurable: true }) ``` #### `disableErrorBoundaries: boolean` + By default, MobX will catch and rethrow exceptions happening in your code to make sure that a reaction in one exception does not prevent the scheduled execution of other, possibly unrelated, reactions. This means exceptions are not propagated back to the original causing code and therefore you won't be able to catch them using try/catch. There may be times when you want to catch those errors, for example when unit testing your reactions. You can disable this behaviour using `disableErrorBoundaries`. ```javascript -configure({ disableErrorBoundaries: true }); +configure({ disableErrorBoundaries: true }) ``` Please note that MobX won't recover from errors when using this configuration. For that reason, you may need to use `_resetGlobalState` after each exception. Example: @@ -566,28 +602,29 @@ Please note that MobX won't recover from errors when using this configuration. F ```js configure({ disableErrorBoundaries: true }) -test('Throw if age is negative', () => { - expect(() => { - const age = observable.box(10) - autorun(() => { if (age.get() < 0) throw new Error('Age should not be negative') }) - age.set(-1) - }).toThrow() - _resetGlobalState() // Needed after each exception +test("Throw if age is negative", () => { + expect(() => { + const age = observable.box(10) + autorun(() => { + if (age.get() < 0) throw new Error("Age should not be negative") + }) + age.set(-1) + }).toThrow() + _resetGlobalState() // Needed after each exception }) ``` > Prior to MobX 4, `_resetGlobalState` was `extras.resetGlobalState`. - #### `enforceActions` Also known as "strict mode". In strict mode, it is not allowed to change any state outside of an [`action`](action.md). Accepted values: -* `"never"` (default): State can be modified from anywhere -* `"observed"`: All state that is observed _somewhere_ needs to be changed through actions. This is the recommended strictness mode in non-trivial applications. -* `"always"`: State always needs be updated (which in practice also includes creation) in actions. +- `"never"` (default): State can be modified from anywhere +- `"observed"`: All state that is observed _somewhere_ needs to be changed through actions. This is the recommended strictness mode in non-trivial applications. +- `"always"`: State always needs be updated (which in practice also includes creation) in actions. #### `isolateGlobalState: boolean` @@ -598,10 +635,11 @@ The reactivity inside the library will remain self-contained when you call `conf Without this options, if multiple MobX instances are active, the internal state will be shared. The benefit is that observables from both instances work together, the downside is that the MobX versions have to match. ```javascript -configure({ isolateGlobalState: true }); +configure({ isolateGlobalState: true }) ``` #### `reactionScheduler: (f: () => void) => void` + Sets a new function that executes all MobX reactions. By default `reactionScheduler` just runs the `f` reaction without any other behavior. This can be useful for basic debugging, or slowing down reactions to visualize application updates. @@ -609,39 +647,42 @@ This can be useful for basic debugging, or slowing down reactions to visualize a ```javascript configure({ reactionScheduler: (f): void => { - console.log("Running an event after a delay:", f); - setTimeout(f, 100); + console.log("Running an event after a delay:", f) + setTimeout(f, 100) } -}); +}) ``` ## Direct Observable manipulation -There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. - * **`values(thing)`** returns all values in the collection as array - * **`keys(thing)`** returns all keys in the collection as array - * **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array - * **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). - * **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. - * **`has(thing, key)`** returns true if the collection has the specified _observable_ property. - * **`get(thing, key)`** returns the child under the specified key. +There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. +- **`values(thing)`** returns all values in the collection as array +- **`keys(thing)`** returns all keys in the collection as array +- **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array +- **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). +- **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. +- **`has(thing, key)`** returns true if the collection has the specified _observable_ property. +- **`get(thing, key)`** returns the child under the specified key. # Development utilities _The following api's might come in handy if you want to build cool tools on top of MobX or if you want to inspect the internal state of MobX_ ### `"mobx-react-devtools"` package + The mobx-react-devtools is a powerful package that helps you to investigate the performance and dependencies of your react components. Also has a powerful logger utility based on `spy`. [«details»](../best/devtools.md) ### `trace` + Usage: -* `trace(enterDebugger?)` -* `trace(Reaction object / ComputedValue object / disposer function, enterDebugger?)` -* `trace(object, computedValuePropertyName, enterDebugger?)` + +- `trace(enterDebugger?)` +- `trace(Reaction object / ComputedValue object / disposer function, enterDebugger?)` +- `trace(object, computedValuePropertyName, enterDebugger?)` `trace` is a small utility that you can use inside a computed value or reaction. If it is enabled, it will start logging when the value is being invalidated, and why. @@ -651,34 +692,41 @@ will break on the point where it is triggered. [«trace»](../best/trace.md) ### `spy` + Usage: `spy(listener)`. Registers a global spy listener that listens to all events that happen in MobX. -It is similar to attaching an `observe` listener to *all* observables at once, but also notifies about running (trans/re)actions and computations. +It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. Used for example by the `mobx-react-devtools`. [«details»](spy.md) ### `getAtom` + Usage: `getAtom(thing, property?)`. -Returns the backing *Atom* of a given observable object, property, reaction etc. +Returns the backing _Atom_ of a given observable object, property, reaction etc. ### `getDebugName` + Usage: `getDebugName(thing, property?)` Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the `mobx-react-devtools`. ### `getDependencyTree` + Usage: `getDependencyTree(thing, property?)`. Returns a tree structure with all observables the given reaction / computation currently depends upon. ### `getObserverTree` + Usage: `getObserverTree(thing, property?)`. Returns a tree structure with all reactions / computations that are observing the given observable. ### `"mobx-react"` development hooks + The `mobx-react` package exposes the following additional api's that are used by the `mobx-react-devtools`: -* `trackComponents()`: enables the tracking of `observer` based React components -* `renderReporter.on(callback)`: callback will be invoked on each rendering of an `observer` enabled React component, with timing information etc -* `componentByNodeRegistery`: ES6 WeakMap that maps from DOMNode to a `observer` based React component instance + +- `trackComponents()`: enables the tracking of `observer` based React components +- `renderReporter.on(callback)`: callback will be invoked on each rendering of an `observer` enabled React component, with timing information etc +- `componentByNodeRegistery`: ES6 WeakMap that maps from DOMNode to a `observer` based React component instance # Internal functions @@ -696,24 +744,23 @@ Note that `transaction` runs completely synchronously. Transactions can be nested. Only after completing the outermost `transaction` pending reactions will be run. ```javascript -import {observable, transaction, autorun} from "mobx"; +import { observable, transaction, autorun } from "mobx" -const numbers = observable([]); +const numbers = observable([]) -autorun(() => console.log(numbers.length, "numbers!")); +autorun(() => console.log(numbers.length, "numbers!")) // Prints: '0 numbers!' transaction(() => { - transaction(() => { - numbers.push(1); - numbers.push(2); - }); - numbers.push(3); -}); + transaction(() => { + numbers.push(1) + numbers.push(2) + }) + numbers.push(3) +}) // Prints: '3 numbers!' ``` - ### `untracked` Untracked allows you to run a piece of code without establishing observers. @@ -721,32 +768,31 @@ Like `transaction`, `untracked` is automatically applied by `(@)action`, so usua Example: ```javascript - const person = observable({ - firstName: "Michel", - lastName: "Weststrate" -}); + firstName: "Michel", + lastName: "Weststrate" +}) autorun(() => { - console.log( - person.lastName, - ",", - // this untracked block will return the person's firstName without establishing a dependency - untracked(() => person.firstName) - ); -}); + console.log( + person.lastName, + ",", + // this untracked block will return the person's firstName without establishing a dependency + untracked(() => person.firstName) + ) +}) // prints: Weststrate, Michel -person.firstName = "G.K."; +person.firstName = "G.K." // doesn't print! -person.lastName = "Chesterton"; +person.lastName = "Chesterton" // prints: Chesterton, G.K. ``` ### `createAtom` + Utility function that can be used to create your own observable data structures and hook them up to MobX. Used internally by all observable data types. [«details»](extending.md) - diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 4ed3f6622..579377176 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -5,52 +5,53 @@ hide_title: true --- ## Observable Arrays +
    Similar to objects, arrays can be made observable using `observable.array(values?)` or by passing an array to `observable`. This works recursively as well, so all (future) values of the array will also be observable. ```javascript -import {observable, autorun} from "mobx"; +import { observable, autorun } from "mobx" var todos = observable([ - { title: "Spoil tea", completed: true }, - { title: "Make coffee", completed: false } -]); + { title: "Spoil tea", completed: true }, + { title: "Make coffee", completed: false } +]) autorun(() => { - console.log("Remaining:", todos - .filter(todo => !todo.completed) - .map(todo => todo.title) - .join(", ") - ); -}); + console.log( + "Remaining:", + todos + .filter(todo => !todo.completed) + .map(todo => todo.title) + .join(", ") + ) +}) // Prints: 'Remaining: Make coffee' -todos[0].completed = false; +todos[0].completed = false // Prints: 'Remaining: Spoil tea, Make coffee' -todos[2] = { title: 'Take a nap', completed: false }; +todos[2] = { title: "Take a nap", completed: false } // Prints: 'Remaining: Spoil tea, Make coffee, Take a nap' -todos.shift(); +todos.shift() // Prints: 'Remaining: Make coffee, Take a nap' ``` - - Besides all built-in functions, the following goodies are available as well on observable arrays: -* `intercept(interceptor)`. Can be used to intercept any change before it is applied to the array. See [observe & intercept](observe.md) -* `observe(listener, fireImmediately? = false)` Listen to changes in this array. The callback will receive arguments that express an array splice or array change, conforming to [ES7 proposal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe). It returns a disposer function to stop the listener. -* `clear()` Remove all current entries from the array. -* `replace(newItems)` Replaces all existing entries in the array with new ones. -* `find(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.find` proposal. -* `findIndex(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.findIndex` proposal. -* `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. -* _[MobX 4 and lower]_ `peek()` Returns an array with all the values which can safely be passed to other libraries, similar to `slice()`. +- `intercept(interceptor)`. Can be used to intercept any change before it is applied to the array. See [observe & intercept](observe.md) +- `observe(listener, fireImmediately? = false)` Listen to changes in this array. The callback will receive arguments that express an array splice or array change, conforming to [ES7 proposal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe). It returns a disposer function to stop the listener. +- `clear()` Remove all current entries from the array. +- `replace(newItems)` Replaces all existing entries in the array with new ones. +- `find(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.find` proposal. +- `findIndex(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.findIndex` proposal. +- `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. +- _[MobX 4 and lower]_ `peek()` Returns an array with all the values which can safely be passed to other libraries, similar to `slice()`. -Unlike the built-in implementation of the functions `sort` and `reverse`, observableArray.sort and reverse will not change the array in-place, but only will return a sorted / reversed copy. From MobX 5 and higher this will show a warning. It is recommended to use `array.slice().sort()` instead. +Unlike the built-in implementation of the functions `sort` and `reverse`, observableArray.sort and reverse will not change the array in-place, but only will return a sorted / reversed copy. From MobX 5 and higher this will show a warning. It is recommended to use `array.slice().sort()` instead. ## `observable.array(values, { deep: false })` @@ -64,8 +65,8 @@ The `name` option can be used to give the array a friendly debug name, to be use ## Array limitations in MobX 4 and below Due to limitations of native arrays in ES5 `observable.array` will create a faux-array (array-like object) instead of a real array. -In practice, these arrays work just as fine as native arrays and all native methods are supported, including index assignments, up-to and including the length of the array. +In practice, these arrays work just as fine as native arrays and all native methods are supported, including index assignments, up-to and including the length of the array. -Bear in mind however that `Array.isArray(observable([]))` will yield `false`, which some native array manipulation methods require and which some external libraries may also require. -E.g. `[].concat(observable([]))` will not work as expected since the native array concat method expects the test to return `true`. +Bear in mind however that `Array.isArray(observable([]))` will yield `false`, which some native array manipulation methods require and which some external libraries may also require. +E.g. `[].concat(observable([]))` will not work as expected since the native array concat method expects the test to return `true`. So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 09f32c331..b2fc95f19 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -5,6 +5,7 @@ hide_title: true --- # Autorun +
    @@ -25,32 +26,35 @@ As a rule of thumb: use `autorun` if you have a function that should run automat Use `computed` for everything else. Autoruns are about initiating _effects_, not about producing new values. If a string is passed as first argument to `autorun`, it will be used as debug name. -The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it. The reaction itself will also be passed as the only argument to the function given to autorun, which allows you to manipulate it from within the autorun function. This means there are two ways you can dispose of the reaction when you no longer need it: +The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it. The reaction itself will also be passed as the only argument to the function given to autorun, which allows you to manipulate it from within the autorun function. This means there are two ways you can dispose of the reaction when you no longer need it: + ```javascript -const disposer = autorun( reaction => { /* do some stuff */ } ); -disposer(); +const disposer = autorun(reaction => { + /* do some stuff */ +}) +disposer() // or -autorun( reaction => { - /* do some stuff */ - reaction.dispose(); -} ); +autorun(reaction => { + /* do some stuff */ + reaction.dispose() +}) ``` Just like the [`@observer` decorator/function](./observer-component.md), `autorun` will only observe data that is used during the execution of the provided function. ```javascript -var numbers = observable([1,2,3]); -var sum = computed(() => numbers.reduce((a, b) => a + b, 0)); +var numbers = observable([1, 2, 3]) +var sum = computed(() => numbers.reduce((a, b) => a + b, 0)) -var disposer = autorun(() => console.log(sum.get())); +var disposer = autorun(() => console.log(sum.get())) // prints '6' -numbers.push(4); +numbers.push(4) // prints '10' -disposer(); -numbers.push(5); +disposer() +numbers.push(5) // won't print anything, nor is `sum` re-evaluated ``` @@ -58,20 +62,23 @@ numbers.push(5); Autorun accepts as the second argument an options object with the following optional options: -* `delay`: Number in milliseconds that can be used to debounce the effect function. If zero (the default), no debouncing will happen. -* `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -* `onError`: function that will handle the errors of this reaction, rather then propagating them. -* `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` +- `delay`: Number in milliseconds that can be used to debounce the effect function. If zero (the default), no debouncing will happen. +- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. +- `onError`: function that will handle the errors of this reaction, rather then propagating them. +- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` ## The `delay` option ```javascript -autorun(() => { - // Assuming that profile.asJson returns an observable Json representation of profile, - // send it to the server each time it is changed, but await at least 300 milliseconds before sending it. - // When sent, the latest value of profile.asJson will be used. - sendProfileToServer(profile.asJson); -}, { delay: 300 }); +autorun( + () => { + // Assuming that profile.asJson returns an observable Json representation of profile, + // send it to the server each time it is changed, but await at least 300 milliseconds before sending it. + // When sent, the latest value of profile.asJson will be used. + sendProfileToServer(profile.asJson) + }, + { delay: 300 } +) ``` ## The `onError` option @@ -87,15 +94,17 @@ Example: ```javascript const age = observable.box(10) -const dispose = autorun(() => { - if (age.get() < 0) - throw new Error("Age should not be negative") - console.log("Age", age.get()) -}, { - onError(e) { - window.alert("Please enter a valid age") +const dispose = autorun( + () => { + if (age.get() < 0) throw new Error("Age should not be negative") + console.log("Age", age.get()) + }, + { + onError(e) { + window.alert("Please enter a valid age") + } } -}) +) ``` A global onError handler can be set as well, use `onReactionError(handler)`. This can be useful in tests or for client side error monitoring. diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index ce4de4b79..927dd737b 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -5,6 +5,7 @@ hide_title: true --- ## Primitive values and references +
    All primitive values in JavaScript are immutable and hence per definition not observable. @@ -22,10 +23,11 @@ Furthermore you can register a callback using its `.observe` method to listen to But since MobX tracks changes to boxes automatically, in most cases it is better to use a reaction like [`mobx.autorun`](autorun.md) instead. So the signature of object returned by `observable.box(scalar)` is: -* `.get()` Returns the current value. -* `.set(value)` Replaces the currently stored value. Notifies all observers. -* `intercept(interceptor)`. Can be used to intercept changes before they are applied. See [observe & intercept](observe.md) -* `.observe(callback: (change) => void, fireImmediately = false): disposerFunction`. Registers an observer function that will fire each time the stored value is replaced. Returns a function to cancel the observer. See [observe & intercept](observe.md). The `change` parameter is an object containing both the `newValue` and `oldValue` of the observable. + +- `.get()` Returns the current value. +- `.set(value)` Replaces the currently stored value. Notifies all observers. +- `intercept(interceptor)`. Can be used to intercept changes before they are applied. See [observe & intercept](observe.md) +- `.observe(callback: (change) => void, fireImmediately = false): disposerFunction`. Registers an observer function that will fire each time the stored value is replaced. Returns a function to cancel the observer. See [observe & intercept](observe.md). The `change` parameter is an object containing both the `newValue` and `oldValue` of the observable. ### `observable.box(value, { deep: false })` @@ -34,18 +36,18 @@ Creates a box based on the [`ref`](modifiers.md) decorator. This means that any ### Example ```javascript -import {observable} from "mobx"; +import { observable } from "mobx" -const cityName = observable.box("Vienna"); +const cityName = observable.box("Vienna") -console.log(cityName.get()); +console.log(cityName.get()) // prints 'Vienna' cityName.observe(function(change) { - console.log(change.oldValue, "->", change.newValue); -}); + console.log(change.oldValue, "->", change.newValue) +}) -cityName.set("Amsterdam"); +cityName.set("Amsterdam") // prints 'Vienna -> Amsterdam' ``` diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index 04658709a..0a4dd2583 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -5,6 +5,7 @@ hide_title: true --- # (@)computed +
    @@ -22,8 +23,8 @@ Computed values can't be underestimated, as they help you to make your actual mo Besides that they are highly optimized, so use them wherever possible. Don't confuse `computed` with `autorun`. They are both reactively invoked expressions, -but use `@computed` if you want to reactively produce a *value* that can be used by other observers and -`autorun` if you don't want to produce a new value but rather want to achieve an *effect*. +but use `@computed` if you want to reactively produce a _value_ that can be used by other observers and +`autorun` if you don't want to produce a new value but rather want to achieve an _effect_. For example imperative side effects like logging, making network requests etc. Computed values are automatically derived from your state if any value that affects them changes. @@ -43,18 +44,18 @@ Note that `computed` properties are not enumerable. Nor can they be overwritten If you have [decorators enabled](../best/decorators.md) you can use the `@computed` decorator on any getter of a class property to declaratively create computed properties. ```javascript -import {observable, computed} from "mobx"; +import { observable, computed } from "mobx" class OrderLine { - @observable price = 0; - @observable amount = 1; + @observable price = 0 + @observable amount = 1 constructor(price) { - this.price = price; + this.price = price } @computed get total() { - return this.price * this.amount; + return this.price * this.amount } } ``` @@ -62,18 +63,18 @@ class OrderLine { Otherwise, use `decorate` to introduce them: ```javascript -import {decorate, observable, computed} from "mobx"; +import { decorate, observable, computed } from "mobx" class OrderLine { - price = 0; - amount = 1; + price = 0 + amount = 1 constructor(price) { - this.price = price; + this.price = price } get total() { - return this.price * this.amount; + return this.price * this.amount } } decorate(OrderLine, { @@ -95,7 +96,6 @@ const orderLine = observable.object({ }) ``` - ## Setters for computed values It is possible to define a setter for computed values as well. Note that these setters cannot be used to alter the value of the computed property directly, @@ -118,12 +118,13 @@ And similarly ```javascript class Foo { - @observable length = 2; + @observable length = 2 @computed get squared() { - return this.length * this.length; + return this.length * this.length } - set squared(value) { //this is automatically an action, no annotation necessary - this.length = Math.sqrt(value); + set squared(value) { + //this is automatically an action, no annotation necessary + this.length = Math.sqrt(value) } } ``` @@ -140,16 +141,14 @@ This form of `computed` is not used very often, but in some cases where you need Example: ```javascript -import {observable, computed} from "mobx"; -var name = observable.box("John"); +import { observable, computed } from "mobx" +var name = observable.box("John") -var upperCaseName = computed(() => - name.get().toUpperCase() -); +var upperCaseName = computed(() => name.get().toUpperCase()) -var disposer = upperCaseName.observe(change => console.log(change.newValue)); +var disposer = upperCaseName.observe(change => console.log(change.newValue)) -name.set("Dave"); +name.set("Dave") // prints: 'DAVE' ``` @@ -157,12 +156,12 @@ name.set("Dave"); When using `computed` as modifier or as box, it accepts a second options argument with the following optional arguments: -* `name`: String, the debug name used in spy and the MobX devtools -* `context`: The `this` that should be used in the provided expression -* `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the second argument passed to `computed` is a function, this is assumed to be a setter. -* `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` comes in handy if you want to use structural comparison to determine whether the new value is different from the previous value (and as a result notify observers). -* `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read it's value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it will cause the computed to throw, instead of doing an expensive re-evalution. -* `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can easily lead to memory leaks as it will result in every observable used by this computed value, keeping the computed value in memory!_ +- `name`: String, the debug name used in spy and the MobX devtools +- `context`: The `this` that should be used in the provided expression +- `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the second argument passed to `computed` is a function, this is assumed to be a setter. +- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` comes in handy if you want to use structural comparison to determine whether the new value is different from the previous value (and as a result notify observers). +- `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read it's value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it will cause the computed to throw, instead of doing an expensive re-evalution. +- `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can easily lead to memory leaks as it will result in every observable used by this computed value, keeping the computed value in memory!_ ## `@computed.struct` for structural comparison @@ -171,9 +170,10 @@ The `@computed` decorator does not take arguments. If you want to to create a co ## Built-in comparers MobX provides three built-in `comparer`s which should cover most needs: -- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. -- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. -- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. + +- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. +- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. +- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. ## Computed values run more often than expected @@ -191,8 +191,7 @@ Example: const x = observable(3) const y = observable(1) const divided = computed(() => { - if (y.get() === 0) - throw new Error("Division by zero") + if (y.get() === 0) throw new Error("Division by zero") return x.get() / y.get() }) @@ -208,7 +207,7 @@ divided.get() // Recovered; Returns 1.5 ## Computeds with arguments -Sometimes you might want to have a computed value that takes one or more arguments. +Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: ```typescript @@ -219,13 +218,13 @@ import { computedFn } from "mobx-utils" class Todos { @observable todos = [] - + getAllTodosByUser = computedFn(function getAllTodosByUser(userId) { return this.todos.filter(todo => todo.user === userId)) }) } ``` -Note: don't use arrow functions as the `this` would be incorrect. +Note: don't use arrow functions as the `this` would be incorrect. For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) diff --git a/docs/refguide/create-transformer.md b/docs/refguide/create-transformer.md index 3aa456f3e..f7d8d05f8 100644 --- a/docs/refguide/create-transformer.md +++ b/docs/refguide/create-transformer.md @@ -5,6 +5,7 @@ hide_title: true --- # createTransformer +
    Provided by the `mobx-utils` package. @@ -41,30 +42,30 @@ const store = observable({ boxes: [], arrows: [], selection: null -}); +}) /** Serialize store to json upon each change and push it onto the states list */ -const states = []; +const states = [] autorun(() => { - states.push(serializeState(store)); -}); + states.push(serializeState(store)) +}) const serializeState = createTransformer(store => ({ boxes: store.boxes.map(serializeBox), arrows: store.arrows.map(serializeArrow), selection: store.selection ? store.selection.id : null -})); +})) -const serializeBox = createTransformer(box => ({...box})); +const serializeBox = createTransformer(box => ({ ...box })) const serializeArrow = createTransformer(arrow => ({ id: arrow.id, to: arrow.to.id, from: arrow.from.id -})); +})) ``` In this example the state is serialized by composing three different transformation functions. @@ -72,18 +73,18 @@ The autorunner triggers the serialization of the `store` object, which in turn s Let's take closer look at the life of an imaginary example box#3. 1. The first time box#3 is passed by `map` to `serializeBox`, -the serializeBox transformation is executed and an entry containing box#3 and its serialized representation is added to the internal memoization table of `serializeBox`. + the serializeBox transformation is executed and an entry containing box#3 and its serialized representation is added to the internal memoization table of `serializeBox`. 2. Imagine that another box is added to the `store.boxes` list. -This would cause the `serializeState` function to re-compute, resulting in a complete remapping of all the boxes. -However, all the invocations of `serializeBox` will now return their old values from the memoization tables since their transformation functions didn't (need to) run again. + This would cause the `serializeState` function to re-compute, resulting in a complete remapping of all the boxes. + However, all the invocations of `serializeBox` will now return their old values from the memoization tables since their transformation functions didn't (need to) run again. 3. Secondly, if somebody changes a property of box#3 this will cause the application of the `serializeBox` to box#3 to re-compute, just like any other reactive function in MobX. -Since the transformation will now produce a new Json object based on box#3, all observers of that specific transformation will be forced to run again as well. -That's the `serializeState` transformation in this case. -`serializeState` will now produce a new value in turn and map all the boxes again. But except for box#3, all other boxes will be returned from the memoization table. + Since the transformation will now produce a new Json object based on box#3, all observers of that specific transformation will be forced to run again as well. + That's the `serializeState` transformation in this case. + `serializeState` will now produce a new value in turn and map all the boxes again. But except for box#3, all other boxes will be returned from the memoization table. 4. Finally, if box#3 is removed from `store.boxes`, `serializeState` will compute again. -But since it will no longer be using the application of `serializeBox` to box#3, -that reactive function will go back to non-reactive mode. -This signals the memoization table that the entry can be removed so that it is ready for GC. + But since it will no longer be using the application of `serializeBox` to box#3, + that reactive function will go back to non-reactive mode. + This signals the memoization table that the entry can be removed so that it is ready for GC. So effectively we have achieved state tracking using immutable, shared datas structures here. All boxes and arrows are mapped and reduced into single state tree. @@ -103,14 +104,13 @@ the `DisplayFolder` objects track the associated `Folder` objects themselves. In the following example all mutations to the `state` graph will be processed automatically. Some examples: + 1. Changing the name of a folder will update its own `path` property and the `path` property of all its descendants. 2. Collapsing a folder will remove all descendant `DisplayFolders` from the tree. 3. Expanding a folder will restore them again. 4. Setting a search filter will remove all nodes that do not match the filter, unless they have a descendant that matches the filter. 5. Etc. - - ```javascript var m = require('mobx') diff --git a/docs/refguide/expr.md b/docs/refguide/expr.md index d354647f1..299e5d988 100644 --- a/docs/refguide/expr.md +++ b/docs/refguide/expr.md @@ -4,21 +4,22 @@ hide_title: true --- # Expr +
    Provided by the `mobx-utils` package. -`expr` can be used to create temporary computed values inside computed values. +`expr` can be used to create temporary computed values inside computed values. Nesting computed values is useful to create cheap computations in order to prevent expensive computations from needing to run. In the following example, the expression prevents the `TodoView` component from being re-rendered if the selection changes elsewhere. Instead, the component will only re-render when the relevant todo is (de)selected, which happens much less frequently. ```javascript -const TodoView = observer(({todo, editorState}) => { - const isSelected = mobxUtils.expr(() => editorState.selection === todo); - return
    {todo.title}
    ; -}); +const TodoView = observer(({ todo, editorState }) => { + const isSelected = mobxUtils.expr(() => editorState.selection === todo) + return
    {todo.title}
    +}) ``` `expr(func)` is an alias for `computed(func).get()`. diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index f4b25049b..a8214e3c2 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -4,6 +4,7 @@ hide_title: true --- # extendObservable +
    `extendObservable(target, properties, decorators?, options?)` @@ -18,30 +19,34 @@ Use the `deep: false` option to make the new properties _shallow_. That is, prev ```javascript var Person = function(firstName, lastName) { - // initialize observable properties on a new instance - extendObservable(this, { - firstName: firstName, - lastName: lastName, - get fullName() { - return this.firstName + " " + this.lastName - }, - setFirstName(firstName) { - this.firstName = firstName - } - }, { - setFirstName: action - }); + // initialize observable properties on a new instance + extendObservable( + this, + { + firstName: firstName, + lastName: lastName, + get fullName() { + return this.firstName + " " + this.lastName + }, + setFirstName(firstName) { + this.firstName = firstName + } + }, + { + setFirstName: action + } + ) } -var matthew = new Person("Matthew", "Henry"); +var matthew = new Person("Matthew", "Henry") // add an observable property to an already observable object extendObservable(matthew, { - age: 353 -}); + age: 353 +}) ``` -Note: `observable.object(object)` is actually an alias for `extendObservable({}, object)`. +Note: `observable.object(object)` is actually an alias for `extendObservable({}, object)`. Note: `decorate` could be used to introduce observable properties to an object, similar to `extendObservable`. The difference is that `extendObservable` is designed to introduce properties directly on the target instance, where `decorate` introduces them on prototypes; you can either pass it a constructor function (class) directly, or an object that will act as prototype for others. diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 558288f51..7c360de2d 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -4,6 +4,7 @@ hide_title: true --- # Creating observable data structures and reactions +
    ## Atoms @@ -16,7 +17,6 @@ And MobX will signal the atom whenever it is used or no longer in use. _Tip: in many cases you can avoid the need to create your own atoms, by just creating a normal observable, and use the `onBecomeObserved` or `onBecomeUnobserved` utility to be notified when MobX starts tracking an observable_ - The following example demonstrates how you can create an observable `Clock`, which can be used in reactive functions, and returns the current date-time. This clock will only actually tick if it is observed by someone. @@ -24,70 +24,67 @@ This clock will only actually tick if it is observed by someone. The complete API of the `Atom` class is demonstrated by this example. ```javascript -import {createAtom, autorun} from "mobx"; +import { createAtom, autorun } from "mobx" class Clock { - atom; - intervalHandler = null; - currentDateTime; - - constructor() { - // creates an atom to interact with the MobX core algorithm - this.atom = createAtom( - // first param: a name for this atom, for debugging purposes - "Clock", - // second (optional) parameter: callback for when this atom transitions from unobserved to observed. - () => this.startTicking(), - // third (optional) parameter: callback for when this atom transitions from observed to unobserved - // note that the same atom transitions multiple times between these two states - () => this.stopTicking() - ); - } - - getTime() { - // let MobX know this observable data source has been used + atom + intervalHandler = null + currentDateTime + + constructor() { + // creates an atom to interact with the MobX core algorithm + this.atom = createAtom( + // first param: a name for this atom, for debugging purposes + "Clock", + // second (optional) parameter: callback for when this atom transitions from unobserved to observed. + () => this.startTicking(), + // third (optional) parameter: callback for when this atom transitions from observed to unobserved + // note that the same atom transitions multiple times between these two states + () => this.stopTicking() + ) + } + + getTime() { + // let MobX know this observable data source has been used // reportObserved will return true if the atom is currently being observed // by some reaction. // reportObserved will also trigger the onBecomeObserved event handler (startTicking) if needed - if (this.atom.reportObserved()) { - return this.currentDateTime; + if (this.atom.reportObserved()) { + return this.currentDateTime } else { // apparently getTime was called but not while a reaction is running. // So, nobody depends on this value, hence the onBecomeObserved handler (startTicking) won't be fired // Depending on the nature of your atom // it might behave differently in such circumstances // (like throwing an error, returning a default value etc) - return new Date(); + return new Date() } - } - - tick() { - this.currentDateTime = new Date(); - // let MobX know that this data source has changed - this.atom.reportChanged(); - } - - startTicking() { - this.tick(); // initial tick - this.intervalHandler = setInterval( - () => this.tick(), - 1000 - ); - } - - stopTicking() { - clearInterval(this.intervalHandler); - this.intervalHandler = null; - } + } + + tick() { + this.currentDateTime = new Date() + // let MobX know that this data source has changed + this.atom.reportChanged() + } + + startTicking() { + this.tick() // initial tick + this.intervalHandler = setInterval(() => this.tick(), 1000) + } + + stopTicking() { + clearInterval(this.intervalHandler) + this.intervalHandler = null + } } -const clock = new Clock(); +const clock = new Clock() -const disposer = autorun(() => console.log(clock.getTime())); +const disposer = autorun(() => console.log(clock.getTime())) // ... prints the time each second -disposer(); +disposer() // printing stops. If nobody else uses the same `clock` the clock will stop ticking as well. ``` diff --git a/docs/refguide/map.md b/docs/refguide/map.md index c270eb169..27f61964d 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -5,6 +5,7 @@ hide_title: true --- # Observable Maps +
    ## `observable.map(values, options?)` @@ -17,24 +18,26 @@ Using ES6 Map constructor you can initialize observable map using `observable(ne The following methods are exposed according to the [ES6 Map spec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): -* `has(key)` Returns whether this map has an entry with the provided key. Note that the presence of a key is an observable fact in itself. -* `set(key, value)`. Sets the given `key` to `value`. The provided key will be added to the map if it didn't exist yet. -* `delete(key)`. Deletes the given key and its value from the map. -* `get(key)`. Returns the value at the given key (or `undefined`). -* `keys()`. Returns an iterator over all keys present in this map. Insertion order is preserved. -* `values()`. Returns an iterator all values present in this map. Insertion order is preserved. -* `entries()`. Returns an iterator (insertion ordered) over array that for each key/value pair in the map contains an array `[key, value]`. -* `forEach(callback:(value, key, map) => void, thisArg?)`. Invokes the given callback for each key / value pair in the map. -* `clear()`. Removes all entries from this map. -* `size`. Returns the amount of entries in this map. +- `has(key)` Returns whether this map has an entry with the provided key. Note that the presence of a key is an observable fact in itself. +- `set(key, value)`. Sets the given `key` to `value`. The provided key will be added to the map if it didn't exist yet. +- `delete(key)`. Deletes the given key and its value from the map. +- `get(key)`. Returns the value at the given key (or `undefined`). +- `keys()`. Returns an iterator over all keys present in this map. Insertion order is preserved. +- `values()`. Returns an iterator all values present in this map. Insertion order is preserved. +- `entries()`. Returns an iterator (insertion ordered) over array that for each key/value pair in the map contains an array `[key, value]`. +- `forEach(callback:(value, key, map) => void, thisArg?)`. Invokes the given callback for each key / value pair in the map. +- `clear()`. Removes all entries from this map. +- `size`. Returns the amount of entries in this map. The following functions are not in the ES6 spec but are available in MobX: -* `toJS()`. Converts the observable map back to an normal Map. -* `toJSON()`. Returns a shallow plain object representation of this map. (For a deep copy use `mobx.toJS(map)`). -* `intercept(interceptor)`. Registers an interceptor that will be triggered before any changes are applied to the map. See [observe & intercept](observe.md). -* `observe(listener, fireImmediately?)`. Registers a listener that fires upon each change in this map, similarly to the events that are emitted for [Object.observe](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe). See [observe & intercept](observe.md) for more details. -* `merge(values)`. Copies all entries from the provided object into this map. `values` can be a plain object, array of entries or string-keyed ES6 Map. -* `replace(values)`. Replaces the entire contents of this map with the provided values. + +- `toJS()`. Converts the observable map back to an normal Map. +- `toJSON()`. Returns a shallow plain object representation of this map. (For a deep copy use `mobx.toJS(map)`). +- `intercept(interceptor)`. Registers an interceptor that will be triggered before any changes are applied to the map. See [observe & intercept](observe.md). +- `observe(listener, fireImmediately?)`. Registers a listener that fires upon each change in this map, similarly to the events that are emitted for [Object.observe](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe). See [observe & intercept](observe.md) for more details. +- `merge(values)`. Copies all entries from the provided object into this map. `values` can be a plain object, array of entries or string-keyed ES6 Map. +- `replace(values)`. Replaces the entire contents of this map with the provided values. + ## `observable.map(values, { deep: false })` Any values assigned to an observable map will be default passed through [`observable`](observable.md) to make them observable. diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 49e993759..b7f890a20 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -6,4 +6,3 @@ hide_title: true # MobX-utils [MobX-utils](https://github.com/mobxjs/mobx-utils) provides utility functions and common patterns for MobX. - diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index eac31323d..7aeea1209 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -5,59 +5,63 @@ hide_title: true --- # Decorators +
    In MobX there is a set of decorators that defines how observable properties will behave. -* `observable`: An alias for `observable.deep`. -* `observable.deep`: This is the default modifier, used by any observable. It clones and converts any (not yet observable) array, Map or plain object into it's observable counterpart upon assignment to the given property -* `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. -* `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is. -* `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value -* `computed`: Creates a derived property, see [`computed`](computed-decorator.md) -* `computed(options)`: Idem, sets additional options. -* `computed.struct`: Same as `computed`, but will only notify any of it's observers when the value produced by the view is _structurally_ different from the previous value -* `action`: Creates an action, see [`action`](action.md) -* `action(name)`: Creates an action, overrides the name -* `action.bound`: Creates an action, and binds `this` to the instance +- `observable`: An alias for `observable.deep`. +- `observable.deep`: This is the default modifier, used by any observable. It clones and converts any (not yet observable) array, Map or plain object into it's observable counterpart upon assignment to the given property +- `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. +- `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is. +- `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value +- `computed`: Creates a derived property, see [`computed`](computed-decorator.md) +- `computed(options)`: Idem, sets additional options. +- `computed.struct`: Same as `computed`, but will only notify any of it's observers when the value produced by the view is _structurally_ different from the previous value +- `action`: Creates an action, see [`action`](action.md) +- `action(name)`: Creates an action, overrides the name +- `action.bound`: Creates an action, and binds `this` to the instance Decorators can be used with the api's `decorate`, `observable.object`, `extendObservable` and `observable` (when creating objects) to specify how object members should behave. If no decorators are passed in, the default behavior is to use `observable.deep` for any key / value pair, and `computed` for getters. ```javascript -import {observable, autorun, action} from "mobx"; - -var person = observable({ - name: "John", - age: 42, - showAge: false, - - get labelText() { - return this.showAge ? `${this.name} (age: ${this.age})` : this.name; - }, - - // action: - setAge(age) { - this.age = age; +import { observable, autorun, action } from "mobx" + +var person = observable( + { + name: "John", + age: 42, + showAge: false, + + get labelText() { + return this.showAge ? `${this.name} (age: ${this.age})` : this.name + }, + + // action: + setAge(age) { + this.age = age + } + }, + { + setAge: action + // the other properties will default to observables / computed } -}, { - setAge: action - // the other properties will default to observables / computed -}); +) ``` ```javascript class Person { - name = "John" - age = 42 - showAge = false + name = "John" + age = 42 + showAge = false - get labelText() { - return this.showAge ? `${this.name} (age: ${this.age})` : this.name; - } + get labelText() { + return this.showAge ? `${this.name} (age: ${this.age})` : this.name + } setAge(age) { - this.age = age; + this.age = age } } // when using decorate, all fields should be specified (a class might have many more non-observable internal fields after all) @@ -102,12 +106,16 @@ Or with just ES5 syntax: ```javascript function Message() { - extendObservable(this, { - message: "Hello world", - author: null - }, { - author: observable.ref - }) + extendObservable( + this, + { + message: "Hello world", + author: null + }, + { + author: observable.ref + } + ) } ``` @@ -124,6 +132,7 @@ class AuthorStore { @observable.shallow authors = [] } ``` + In the above example an assignment of a plain array with authors to the `authors` will update the authors with an observable array, containing the original, non-observable authors. Note that `{ deep: false }` can be passed as option to `observable`, `observable.object`, `observable.array`, `observable.map` and `extendObservable` to create shallow collections. diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 0f294efed..94e46c90a 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -5,27 +5,27 @@ hide_title: true --- ## Direct Observable manipulation +
    There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. - * **`values(thing)`** returns all values in the collection as array - * **`keys(thing)`** returns all keys in the collection as array - * **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array +- **`values(thing)`** returns all values in the collection as array +- **`keys(thing)`** returns all keys in the collection as array +- **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array The following methods are not really necessary when using MobX 5, but can be used to achieve MobX-5-like behavior in MobX 4. - * **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). - * **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. - * **`has(thing, key)`** returns true if the collection has the specified _observable_ property. - * **`get(thing, key)`** returns the child under the specified key. - +- **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). +- **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. +- **`has(thing, key)`** returns true if the collection has the specified _observable_ property. +- **`get(thing, key)`** returns the child under the specified key. ```javascript import { get, set, observable, values } from "mobx" const twitterUrls = observable.object({ - "John": "twitter.com/johnny" + John: "twitter.com/johnny" }) autorun(() => { @@ -36,5 +36,5 @@ autorun(() => { console.log("All urls: " + values(twitterUrls).join(", ")) }) -set(twitterUrls, { "Sara" : "twitter.com/horsejs"}) +set(twitterUrls, { Sara: "twitter.com/horsejs" }) ``` diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 85fdf8bc4..86d767014 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -5,6 +5,7 @@ hide_title: true --- ## Observable Objects +
    Usage `observable.object(props, decorators?, options?)` @@ -14,43 +15,46 @@ If a plain JavaScript object is passed to `observable` all properties inside wil `observable` is by default applied recursively, so if one of the encountered values is an object or array, that value will be passed through `observable` as well. ```javascript -import {observable, autorun, action} from "mobx"; - -var person = observable({ - // observable properties: - name: "John", - age: 42, - showAge: false, - - // computed property: - get labelText() { - return this.showAge ? `${this.name} (age: ${this.age})` : this.name; - }, - - setAge(age) { - this.age = age; +import { observable, autorun, action } from "mobx" + +var person = observable( + { + // observable properties: + name: "John", + age: 42, + showAge: false, + + // computed property: + get labelText() { + return this.showAge ? `${this.name} (age: ${this.age})` : this.name + }, + + setAge(age) { + this.age = age + } + }, + { + setAge: action } -}, { - setAge: action -}); +) // object properties don't expose an 'observe' method, // but don't worry, 'mobx.autorun' is even more powerful -autorun(() => console.log(person.labelText)); +autorun(() => console.log(person.labelText)) -person.name = "Dave"; +person.name = "Dave" // prints: 'Dave' -person.setAge(21); +person.setAge(21) // etc ``` Some things to keep in mind when making objects observable: -* _[MobX 4 and lower]_ When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See this [blog post](https://medium.com/@trekinbami/observe-changes-in-dynamically-keyed-objects-with-mobx-and-react-24b4f857bae9) for the different options available to work with dynamically keyed objects in MobX 4 -* Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties. Either use the [`@observable`](observable.md) annotation or the [`extendObservable`](extend-observable.md) function. -* Property getters will be automatically turned into derived properties, just like [`@computed`](computed-decorator) would do. -* `observable` is applied recursively to a whole object graph automatically. Both on instantiation and to any new values that will be assigned to observable properties in the future. Observable will not recurse into non-plain objects. -* These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [decorators](modifiers.md) section. -* Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values -* Pass `{ name: "my object" }` to assign a friendly debug name to this object +- _[MobX 4 and lower]_ When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See this [blog post](https://medium.com/@trekinbami/observe-changes-in-dynamically-keyed-objects-with-mobx-and-react-24b4f857bae9) for the different options available to work with dynamically keyed objects in MobX 4 +- Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties. Either use the [`@observable`](observable.md) annotation or the [`extendObservable`](extend-observable.md) function. +- Property getters will be automatically turned into derived properties, just like [`@computed`](computed-decorator) would do. +- `observable` is applied recursively to a whole object graph automatically. Both on instantiation and to any new values that will be assigned to observable properties in the future. Observable will not recurse into non-plain objects. +- These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [decorators](modifiers.md) section. +- Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values +- Pass `{ name: "my object" }` to assign a friendly debug name to this object diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index ec7ba1d13..dca934150 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -5,6 +5,7 @@ hide_title: true --- # @observable +
    @@ -25,20 +26,19 @@ hide_title: true Hosted on egghead.io
    - Decorator that can be used on ES7- or TypeScript class properties to make them observable. The `@observable` can be used on instance fields and property getters. This offers fine-grained control on which parts of your object become observable. ```javascript -import { observable, computed } from "mobx"; +import { observable, computed } from "mobx" class OrderLine { - @observable price = 0; - @observable amount = 1; + @observable price = 0 + @observable amount = 1 @computed get total() { - return this.price * this.amount; + return this.price * this.amount } } ``` diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index a8223c6f2..7226c9d14 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -5,6 +5,7 @@ hide_title: true --- # observable +
    @@ -25,42 +26,42 @@ hide_title: true Hosted on egghead.io
    - - Usage: -* `observable(value)` -* `@observable classProperty = value` + +- `observable(value)` +- `@observable classProperty = value` Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. -The following conversion rules are applied, but can be fine-tuned by using *modifiers*. See below. +The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. -1. If *value* is an ES6 `Map`: a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -1. If *value* is an ES6 `Set`: a new Observable Set will be returned. -1. If *value* is an array, a new [Observable Array](array.md) will be returned. -1. If *value* is an object *without* prototype, all its current properties will be made observable. See [Observable Object](object.md) -1. If *value* is an object *with* a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `extendObservable` in the constructor, or `@observable` / `decorate` in its class definition instead. +1. If _value_ is an ES6 `Map`: a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. +1. If _value_ is an ES6 `Set`: a new Observable Set will be returned. +1. If _value_ is an array, a new [Observable Array](array.md) will be returned. +1. If _value_ is an object _without_ prototype, all its current properties will be made observable. See [Observable Object](object.md) +1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `extendObservable` in the constructor, or `@observable` / `decorate` in its class definition instead. These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. Some notes: -* To use the `@observable` decorator, make sure that [decorators are enabled](observable-decorator.md) in your transpiler (babel or typescript). -* By default, making a data structure observable is *infective*; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using *modifiers*. -* _[MobX 4 and lower]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. + +- To use the `@observable` decorator, make sure that [decorators are enabled](observable-decorator.md) in your transpiler (babel or typescript). +- By default, making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using _modifiers_. +- _[MobX 4 and lower]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. Some examples: ```javascript -const map = observable.map({ key: "value"}); -map.set("key", "new value"); +const map = observable.map({ key: "value" }) +map.set("key", "new value") -const list = observable([1, 2, 4]); -list[2] = 3; +const list = observable([1, 2, 4]) +list[2] = 3 const person = observable({ firstName: "Clive Staples", lastName: "Lewis" -}); -person.firstName = "C.S."; +}) +person.firstName = "C.S." -const temperature = observable.box(20); -temperature.set(25); +const temperature = observable.box(20) +temperature.set(25) ``` diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index d790d0928..cf02f7d4c 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -5,21 +5,24 @@ hide_title: true --- # Intercept & Observe +
    -`observe` and `intercept` can be used to monitor the changes of a single observable (they ***don't*** track nested observables). +`observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). `intercept` can be used to detect and modify mutations before they are applied to the observable. `observe` allows you to intercept changes after they have been made. ## Intercept + Usage: `intercept(target, propertyName?, interceptor)` -* `target`: the observable to guard -* `propertyName`: optional parameter to specify a specific property to intercept. Note that `intercept(user.name, interceptor)` is fundamentally different from `intercept(user, "name", interceptor)`. The first tries to add an interceptor to the _current_ `value` inside `user.name` (which might not be an observable at all), the latter intercepts changes to the `name` _property_ of `user`. -* `interceptor`: callback that will be invoked for *each* change that is made to the observable. Receives a single change object describing the mutation. +- `target`: the observable to guard +- `propertyName`: optional parameter to specify a specific property to intercept. Note that `intercept(user.name, interceptor)` is fundamentally different from `intercept(user, "name", interceptor)`. The first tries to add an interceptor to the _current_ `value` inside `user.name` (which might not be an observable at all), the latter intercepts changes to the `name` _property_ of `user`. +- `interceptor`: callback that will be invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation. The `intercept` should tell MobX what needs to happen with the current change. Therefore it should do one of the following things: + 1. Return the received `change` object as-is from the function, in which case the mutation will be applied. 2. Modify the `change` object and return it, for example to normalize the data. Not all fields are modifiable, see below. 3. Return `null`, this indicates that the change can be ignored and shouldn't be applied. This is a powerful concept to make your objects for example temporarily immutable. @@ -34,35 +37,36 @@ In that case the parent object interceptors are run before the property intercep ```javascript const theme = observable({ - backgroundColor: "#ffffff" + backgroundColor: "#ffffff" }) const disposer = intercept(theme, "backgroundColor", change => { - if (!change.newValue) { - // ignore attempts to unset the background color - return null; - } - if (change.newValue.length === 6) { - // correct missing '#' prefix - change.newValue = '#' + change.newValue; - return change; - } - if (change.newValue.length === 7) { - // this must be a properly formatted color code! - return change; - } - if (change.newValue.length > 10) disposer(); // stop intercepting future changes - throw new Error("This doesn't like a color at all: " + change.newValue); + if (!change.newValue) { + // ignore attempts to unset the background color + return null + } + if (change.newValue.length === 6) { + // correct missing '#' prefix + change.newValue = "#" + change.newValue + return change + } + if (change.newValue.length === 7) { + // this must be a properly formatted color code! + return change + } + if (change.newValue.length > 10) disposer() // stop intercepting future changes + throw new Error("This doesn't like a color at all: " + change.newValue) }) ``` ## Observe + Usage: `observe(target, propertyName?, listener, invokeImmediately?)` -* `target`: the observable to observe -* `propertyName`: optional parameter to specify a specific property to observe. Note that `observe(user.name, listener)` is fundamentally different from `observe(user, "name", listener)`. The first observes the _current_ `value` inside `user.name` (which might not be an observable at all), the latter observes the `name` _property_ of `user`. -* `listener`: callback that will be invoked for *each* change that is made to the observable. Receives a single change object describing the mutation, except for boxed observables, which will invoke the ` listener` two parameters: `newValue, oldValue`. -* `invokeImmediately`: by default false. Set it to true if you want `observe` to invoke `listener` directly with the state of the observable (instead of waiting for the first change). Not supported (yet) by all kinds of observables. +- `target`: the observable to observe +- `propertyName`: optional parameter to specify a specific property to observe. Note that `observe(user.name, listener)` is fundamentally different from `observe(user, "name", listener)`. The first observes the _current_ `value` inside `user.name` (which might not be an observable at all), the latter observes the `name` _property_ of `user`. +- `listener`: callback that will be invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation, except for boxed observables, which will invoke the `listener` two parameters: `newValue, oldValue`. +- `invokeImmediately`: by default false. Set it to true if you want `observe` to invoke `listener` directly with the state of the observable (instead of waiting for the first change). Not supported (yet) by all kinds of observables. The function returns a `disposer` function that can be used to cancel the observer. Note that `transaction` does not affect the working of the `observe` method(s). @@ -74,62 +78,64 @@ _`observe` reacts to *mutations*, when they are being made, while reactions like Example: ```javascript -import {observable, observe} from 'mobx'; +import { observable, observe } from "mobx" const person = observable({ - firstName: "Maarten", - lastName: "Luther" -}); + firstName: "Maarten", + lastName: "Luther" +}) -const disposer = observe(person, (change) => { - console.log(change.type, change.name, "from", change.oldValue, "to", change.object[change.name]); -}); +const disposer = observe(person, change => { + console.log(change.type, change.name, "from", change.oldValue, "to", change.object[change.name]) +}) -person.firstName = "Martin"; +person.firstName = "Martin" // Prints: 'update firstName from Maarten to Martin' -disposer(); +disposer() // Ignore any future updates // observe a single field -const disposer2 = observe(person, "lastName", (change) => { - console.log("LastName changed to ", change.newValue); -}); +const disposer2 = observe(person, "lastName", change => { + console.log("LastName changed to ", change.newValue) +}) ``` + Related blog: [Object.observe is dead. Long live mobx.observe](https://medium.com/@mweststrate/object-observe-is-dead-long-live-mobservable-observe-ad96930140c5) ## Event overview The callbacks of `intercept` and `observe` will receive an event object which has at least the following properties: -* `object`: the observable triggering the event -* `type`: (string) the type of the current event + +- `object`: the observable triggering the event +- `type`: (string) the type of the current event These are the additional fields that are available per type: -| observable type | event type | property | description | available during intercept | can be modified by intercept | -| -- | --- | ---| --| --| -- | -| Object | add | name | name of the property being added | √ | | -| | | newValue | the new value being assigned | √ | √ | -| | update\* | name | name of the property being updated | √ | | -| | | newValue | the new value being assigned | √ | √ | -| | | oldValue | the value that is replaced | | | -| Array | splice | index | starting index of the splice. Splices are also fired by `push`, `unshift`, `replace` etc. | √ | | -| | | removedCount | amount of items being removed | √ | √ | -| | | added | array with items being added | √ | √ | -| | | removed | array with items that were removed | | | -| | | addedCount | amount of items that were added | | | -| | update | index | index of the single entry that is being updated | √ | | -| | | newValue | the newValue that is / will be assigned | √ | √ | -| | | oldValue | the old value that was replaced | | | -| Map | add | name | the name of the entry that was added | √ | | -| | | newValue | the new value that is being assigned | √ | √ | -| | update | name | the name of the entry that is being updated | √ | | -| | | newValue | the new value that is being assigned | √ | √ | -| | | oldValue | the value that has been replaced | | | -| | delete | name | the name of the entry that is being removed | √ | | -| | | oldValue | the value of the entry that was removed | | | -| Boxed & computed observables | create | newValue | the value that was assigned during creation. Only available as `spy` event for boxed observables | | | -| | update | newValue | the new value being assigned | √ | √ | -| | | oldValue | the previous value of the observable | | | +| observable type | event type | property | description | available during intercept | can be modified by intercept | +| ---------------------------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------ | -------------------------- | ---------------------------- | +| Object | add | name | name of the property being added | √ | | +| | | newValue | the new value being assigned | √ | √ | +| | update\* | name | name of the property being updated | √ | | +| | | newValue | the new value being assigned | √ | √ | +| | | oldValue | the value that is replaced | | | +| Array | splice | index | starting index of the splice. Splices are also fired by `push`, `unshift`, `replace` etc. | √ | | +| | | removedCount | amount of items being removed | √ | √ | +| | | added | array with items being added | √ | √ | +| | | removed | array with items that were removed | | | +| | | addedCount | amount of items that were added | | | +| | update | index | index of the single entry that is being updated | √ | | +| | | newValue | the newValue that is / will be assigned | √ | √ | +| | | oldValue | the old value that was replaced | | | +| Map | add | name | the name of the entry that was added | √ | | +| | | newValue | the new value that is being assigned | √ | √ | +| | update | name | the name of the entry that is being updated | √ | | +| | | newValue | the new value that is being assigned | √ | √ | +| | | oldValue | the value that has been replaced | | | +| | delete | name | the name of the entry that is being removed | √ | | +| | | oldValue | the value of the entry that was removed | | | +| Boxed & computed observables | create | newValue | the value that was assigned during creation. Only available as `spy` event for boxed observables | | | +| | update | newValue | the new value being assigned | √ | √ | +| | | oldValue | the previous value of the observable | | | _\* Note that object `update` events won't fire for updated computated values (as those aren't mutations). But it is possible to observe them by explicitly subscribing to the specific property using `observe(object, 'computedPropertyName', listener)`._ diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md index 239d79c4a..66e9059de 100644 --- a/docs/refguide/observer-component.md +++ b/docs/refguide/observer-component.md @@ -5,6 +5,7 @@ hide_title: true --- # @observer +
    @@ -24,18 +25,18 @@ It is available through the separate `mobx-react` package. import { observer } from "mobx-react" var timerData = observable({ - secondsPassed: 0 + secondsPassed: 0 }) setInterval(() => { - timerData.secondsPassed++ + timerData.secondsPassed++ }, 1000) @observer class Timer extends React.Component { - render() { - return Seconds passed: {this.props.timerData.secondsPassed} - } + render() { + return Seconds passed: {this.props.timerData.secondsPassed} + } } ReactDOM.render(, document.body) @@ -71,9 +72,7 @@ The above timer widget could also be written using stateless function components ```javascript import { observer } from "mobx-react" -const Timer = observer(({ timerData }) => ( - Seconds passed: {timerData.secondsPassed} -)) +const Timer = observer(({ timerData }) => Seconds passed: {timerData.secondsPassed} ) ``` ## Observable local component state @@ -91,17 +90,17 @@ import { observable } from "mobx" @observer class Timer extends React.Component { - @observable secondsPassed = 0 + @observable secondsPassed = 0 - componentWillMount() { - setInterval(() => { - this.secondsPassed++ - }, 1000) - } + componentWillMount() { + setInterval(() => { + this.secondsPassed++ + }, 1000) + } - render() { - return Seconds passed: {this.secondsPassed} - } + render() { + return Seconds passed: {this.secondsPassed} + } } ReactDOM.render(, document.body) @@ -171,10 +170,10 @@ See the relevant [section](../best/react-performance.md). ## Characteristics of observer components -- Observer only subscribe to the data structures that were actively used during the last render. This means that you cannot under-subscribe or over-subscribe. You can even use data in your rendering that will only be available at later moment in time. This is ideal for asynchronously loading data. -- You are not required to declare what data a component will use. Instead, dependencies are determined at runtime and tracked in a very fine-grained manner. -- Usually reactive components have no or little state, as it is often more convenient to encapsulate (view) state in objects that are shared with other component. But you are still free to use state. -- `@observer` implements `shouldComponentUpdate` in the same way as `PureComponent` so that children are not re-rendered unnecessary. -- Reactive components sideways load data; parent components won't re-render unnecessarily even when child components will. -- `@observer` does not depend on React's context system. -- In mobx-react@4+, the props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component. If you have a reaction (i.e. `autorun`) inside your `@observer` component that must _not_ be re-evaluated when the specific props it uses don't change, be sure to derefence those specific props for use inside your reaction (i.e. `const myProp = props.myProp`). Otherwise, if you reference `props.myProp` inside the reaction, then a change in _any_ of the props will cause the reaction to be re-evaluated. For a typical use case with React-Router, see [this article](https://alexhisen.gitbooks.io/mobx-recipes/content/observable-based-routing.html). +- Observer only subscribe to the data structures that were actively used during the last render. This means that you cannot under-subscribe or over-subscribe. You can even use data in your rendering that will only be available at later moment in time. This is ideal for asynchronously loading data. +- You are not required to declare what data a component will use. Instead, dependencies are determined at runtime and tracked in a very fine-grained manner. +- Usually reactive components have no or little state, as it is often more convenient to encapsulate (view) state in objects that are shared with other component. But you are still free to use state. +- `@observer` implements `shouldComponentUpdate` in the same way as `PureComponent` so that children are not re-rendered unnecessary. +- Reactive components sideways load data; parent components won't re-render unnecessarily even when child components will. +- `@observer` does not depend on React's context system. +- In mobx-react@4+, the props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component. If you have a reaction (i.e. `autorun`) inside your `@observer` component that must _not_ be re-evaluated when the specific props it uses don't change, be sure to derefence those specific props for use inside your reaction (i.e. `const myProp = props.myProp`). Otherwise, if you reference `props.myProp` inside the reaction, then a change in _any_ of the props will cause the reaction to be re-evaluated. For a typical use case with React-Router, see [this article](https://alexhisen.gitbooks.io/mobx-recipes/content/observable-based-routing.html). diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index e6bcd1951..c428bfdca 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -5,22 +5,23 @@ hide_title: true --- # Reaction +
    Usage: `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. A variation on `autorun` that gives more fine grained control on which observables will be tracked. -It takes two functions, the first one (the *data* function) is tracked and returns data that is used as input for the second one, the *effect* function. +It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. Any observables that are accessed while executing the side effect will not be tracked. `reaction` returns a disposer function. -The second function (the *effect* function) passed to `reaction` will receive two arguments when invoked. -The first argument is the value returned by the *data* function. The second argument is the current reaction, +The second function (the _effect_ function) passed to `reaction` will receive two arguments when invoked. +The first argument is the value returned by the _data_ function. The second argument is the current reaction, which can be used to dispose the `reaction` during execution. -It is important to notice that the side effect will *only* react to data that was *accessed* in the data expression, which might be less than the data that is actually used in the effect. +It is important to notice that the side effect will _only_ react to data that was _accessed_ in the data expression, which might be less than the data that is actually used in the effect. Also, the side effect will only be triggered when the data returned by the expression has changed. In other words: reaction requires you to produce the things you need in your side effect. @@ -28,12 +29,12 @@ In other words: reaction requires you to produce the things you need in your sid Reaction accepts a third argument as an options object with the following optional options: -* `fireImmediately`: Boolean that indicates that the effect function should immediately be triggered after the first run of the data function. `false` by default. -* `delay`: Number in milliseconds that can be used to debounce the effect function. If zero (the default), no debouncing will happen. -* `equals`: `comparer.default` by default. If specified, this comparer function will be used to compare the previous and next values produced by the *data* function. The *effect* function will only be invoked if this function returns false. If specified, this will override `compareStructural`. -* `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -* `onError`: function that will handle the errors of this reaction, rather then propagating them. -* `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled +- `fireImmediately`: Boolean that indicates that the effect function should immediately be triggered after the first run of the data function. `false` by default. +- `delay`: Number in milliseconds that can be used to debounce the effect function. If zero (the default), no debouncing will happen. +- `equals`: `comparer.default` by default. If specified, this comparer function will be used to compare the previous and next values produced by the _data_ function. The _effect_ function will only be invoked if this function returns false. If specified, this will override `compareStructural`. +- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. +- `onError`: function that will handle the errors of this reaction, rather then propagating them. +- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled ## Example @@ -46,32 +47,30 @@ See also [what will MobX React to?](../best/react). const todos = observable([ { title: "Make coffee", - done: true, + done: true }, { title: "Find biscuit", done: false } -]); +]) // wrong use of reaction: reacts to length changes, but not to title changes! const reaction1 = reaction( () => todos.length, length => console.log("reaction 1:", todos.map(todo => todo.title).join(", ")) -); +) // correct use of reaction: reacts to length and title changes const reaction2 = reaction( () => todos.map(todo => todo.title), titles => console.log("reaction 2:", titles.join(", ")) -); +) // autorun reacts to just everything that is used in its function -const autorun1 = autorun( - () => console.log("autorun 1:", todos.map(todo => todo.title).join(", ")) -); +const autorun1 = autorun(() => console.log("autorun 1:", todos.map(todo => todo.title).join(", "))) -todos.push({ title: "explain reactions", done: false }); +todos.push({ title: "explain reactions", done: false }) // prints: // reaction 1: Make coffee, find biscuit, explain reactions // reaction 2: Make coffee, find biscuit, explain reactions @@ -88,26 +87,26 @@ When invoked `reaction`, second argument can use as disposer. The following example shows a `reaction` that is invoked only once. ```javascript -const counter = observable({ count: 0 }); +const counter = observable({ count: 0 }) // invoke once of and dispose reaction: reacts to observable value. const reaction3 = reaction( () => counter.count, (count, reaction) => { - console.log("reaction 3: invoked. counter.count = " + count); - reaction.dispose(); + console.log("reaction 3: invoked. counter.count = " + count) + reaction.dispose() } -); +) -counter.count = 1; +counter.count = 1 // prints: // reaction 3: invoked. counter.count = 1 -counter.count = 2; +counter.count = 2 // prints: // (There are no logging, because of reaction disposed. But, counter continue reaction) -console.log(counter.count); +console.log(counter.count) // prints: // 2 ``` diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 613739876..b2c8e6738 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -5,17 +5,19 @@ hide_title: true --- # Spy +
    Usage: `spy(listener)`. Registers a global spy listener that listens to all events that happen in MobX. -It is similar to attaching an `observe` listener to *all* observables at once, but also notifies about running (trans/re)actions and computations. +It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. Used for example by the `mobx-react-devtools`. Example usage of spying all actions: + ```javascript -spy((event) => { - if (event.type === 'action') { +spy(event => { + if (event.type === "action") { console.log(`${event.name} with args: ${event.arguments}`) } }) @@ -23,21 +25,21 @@ spy((event) => { Spy listeners always receive one object, which usually has at least a `type` field. The following events are emitted by default by spy. -| event | fields | nested | -| --- | --- |--- | -| action | name, object (scope), arguments | yes | -| scheduled-reaction | name | no | -| reaction | name | yes -| compute | name | no -| error | message | no | -| update (array) | object (the array), index, newValue, oldValue | yes -| update (map) | object (observable map instance), name, newValue, oldValue | yes -| update (object) | object (instance), name, newValue, oldValue | yes -| splice (array) | object (the array), index, added, removed, addedCount, removedCount | yes -| add (map) | object, name, newValue | yes -| add (object) | object, name, newValue | yes -| delete (map) | object, name, oldValue | yes -| create (boxed observable) | object (ObservableValue instance), newValue | yes | +| event | fields | nested | +| ------------------------- | ------------------------------------------------------------------- | ------ | +| action | name, object (scope), arguments | yes | +| scheduled-reaction | name | no | +| reaction | name | yes | +| compute | name | no | +| error | message | no | +| update (array) | object (the array), index, newValue, oldValue | yes | +| update (map) | object (observable map instance), name, newValue, oldValue | yes | +| update (object) | object (instance), name, newValue, oldValue | yes | +| splice (array) | object (the array), index, added, removed, addedCount, removedCount | yes | +| add (map) | object, name, newValue | yes | +| add (object) | object, name, newValue | yes | +| delete (map) | object, name, oldValue | yes | +| create (boxed observable) | object (ObservableValue instance), newValue | yes | Note that there are events with the signature `{ spyReportEnd: true, time? }`. These events might not have a `type` field, but they are part of an earlier fired event that had `spyReportStart: true`. @@ -46,4 +48,4 @@ This event might report the total execution time as well. The spy events for observable values are identical to the events passed to `observe`. See [intercept & observe](observe.md) for an extensive overview. -In production builds, the `spy` API is a no-op as it will be minimized away. \ No newline at end of file +In production builds, the `spy` API is a no-op as it will be minimized away. diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 0c9894a4e..c552d1d8e 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -5,6 +5,7 @@ hide_title: true --- # toJS +
    `toJS(value, options?)` @@ -15,21 +16,22 @@ Computed values and other non-enumerable properties won't be part of the result. Cycles are detected and properly supported by default, but this can be disabled to improve performance. `toJS` accepts three options - 1. `exportMapsAsObjects` whether to serialize observable maps to objects (`true`) or javascript Map objects (`false`) default `true`. - 2. `detectCycles` if a cycle is detected, reuse the already serialized object. Which prevents endless recursion. Default `true`. - 3. `recurseEverything` detects and converts observable objects that are "behind" non-observable objects. + +1. `exportMapsAsObjects` whether to serialize observable maps to objects (`true`) or javascript Map objects (`false`) default `true`. +2. `detectCycles` if a cycle is detected, reuse the already serialized object. Which prevents endless recursion. Default `true`. +3. `recurseEverything` detects and converts observable objects that are "behind" non-observable objects. For more complex (de)serialization scenario's, one can use [serializr](https://github.com/mobxjs/serializr) ```javascript var obj = mobx.observable({ x: 1 -}); +}) -var clone = mobx.toJS(obj); +var clone = mobx.toJS(obj) -console.log(mobx.isObservableObject(obj)); // true -console.log(mobx.isObservableObject(clone)); // false +console.log(mobx.isObservableObject(obj)) // true +console.log(mobx.isObservableObject(clone)) // false ``` Note: this method was named `toJSON` before MobX 2.2 diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 17add9d46..96b9572f8 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -5,6 +5,7 @@ hide_title: true --- # when +
    @@ -27,22 +28,22 @@ For example: ```javascript class MyResource { - constructor() { - when( - // once... - () => !this.isVisible, - // ... then - () => this.dispose() - ); - } - - @computed get isVisible() { - // indicate whether this item is visible - } - - dispose() { - // dispose - } + constructor() { + when( + // once... + () => !this.isVisible, + // ... then + () => this.dispose() + ) + } + + @computed get isVisible() { + // indicate whether this item is visible + } + + dispose() { + // dispose + } } ``` diff --git a/package.json b/package.json index 0f55b708d..051f9007d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "test:flow": "node_modules/.bin/flow check", "test:performance": "PERSIST=true time node --expose-gc test/perf/index.js", "test:ci": "yarn test:all && yarn test:performance && yarn test -i --coverage && yarn test:webpack && yarn size", - "prettier": "prettier \"**/*.js\" \"**/*.jsx\" \"**/*.tsx\" \"**/*.ts\"", + "prettier": "prettier \"**/*.js\" \"**/*.jsx\" \"**/*.tsx\" \"**/*.ts\" \"docs/**/*.md\"", "_prepublish": "yarn small-build", "quick-build": "tsc --pretty", "small-build": "node scripts/build.js", @@ -99,7 +99,7 @@ "data flow" ], "lint-staged": { - "*.{ts,tsx,js,jsx}": [ + "*.{ts,tsx,js,jsx,md}": [ "prettier --write", "git add" ] diff --git a/src/api/object-api.ts b/src/api/object-api.ts index 5e1416085..7fee148e6 100644 --- a/src/api/object-api.ts +++ b/src/api/object-api.ts @@ -65,7 +65,9 @@ export function values(obj: any): string[] { export function entries(map: ObservableMap): ReadonlyArray<[K, T]> export function entries(set: ObservableSet): ReadonlyArray<[T, T]> export function entries(ar: IObservableArray): ReadonlyArray<[number, T]> -export function entries(obj: T): ReadonlyArray<[string, T extends object ? T[keyof T] : any]> +export function entries( + obj: T +): ReadonlyArray<[string, T extends object ? T[keyof T] : any]> export function entries(obj: any): any { if (isObservableObject(obj)) { return keys(obj).map(key => [key, obj[key]]) diff --git a/src/api/observable.ts b/src/api/observable.ts index 1bf55bff1..744890768 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -69,8 +69,8 @@ function getEnhancerFromOptions(options: CreateObservableOptions): IEnhancer -
    - - {this.props.config.footerIcon && ( - {this.props.config.title} - )} - - -
    -
    Community
    - {/* + render() { + return ( + - ); - } + + Stack Overflow + + Project Chat +
    +
    +
    More
    + + Star + + {this.props.config.twitterUsername && ( + + )} + {this.props.config.facebookAppId && ( +
    +
    +
    + )} +
    +
    + + ) + } } -module.exports = Footer; +module.exports = Footer From 8d653d1211723356d5a776d25b9adfa56965e51b Mon Sep 17 00:00:00 2001 From: Daniel K Date: Wed, 9 Oct 2019 10:42:02 +0200 Subject: [PATCH 0151/1043] Remove obsolete donation info (#2144) --- README.md | 14 +++++--------- docs/README.md | 4 ---- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 415468d4a..87666eb31 100644 --- a/README.md +++ b/README.md @@ -50,12 +50,12 @@ _Tip: Consider using the faster and smaller ES6 build if targetting a modern env - All modern browsers are supported. - MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). In practice this means: - - no Internet Explorer (Edge is fine) - - Node.js >= 6 + - no Internet Explorer (Edge is fine) + - Node.js >= 6 - React Native: - - iOS >= 10 - - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) - - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) (Use MobX 4 instead) + - iOS >= 10 + - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) + - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) (Use MobX 4 instead) - MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). - The latest versions of libraries like mobx-react, mobx-react-lite, mobx-state-tree etc are kept compatible with both MobX 4 and 5. @@ -430,10 +430,6 @@ Support us with a monthly donation and help us continue our activities. [[Become -One time donations through paypal are welcome as well and are recorded in the [sponsors](sponsors.md) list. - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://mobxjs.github.io/mobx/donate.html) - ### Sponsors Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/mobx#sponsor)] diff --git a/docs/README.md b/docs/README.md index 9278da605..db9accecf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -420,10 +420,6 @@ Support us with a monthly donation and help us continue our activities. [[Become -One time donations through paypal are welcome as well and are recorded in the [sponsors](sponsors.md) list. - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://mobxjs.github.io/mobx/donate.html) - ### Sponsors Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/mobx#sponsor)] From eae6d5b67dbb60b4fd14b6f1d9f74deafd9d4a72 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 11 Oct 2019 00:12:24 +0100 Subject: [PATCH 0152/1043] chore: updated sponsor section --- README.md | 9 ++++++--- docs/README.md | 5 ++++- docs/assets/bugsnag.jpg | Bin 0 -> 11369 bytes docs/assets/dazn.png | Bin 0 -> 14480 bytes docs/assets/frontendmasters.jpg | Bin 0 -> 14052 bytes 5 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 docs/assets/bugsnag.jpg create mode 100644 docs/assets/dazn.png create mode 100644 docs/assets/frontendmasters.jpg diff --git a/README.md b/README.md index 87666eb31..d0b6e55db 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,16 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo Canva Guilded mantro GmbH -CodeFirst -Blokt +CodeFirst +Blokt +Bugsnag -**🥉Bronze sponsors:**
    +**🥉Bronze sponsors (\$500+ total contributions):**
    Coinbase Algolia talentplot +Frontend Masters +DAZN # Installation diff --git a/docs/README.md b/docs/README.md index db9accecf..f23d5e960 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,11 +33,14 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo mantro GmbH CodeFirst Blokt +Bugsnag -**🥉Bronze sponsors:**
    +**🥉Bronze sponsors (\$500+ total contributions):**
    Coinbase Algolia talentplot +Frontend Masters +DAZN # Installation diff --git a/docs/assets/bugsnag.jpg b/docs/assets/bugsnag.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13ce42b75853acbe779cf19a7db5e68e36e4e8ed GIT binary patch literal 11369 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 literal 0 HcmV?d00001 diff --git a/docs/assets/dazn.png b/docs/assets/dazn.png new file mode 100644 index 0000000000000000000000000000000000000000..e58f1e19a4e6855712d71656cb8b87e7026d2e25 GIT binary patch literal 14480 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 wHZcpS}UvI`X5q1JswHgp0VRJ-9p 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 Xk4KFi#Qf(rxAip2L_hPyrMv$FkvQTe literal 0 HcmV?d00001 diff --git a/docs/assets/frontendmasters.jpg b/docs/assets/frontendmasters.jpg new file mode 100644 index 0000000000000000000000000000000000000000..613ce309ae6b317e2b15b496aefcb3d02a86ee1e GIT binary patch literal 14052 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 literal 0 HcmV?d00001 From 0502539d510bd06a587d229b4b16a6edd454295c Mon Sep 17 00:00:00 2001 From: Finn Woelm Date: Fri, 11 Oct 2019 08:02:10 +0200 Subject: [PATCH 0153/1043] Docs: Fix title of @observable page (#2149) The page title for the @observable page in the "Making Things observable"-section was missing an 'r'. --- docs/refguide/observable-decorator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md index dca934150..d21fc27a2 100644 --- a/docs/refguide/observable-decorator.md +++ b/docs/refguide/observable-decorator.md @@ -1,5 +1,5 @@ --- -title: @obsevable +title: @observable sidebar_label: @observable hide_title: true --- From fc70ee3e7596159ce9ac588f070ee4058aca5b2b Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Fri, 11 Oct 2019 16:26:18 +0200 Subject: [PATCH 0154/1043] add shallow comparer --- docs/refguide/api.md | 2 +- docs/refguide/computed-decorator.md | 3 ++- src/utils/comparer.ts | 7 ++++++- src/utils/eq.ts | 21 ++++++++++++--------- test/base/extras.js | 26 ++++++++++++++++++++++++++ 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 4b3630538..307dbd52a 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -237,7 +237,7 @@ The expression will automatically be re-evaluated if any observables it uses cha There are various `options` that can be used to control the behavior of `computed`. These include: -- **`equals: (value, value) => boolean`** Comparison method can be used to override the default detection on when something is changed. Built-in comparers are: `comparer.identity`, `comparer.default`, `comparer.structural`. +- **`equals: (value, value) => boolean`** Comparison method can be used to override the default detection on when something is changed. Built-in comparers are: `comparer.identity`, `comparer.default`, `comparer.structural`, `comparer.shallow`. - **`name: string`** Provide a debug name to this computed property - **`requiresReaction: boolean`** Wait for a change in value of the tracked observables, before recomputing the derived property - **`get: () => value)`** Override the getter for the computed property. diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed-decorator.md index 0a4dd2583..5b1ec5b32 100644 --- a/docs/refguide/computed-decorator.md +++ b/docs/refguide/computed-decorator.md @@ -159,7 +159,7 @@ When using `computed` as modifier or as box, it accepts a second options argumen - `name`: String, the debug name used in spy and the MobX devtools - `context`: The `this` that should be used in the provided expression - `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the second argument passed to `computed` is a function, this is assumed to be a setter. -- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` comes in handy if you want to use structural comparison to determine whether the new value is different from the previous value (and as a result notify observers). +- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). - `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read it's value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it will cause the computed to throw, instead of doing an expensive re-evalution. - `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can easily lead to memory leaks as it will result in every observable used by this computed value, keeping the computed value in memory!_ @@ -174,6 +174,7 @@ MobX provides three built-in `comparer`s which should cover most needs: - `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. - `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. - `comparer.structural`: Performs deep structural comparison to determine if two values are the same. +- `comparer.shallow`: Performs shallow structural comparison to determine if two values are the same. ## Computed values run more often than expected diff --git a/src/utils/comparer.ts b/src/utils/comparer.ts index fc90ddec9..057f3809d 100644 --- a/src/utils/comparer.ts +++ b/src/utils/comparer.ts @@ -12,6 +12,10 @@ function structuralComparer(a: any, b: any): boolean { return deepEqual(a, b) } +function shallowComparer(a: any, b: any): boolean { + return deepEqual(a, b, 1) +} + function defaultComparer(a: any, b: any): boolean { return Object.is(a, b) } @@ -19,5 +23,6 @@ function defaultComparer(a: any, b: any): boolean { export const comparer = { identity: identityComparer, structural: structuralComparer, - default: defaultComparer + default: defaultComparer, + shallow: shallowComparer } diff --git a/src/utils/eq.ts b/src/utils/eq.ts index 5c820d705..83935c8de 100644 --- a/src/utils/eq.ts +++ b/src/utils/eq.ts @@ -9,13 +9,13 @@ import { declare const Symbol const toString = Object.prototype.toString -export function deepEqual(a: any, b: any): boolean { - return eq(a, b) +export function deepEqual(a: any, b: any, depth: number = -1): boolean { + return eq(a, b, depth) } // Copied from https://github.com/jashkenas/underscore/blob/5c237a7c682fb68fd5378203f0bf22dce1624854/underscore.js#L1186-L1289 // Internal recursive comparison function for `isEqual`. -function eq(a: any, b: any, aStack?: any[], bStack?: any[]) { +function eq(a: any, b: any, depth: number, aStack?: any[], bStack?: any[]) { // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). if (a === b) return a !== 0 || 1 / a === 1 / b @@ -26,11 +26,7 @@ function eq(a: any, b: any, aStack?: any[], bStack?: any[]) { // Exhaust primitive checks const type = typeof a if (type !== "function" && type !== "object" && typeof b != "object") return false - return deepEq(a, b, aStack, bStack) -} -// Internal recursive comparison function for `isEqual`. -function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { // Unwrap any wrapped objects. a = unwrap(a) b = unwrap(b) @@ -84,6 +80,13 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { return false } } + + if (depth === 0) { + return false + } else if (depth < 0) { + depth = -1 + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. @@ -109,7 +112,7 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { if (length !== b.length) return false // Deep compare the contents, ignoring non-numeric properties. while (length--) { - if (!eq(a[length], b[length], aStack, bStack)) return false + if (!eq(a[length], b[length], depth - 1, aStack, bStack)) return false } } else { // Deep compare objects. @@ -121,7 +124,7 @@ function deepEq(a: any, b: any, aStack?: any[], bStack?: any[]) { while (length--) { // Deep compare each member key = keys[length] - if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false + if (!(has(b, key) && eq(a[key], b[key], depth - 1, aStack, bStack))) return false } } // Remove the first object from the stack of traversed objects. diff --git a/test/base/extras.js b/test/base/extras.js index c54bdf60f..20c8e3834 100644 --- a/test/base/extras.js +++ b/test/base/extras.js @@ -487,3 +487,29 @@ test("deepEquals should yield correct results for complex objects #1118 - 2", () expect(mobx.comparer.structural(a1, a2)).toBe(true) expect(mobx.comparer.structural(a1, a4)).toBe(false) }) + +test("comparer.shallow should work", () => { + const sh = mobx.comparer.shallow + + expect(sh(1, 1)).toBe(true) + + expect(sh(1, 2)).toBe(false) + + expect(sh({}, {})).toBe(true) + expect(sh([], [])).toBe(true) + + expect(sh({}, [])).toBe(false) + expect(sh([], {})).toBe(false) + + expect(sh({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).toBe(true) + + expect(sh({ a: 1, b: 2, c: 3, d: 4 }, { a: 1, b: 2, c: 3 })).toBe(false) + expect(sh({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3, d: 4 })).toBe(false) + expect(sh({ a: {}, b: 2, c: 3 }, { a: {}, b: 2, c: 3 })).toBe(false) + + expect(sh([1, 2, 3], [1, 2, 3])).toBe(true) + + expect(sh([1, 2, 3, 4], [1, 2, 3])).toBe(false) + expect(sh([1, 2, 3], [1, 2, 3, 4])).toBe(false) + expect(sh([{}, 2, 3], [{}, 2, 3])).toBe(false) +}) From 90058177ebfd3b10ab087532f54bc10ceb6c12f6 Mon Sep 17 00:00:00 2001 From: xaviergonz Date: Fri, 11 Oct 2019 17:19:56 +0200 Subject: [PATCH 0155/1043] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cb135243..743551019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +* Added `comparer.shallow` for shallow object/array comparisons [#1561](https://github.com/mobxjs/mobx/issues/1561). + # 5.14.0 / 4.14.0 * Added experimental `reactionRequiresObservable` & `observableRequiresReaction` config [#2079](https://github.com/mobxjs/mobx/pull/2079), [Docs](https://github.com/mobxjs/mobx/pull/2082) From b3ba4794f191cb67afe813e0df011705d39bc191 Mon Sep 17 00:00:00 2001 From: Javier Gonzalez Date: Sat, 12 Oct 2019 11:19:31 +0200 Subject: [PATCH 0156/1043] fix for 2135 (#2136) --- CHANGELOG.md | 1 + src/core/action.ts | 15 ++++++++++----- src/core/globalstate.ts | 10 ---------- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 743551019..55d55cedf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* Fixed a possible issue with action stack errors and multiple mobx versions installed at the same time [#2135](https://github.com/mobxjs/mobx/issues/2135). * Added `comparer.shallow` for shallow object/array comparisons [#1561](https://github.com/mobxjs/mobx/issues/1561). # 5.14.0 / 4.14.0 diff --git a/src/core/action.ts b/src/core/action.ts index ddff349b3..8e8d27552 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -13,6 +13,11 @@ import { } from "../internal" import { allowStateReadsStart, allowStateReadsEnd } from "./derivation" +// we don't use globalState for these in order to avoid possible issues with multiple +// mobx versions +let currentActionId = 0 +let nextActionId = 1 + export interface IAction { isMobxAction: boolean } @@ -78,18 +83,18 @@ export function _startAction(actionName: string, scope: any, args?: IArguments): prevAllowStateReads, notifySpy, startTime, - actionId: globalState.nextActionId++, - parentActionId: globalState.currentActionId + actionId: nextActionId++, + parentActionId: currentActionId } - globalState.currentActionId = runInfo.actionId + currentActionId = runInfo.actionId return runInfo } export function _endAction(runInfo: IActionRunInfo) { - if (globalState.currentActionId !== runInfo.actionId) { + if (currentActionId !== runInfo.actionId) { fail("invalid action stack. did you forget to finish an action?") } - globalState.currentActionId = runInfo.parentActionId + currentActionId = runInfo.parentActionId if (runInfo.error !== undefined) { globalState.suppressReactionErrors = true diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 8399d8444..3c4971823 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -139,16 +139,6 @@ export class MobXGlobals { * they are not the cause, see: https://github.com/mobxjs/mobx/issues/1836 */ suppressReactionErrors = false - - /* - * Current action id. - */ - currentActionId = 0 - - /* - * Next action id. - */ - nextActionId = 1 } let canMergeGlobalState = true From c88be973add151af6088178abf103ddf0d69f9e1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 14 Oct 2019 20:31:31 +0100 Subject: [PATCH 0157/1043] restored getting-started --- docs/LINKS.md | 2 +- docs/README.md | 2 +- docs/intro/concepts.md | 2 +- website/i18n/en.json | 2 +- .../getting-started-assets/babel.min.js | 47067 ++++++++++++++++ .../static/getting-started-assets/derive.jpg | Bin 0 -> 695962 bytes .../getting-started-assets/images/bg_hr.png | Bin 0 -> 78 bytes .../images/blacktocat.png | Bin 0 -> 463 bytes .../getting-started-assets/images/dust.png | Bin 0 -> 91761 bytes .../getting-started-assets/images/favicon.png | Bin 0 -> 526 bytes .../images/icon_download.png | Bin 0 -> 216 bytes .../images/mobservable.png | Bin 0 -> 3902 bytes .../images/sprite_download.png | Bin 0 -> 14832 bytes .../javascripts/JSXTransformer.js | 17664 ++++++ .../codemirror/javascript/index.html | 114 + .../codemirror/javascript/javascript.js | 894 + .../codemirror/javascript/json-ld.html | 72 + .../javascripts/codemirror/javascript/test.js | 252 + .../codemirror/javascript/typescript.html | 61 + .../javascripts/codemirror/theme/xq-light.css | 43 + .../javascripts/jquery-2.1.4.min.js | 4913 ++ .../javascripts/mobx-react.js | 213 + .../javascripts/mobx.umd.js | 2043 + .../javascripts/react-with-addons.js | 23256 ++++++++ .../getting-started-assets/overview.png | Bin 0 -> 41750 bytes .../static/getting-started-assets/script.js | 135 + .../static/getting-started-assets/style.css | 177 + .../stylesheets/github-light.css | 116 + .../stylesheets/stylesheet.css | 476 + website/static/getting-started.html | 528 + 30 files changed, 98028 insertions(+), 4 deletions(-) create mode 100755 website/static/getting-started-assets/babel.min.js create mode 100755 website/static/getting-started-assets/derive.jpg create mode 100755 website/static/getting-started-assets/images/bg_hr.png create mode 100755 website/static/getting-started-assets/images/blacktocat.png create mode 100755 website/static/getting-started-assets/images/dust.png create mode 100755 website/static/getting-started-assets/images/favicon.png create mode 100755 website/static/getting-started-assets/images/icon_download.png create mode 100755 website/static/getting-started-assets/images/mobservable.png create mode 100755 website/static/getting-started-assets/images/sprite_download.png create mode 100755 website/static/getting-started-assets/javascripts/JSXTransformer.js create mode 100755 website/static/getting-started-assets/javascripts/codemirror/javascript/index.html create mode 100755 website/static/getting-started-assets/javascripts/codemirror/javascript/javascript.js create mode 100755 website/static/getting-started-assets/javascripts/codemirror/javascript/json-ld.html create mode 100755 website/static/getting-started-assets/javascripts/codemirror/javascript/test.js create mode 100755 website/static/getting-started-assets/javascripts/codemirror/javascript/typescript.html create mode 100755 website/static/getting-started-assets/javascripts/codemirror/theme/xq-light.css create mode 100755 website/static/getting-started-assets/javascripts/jquery-2.1.4.min.js create mode 100755 website/static/getting-started-assets/javascripts/mobx-react.js create mode 100755 website/static/getting-started-assets/javascripts/mobx.umd.js create mode 100755 website/static/getting-started-assets/javascripts/react-with-addons.js create mode 100755 website/static/getting-started-assets/overview.png create mode 100755 website/static/getting-started-assets/script.js create mode 100755 website/static/getting-started-assets/style.css create mode 100755 website/static/getting-started-assets/stylesheets/github-light.css create mode 100755 website/static/getting-started-assets/stylesheets/stylesheet.css create mode 100755 website/static/getting-started.html diff --git a/docs/LINKS.md b/docs/LINKS.md index 3ac6232f3..8c9b2e509 100644 --- a/docs/LINKS.md +++ b/docs/LINKS.md @@ -2,7 +2,7 @@ # Resources -- [Ten minute interactive introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html#demo) +- [Ten minute interactive introduction to MobX and React](https://mobx.js.org/getting-started.html#demo) - How MobX works: [In depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.wnlo6bw8y) - Clone the boilerplate repository containing the above example from: https://github.com/mweststrate/react-mobservable-boilerplate. - Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). diff --git a/docs/README.md b/docs/README.md index f23d5e960..040aa46e9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -64,7 +64,7 @@ _Tip: the main entry point of the MobX 5 package ships with ES5 code for backwar ## Getting started - egghead.io course -- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started.html) +- [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started.html) - [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) - Videos: diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 3b93710c6..0fc6bc90e 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -93,4 +93,4 @@ todoStore.todos[0].completed = true // -> synchronously prints 'Completed 1 of 1 items' ``` -In the [10 minute introduction to MobX and React](https://mobxjs.github.io/mobx/getting-started.html) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. +In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started.html) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. diff --git a/website/i18n/en.json b/website/i18n/en.json index d2461925d..2fe332c3f 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -121,7 +121,7 @@ "sidebar_label": "objects" }, "refguide/observable-decorator": { - "title": "@obsevable", + "title": "@observable", "sidebar_label": "@observable" }, "refguide/observable": { diff --git a/website/static/getting-started-assets/babel.min.js b/website/static/getting-started-assets/babel.min.js new file mode 100755 index 000000000..53d978c2b --- /dev/null +++ b/website/static/getting-started-assets/babel.min.js @@ -0,0 +1,47067 @@ +!(function(e, t) { + "object" == typeof exports && "object" == typeof module + ? (module.exports = t()) + : "function" == typeof define && define.amd + ? define([], t) + : "object" == typeof exports + ? (exports.Babel = t()) + : (e.Babel = t()) +})(this, function() { + return (function(e) { + function t(n) { + if (r[n]) return r[n].exports + var i = (r[n] = { exports: {}, id: n, loaded: !1 }) + return e[n].call(i.exports, i, i.exports, t), (i.loaded = !0), i.exports + } + var r = {} + return (t.m = e), (t.c = r), (t.p = ""), t(0) + })( + (function(e) { + for (var t in e) + if (Object.prototype.hasOwnProperty.call(e, t)) + switch (typeof e[t]) { + case "function": + break + case "object": + e[t] = (function(t) { + var r = t.slice(1), + n = e[t[0]] + return function(e, t, i) { + n.apply(this, [e, t, i].concat(r)) + } + })(e[t]) + break + default: + e[t] = e[e[t]] + } + return e + })([ + function(e, t, r) { + "use strict" + function n(e) { + if (e && e.__esModule) return e + var t = {} + if (null != e) + for (var r in e) Object.prototype.hasOwnProperty.call(e, r) && (t[r] = e[r]) + return (t["default"] = e), t + } + function i(e) { + var t = (e.presets || []).map(function(e) { + if ("string" == typeof e) { + var t = p[e] + if (!t) + throw new Error( + 'Invalid preset specified in Babel options: "' + e + '"' + ) + return t + } + return e + }), + r = (e.plugins || []).map(function(e) { + if ("string" == typeof e) { + var t = c[e] + if (!t) + throw new Error( + 'Invalid plugin specified in Babel options: "' + e + '"' + ) + return t + } + return e + }) + return o({}, e, { presets: t, plugins: r }) + } + function s(e, t) { + return l.transform(e, i(t)) + } + function a(e, t, r) { + return l.transformFromAst(t, i(r)) + } + Object.defineProperty(t, "__esModule", { value: !0 }), + (t.version = t.availablePresets = t.availablePlugins = void 0) + var o = + Object.assign || + function(e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t] + for (var n in r) + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]) + } + return e + } + ;(t.transform = s), (t.transformFromAst = a) + var u = r(2503), + l = n(u), + c = (t.availablePlugins = { + "check-es2015-constants": r(566), + "external-helpers-2": r(2715), + "syntax-async-functions": r(567), + "syntax-async-generators": r(2716), + "syntax-class-constructor-call": r(1426), + "syntax-class-properties": r(1427), + "syntax-decorators": r(1428), + "syntax-do-expressions": r(1429), + "syntax-exponentiation-operator": r(1430), + "syntax-export-extensions": r(1431), + "syntax-flow": r(822), + "syntax-function-bind": r(1432), + "syntax-jsx": r(823), + "syntax-object-rest-spread": r(1433), + "syntax-trailing-function-commas": r(1434), + "transform-async-functions": r(2717), + "transform-async-to-generator": r(1435), + "transform-async-to-module-method": r(2935), + "transform-class-constructor-call": r(1539), + "transform-class-properties": r(1577), + "transform-decorators": r(1621), + "transform-decorators-legacy": r(3373)["default"], + "transform-do-expressions": r(1672), + "transform-es2015-arrow-functions": r(616), + "transform-es2015-block-scoped-functions": r(617), + "transform-es2015-block-scoping": r(618), + "transform-es2015-classes": r(628), + "transform-es2015-computed-properties": r(640), + "transform-es2015-destructuring": r(643), + "transform-es2015-for-of": r(644), + "transform-es2015-function-name": r(645), + "transform-es2015-instanceof": r(4439), + "transform-es2015-literals": r(657), + "transform-es2015-modules-amd": r(1818), + "transform-es2015-modules-commonjs": r(1053), + "transform-es2015-modules-systemjs": r(4820), + "transform-es2015-modules-umd": r(5077), + "transform-es2015-object-super": r(694), + "transform-es2015-parameters": r(705), + "transform-es2015-shorthand-properties": r(715), + "transform-es2015-spread": r(722), + "transform-es2015-sticky-regex": r(723), + "transform-es2015-template-literals": r(730), + "transform-es2015-typeof-symbol": r(731), + "transform-es2015-unicode-regex": r(733), + "transform-es3-member-expression-literals": r(6110), + "transform-es3-property-literals": r(6111), + "transform-es5-property-mutators": r(6112), + "transform-eval": r(6306), + "transform-exponentiation-operator": r(2261), + "transform-export-extensions": r(2300), + "transform-flow-strip-types": r(2301), + "transform-function-bind": r(2302), + "transform-inline-environment-variables": r(6459), + "transform-jscript": r(6460), + "transform-member-expression-literals": r(6461), + "transform-merge-sibling-variables": r(6462), + "transform-minify-booleans": r(6463), + "transform-node-env-inline": r(6464), + "transform-object-assign": r(6465), + "transform-object-rest-spread": r(2303), + "transform-object-set-prototype-of-to-assign": r(6466), + "transform-property-literals": r(6467), + "transform-proto-to-assign": r(6468), + "transform-react-constant-elements": r(6473), + "transform-react-display-name": r(2304), + "transform-react-inline-elements": r(6475), + "transform-react-jsx": r(2342), + "transform-react-jsx-compat": r(6476), + "transform-react-jsx-source": r(6628), + "transform-regenerator": r(767), + "transform-remove-console": r(6964), + "transform-remove-debugger": r(6965), + "transform-runtime": r(6967), + "transform-simplify-comparison-operators": r(6969), + "transform-strict-mode": r(1328), + "transform-undefined-to-void": r(7120), + "undeclared-variables-check": r(7121) + }), + p = (t.availablePresets = { + es2015: r(7124), + react: r(7276), + "stage-0": r(7277), + "stage-1": r(2499), + "stage-2": r(2500), + "stage-3": r(2501), + "es2015-no-commonjs": { + plugins: [ + r(730), + r(657), + r(645), + r(616), + r(617), + r(628), + r(694), + r(715), + r(640), + r(644), + r(723), + r(733), + r(566), + r(722), + r(705), + r(643), + r(618), + r(731), + [r(767), { async: !1, asyncGenerators: !1 }] + ] + }, + "es2015-loose": { + plugins: [ + [r(730), { loose: !0 }], + r(657), + r(645), + r(616), + r(617), + [r(628), { loose: !0 }], + r(694), + r(715), + [r(640), { loose: !0 }], + [r(644), { loose: !0 }], + r(723), + r(733), + r(566), + [r(722), { loose: !0 }], + r(705), + [r(643), { loose: !0 }], + r(618), + r(731), + [r(767), { async: !1, asyncGenerators: !1 }] + ] + } + }) + t.version = l.version + }, + function(e, t) { + function r() { + ;(l = !1), a.length ? (u = a.concat(u)) : (c = -1), u.length && n() + } + function n() { + if (!l) { + var e = setTimeout(r) + l = !0 + for (var t = u.length; t; ) { + for (a = u, u = []; ++c < t; ) a && a[c].run() + ;(c = -1), (t = u.length) + } + ;(a = null), (l = !1), clearTimeout(e) + } + } + function i(e, t) { + ;(this.fun = e), (this.array = t) + } + function s() {} + var a, + o = (e.exports = {}), + u = [], + l = !1, + c = -1 + ;(o.nextTick = function(e) { + var t = new Array(arguments.length - 1) + if (arguments.length > 1) + for (var r = 1; r < arguments.length; r++) t[r - 1] = arguments[r] + u.push(new i(e, t)), 1 !== u.length || l || setTimeout(n, 0) + }), + (i.prototype.run = function() { + this.fun.apply(null, this.array) + }), + (o.title = "browser"), + (o.browser = !0), + (o.env = {}), + (o.argv = []), + (o.version = ""), + (o.versions = {}), + (o.on = s), + (o.addListener = s), + (o.once = s), + (o.off = s), + (o.removeListener = s), + (o.removeAllListeners = s), + (o.emit = s), + (o.binding = function(e) { + throw new Error("process.binding is not supported") + }), + (o.cwd = function() { + return "/" + }), + (o.chdir = function(e) { + throw new Error("process.chdir is not supported") + }), + (o.umask = function() { + return 0 + }) + }, + function(e, t) { + "use strict" + ;(t["default"] = function(e) { + if (e && e.__esModule) return e + var t = {} + if (null != e) + for (var r in e) Object.prototype.hasOwnProperty.call(e, r) && (t[r] = e[r]) + return (t["default"] = e), t + }), + (t.__esModule = !0) + }, + 2, + 2, + function(e, t) { + "use strict" + ;(t["default"] = function(e) { + return e && e.__esModule ? e : { default: e } + }), + (t.__esModule = !0) + }, + 2, + 2, + 2, + 2, + 5, + [ + 7427, + 481, + 85, + 17, + 6, + 3049, + 3050, + 3193, + 3140, + 1534, + 3143, + 3142, + 3091, + 187, + 3095, + 870, + 1513, + 3096, + 3086, + 3094 + ], + [ + 7427, + 537, + 92, + 20, + 4, + 6270, + 6271, + 6216, + 6217, + 1241, + 2233, + 6218, + 6167, + 273, + 6171, + 1233, + 2223, + 6172, + 6162, + 6170 + ], + [ + 7427, + 491, + 83, + 18, + 7, + 3534, + 3535, + 3756, + 3703, + 1667, + 3706, + 3705, + 3654, + 203, + 3658, + 940, + 1646, + 3659, + 3649, + 3657 + ], + [ + 7427, + 507, + 88, + 19, + 8, + 4295, + 4296, + 4438, + 4385, + 1813, + 4388, + 4387, + 4336, + 218, + 4340, + 1023, + 1792, + 4341, + 4331, + 4339 + ], + [ + 7427, + 414, + 84, + 21, + 9, + 4597, + 4598, + 4819, + 4766, + 1900, + 4769, + 4768, + 4717, + 228, + 4721, + 1072, + 1879, + 4722, + 4712, + 4720 + ], + [ + 7427, + 462, + 146, + 5, + 3, + 2566, + 2567, + 2644, + 2650, + 564, + 811, + 2651, + 2635, + 179, + 2639, + 809, + 1394, + 2640, + 2630, + 2638 + ], + 5, + 5, + 5, + 5, + 5, + function(e, t, r) { + ;(function(e, n) { + function i(e, r) { + var n = { seen: [], stylize: a } + return ( + arguments.length >= 3 && (n.depth = arguments[2]), + arguments.length >= 4 && (n.colors = arguments[3]), + m(r) ? (n.showHidden = r) : r && t._extend(n, r), + x(n.showHidden) && (n.showHidden = !1), + x(n.depth) && (n.depth = 2), + x(n.colors) && (n.colors = !1), + x(n.customInspect) && (n.customInspect = !0), + n.colors && (n.stylize = s), + u(n, e, n.depth) + ) + } + function s(e, t) { + var r = i.styles[t] + return r ? "[" + i.colors[r][0] + "m" + e + "[" + i.colors[r][1] + "m" : e + } + function a(e, t) { + return e + } + function o(e) { + var t = {} + return ( + e.forEach(function(e, r) { + t[e] = !0 + }), + t + ) + } + function u(e, r, n) { + if ( + e.customInspect && + r && + F(r.inspect) && + r.inspect !== t.inspect && + (!r.constructor || r.constructor.prototype !== r) + ) { + var i = r.inspect(n, e) + return E(i) || (i = u(e, i, n)), i + } + var s = l(e, r) + if (s) return s + var a = Object.keys(r), + m = o(a) + if ( + (e.showHidden && (a = Object.getOwnPropertyNames(r)), + S(r) && (a.indexOf("message") >= 0 || a.indexOf("description") >= 0)) + ) + return c(r) + if (0 === a.length) { + if (F(r)) { + var y = r.name ? ": " + r.name : "" + return e.stylize("[Function" + y + "]", "special") + } + if (A(r)) return e.stylize(RegExp.prototype.toString.call(r), "regexp") + if (C(r)) return e.stylize(Date.prototype.toString.call(r), "date") + if (S(r)) return c(r) + } + var v = "", + g = !1, + b = ["{", "}"] + if ((d(r) && ((g = !0), (b = ["[", "]"])), F(r))) { + var x = r.name ? ": " + r.name : "" + v = " [Function" + x + "]" + } + if ( + (A(r) && (v = " " + RegExp.prototype.toString.call(r)), + C(r) && (v = " " + Date.prototype.toUTCString.call(r)), + S(r) && (v = " " + c(r)), + 0 === a.length && (!g || 0 == r.length)) + ) + return b[0] + v + b[1] + if (0 > n) + return A(r) + ? e.stylize(RegExp.prototype.toString.call(r), "regexp") + : e.stylize("[Object]", "special") + e.seen.push(r) + var D + return ( + (D = g + ? p(e, r, n, m, a) + : a.map(function(t) { + return f(e, r, n, m, t, g) + })), + e.seen.pop(), + h(D, v, b) + ) + } + function l(e, t) { + if (x(t)) return e.stylize("undefined", "undefined") + if (E(t)) { + var r = + "'" + + JSON.stringify(t) + .replace(/^"|"$/g, "") + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + + "'" + return e.stylize(r, "string") + } + return g(t) + ? e.stylize("" + t, "number") + : m(t) + ? e.stylize("" + t, "boolean") + : y(t) + ? e.stylize("null", "null") + : void 0 + } + function c(e) { + return "[" + Error.prototype.toString.call(e) + "]" + } + function p(e, t, r, n, i) { + for (var s = [], a = 0, o = t.length; o > a; ++a) + B(t, String(a)) ? s.push(f(e, t, r, n, String(a), !0)) : s.push("") + return ( + i.forEach(function(i) { + i.match(/^\d+$/) || s.push(f(e, t, r, n, i, !0)) + }), + s + ) + } + function f(e, t, r, n, i, s) { + var a, o, l + if ( + ((l = Object.getOwnPropertyDescriptor(t, i) || { value: t[i] }), + l.get + ? (o = l.set + ? e.stylize("[Getter/Setter]", "special") + : e.stylize("[Getter]", "special")) + : l.set && (o = e.stylize("[Setter]", "special")), + B(n, i) || (a = "[" + i + "]"), + o || + (e.seen.indexOf(l.value) < 0 + ? ((o = y(r) ? u(e, l.value, null) : u(e, l.value, r - 1)), + o.indexOf("\n") > -1 && + (o = s + ? o + .split("\n") + .map(function(e) { + return " " + e + }) + .join("\n") + .substr(2) + : "\n" + + o + .split("\n") + .map(function(e) { + return " " + e + }) + .join("\n"))) + : (o = e.stylize("[Circular]", "special"))), + x(a)) + ) { + if (s && i.match(/^\d+$/)) return o + ;(a = JSON.stringify("" + i)), + a.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/) + ? ((a = a.substr(1, a.length - 2)), (a = e.stylize(a, "name"))) + : ((a = a + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'")), + (a = e.stylize(a, "string"))) + } + return a + ": " + o + } + function h(e, t, r) { + var n = 0, + i = e.reduce(function(e, t) { + return ( + n++, + t.indexOf("\n") >= 0 && n++, + e + t.replace(/\u001b\[\d\d?m/g, "").length + 1 + ) + }, 0) + return i > 60 + ? r[0] + + ("" === t ? "" : t + "\n ") + + " " + + e.join(",\n ") + + " " + + r[1] + : r[0] + t + " " + e.join(", ") + " " + r[1] + } + function d(e) { + return Array.isArray(e) + } + function m(e) { + return "boolean" == typeof e + } + function y(e) { + return null === e + } + function v(e) { + return null == e + } + function g(e) { + return "number" == typeof e + } + function E(e) { + return "string" == typeof e + } + function b(e) { + return "symbol" == typeof e + } + function x(e) { + return void 0 === e + } + function A(e) { + return D(e) && "[object RegExp]" === _(e) + } + function D(e) { + return "object" == typeof e && null !== e + } + function C(e) { + return D(e) && "[object Date]" === _(e) + } + function S(e) { + return D(e) && ("[object Error]" === _(e) || e instanceof Error) + } + function F(e) { + return "function" == typeof e + } + function w(e) { + return ( + null === e || + "boolean" == typeof e || + "number" == typeof e || + "string" == typeof e || + "symbol" == typeof e || + "undefined" == typeof e + ) + } + function _(e) { + return Object.prototype.toString.call(e) + } + function T(e) { + return 10 > e ? "0" + e.toString(10) : e.toString(10) + } + function P() { + var e = new Date(), + t = [T(e.getHours()), T(e.getMinutes()), T(e.getSeconds())].join(":") + return [e.getDate(), M[e.getMonth()], t].join(" ") + } + function B(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + } + var k = /%[sdj%]/g + ;(t.format = function(e) { + if (!E(e)) { + for (var t = [], r = 0; r < arguments.length; r++) + t.push(i(arguments[r])) + return t.join(" ") + } + for ( + var r = 1, + n = arguments, + s = n.length, + a = String(e).replace(k, function(e) { + if ("%%" === e) return "%" + if (r >= s) return e + switch (e) { + case "%s": + return String(n[r++]) + case "%d": + return Number(n[r++]) + case "%j": + try { + return JSON.stringify(n[r++]) + } catch (t) { + return "[Circular]" + } + default: + return e + } + }), + o = n[r]; + s > r; + o = n[++r] + ) + a += y(o) || !D(o) ? " " + o : " " + i(o) + return a + }), + (t.deprecate = function(r, i) { + function s() { + if (!a) { + if (n.throwDeprecation) throw new Error(i) + n.traceDeprecation ? console.trace(i) : console.error(i), + (a = !0) + } + return r.apply(this, arguments) + } + if (x(e.process)) + return function() { + return t.deprecate(r, i).apply(this, arguments) + } + if (n.noDeprecation === !0) return r + var a = !1 + return s + }) + var I, + O = {} + ;(t.debuglog = function(e) { + if ((x(I) && (I = n.env.NODE_DEBUG || ""), (e = e.toUpperCase()), !O[e])) + if (new RegExp("\\b" + e + "\\b", "i").test(I)) { + var r = n.pid + O[e] = function() { + var n = t.format.apply(t, arguments) + console.error("%s %d: %s", e, r, n) + } + } else O[e] = function() {} + return O[e] + }), + (t.inspect = i), + (i.colors = { + bold: [1, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + white: [37, 39], + grey: [90, 39], + black: [30, 39], + blue: [34, 39], + cyan: [36, 39], + green: [32, 39], + magenta: [35, 39], + red: [31, 39], + yellow: [33, 39] + }), + (i.styles = { + special: "cyan", + number: "yellow", + boolean: "yellow", + undefined: "grey", + null: "bold", + string: "green", + date: "magenta", + regexp: "red" + }), + (t.isArray = d), + (t.isBoolean = m), + (t.isNull = y), + (t.isNullOrUndefined = v), + (t.isNumber = g), + (t.isString = E), + (t.isSymbol = b), + (t.isUndefined = x), + (t.isRegExp = A), + (t.isObject = D), + (t.isDate = C), + (t.isError = S), + (t.isFunction = F), + (t.isPrimitive = w), + (t.isBuffer = r(7316)) + var M = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + ;(t.log = function() { + console.log("%s - %s", P(), t.format.apply(t, arguments)) + }), + (t.inherits = r(7315)), + (t._extend = function(e, t) { + if (!t || !D(t)) return e + for (var r = Object.keys(t), n = r.length; n--; ) e[r[n]] = t[r[n]] + return e + }) + }.call( + t, + (function() { + return this + })(), + r(1) + )) + }, + 2, + 2, + function(e, t) { + e.exports = function(e) { + return ( + e.webpackPolyfill || + ((e.deprecate = function() {}), + (e.paths = []), + (e.children = []), + (e.webpackPolyfill = 1)), + e + ) + } + }, + [ + 7427, + 973, + 161, + 32, + 23, + 3948, + 3950, + 4155, + 4105, + 4145, + 4108, + 4107, + 4096, + 213, + 4100, + 994, + 1743, + 4101, + 4091, + 4099 + ], + 2, + [ + 7427, + 1148, + 252, + 50, + 24, + 5425, + 5426, + 5630, + 5580, + 5620, + 5583, + 5582, + 5571, + 254, + 5575, + 1170, + 2078, + 5576, + 5566, + 5574 + ], + 2, + [ + 7427, + 768, + 293, + 53, + 27, + 6790, + 6791, + 6962, + 6912, + 6952, + 6915, + 6914, + 6903, + 295, + 6907, + 1323, + 2408, + 6908, + 6898, + 6906 + ], + 2, + 5, + [ + 7427, + 840, + 186, + 48, + 29, + 2898, + 2899, + 2890, + 2840, + 2880, + 2843, + 2842, + 2831, + 182, + 2835, + 835, + 1454, + 2836, + 2826, + 2834 + ], + 2, + 2, + 2, + 2, + 2, + 2, + [ + 7427, + 949, + 206, + 67, + 31, + 3764, + 3765, + 3860, + 3861, + 1704, + 3863, + 3862, + 3851, + 209, + 3855, + 961, + 1690, + 3856, + 3846, + 3854 + ], + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 5, + [ + 7427, + 1138, + 249, + 70, + 34, + 5377, + 5378, + 5370, + 5320, + 5360, + 5323, + 5322, + 5311, + 245, + 5315, + 1133, + 2023, + 5316, + 5306, + 5314 + ], + 5, + [ + 7427, + 1193, + 263, + 74, + 35, + 5791, + 5792, + 5934, + 5881, + 2164, + 5884, + 5883, + 5832, + 265, + 5836, + 1203, + 2143, + 5837, + 5827, + 5835 + ], + [ + 7427, + 1260, + 281, + 72, + 37, + 6423, + 6424, + 6416, + 6363, + 2283, + 6366, + 6365, + 6314, + 278, + 6318, + 1252, + 2262, + 6319, + 6309, + 6317 + ], + 5, + [ + 7427, + 878, + 190, + 66, + 38, + 3200, + 3201, + 3294, + 3295, + 1573, + 3297, + 3296, + 3285, + 192, + 3289, + 890, + 1558, + 3290, + 3280, + 3288 + ], + [ + 7427, + 901, + 196, + 73, + 39, + 3382, + 3383, + 3475, + 3476, + 1617, + 3478, + 3477, + 3466, + 198, + 3470, + 914, + 1602, + 3471, + 3461, + 3469 + ], + [ + 7427, + 1032, + 221, + 68, + 41, + 4446, + 4447, + 4540, + 4541, + 1851, + 4543, + 4542, + 4531, + 223, + 4535, + 1045, + 1836, + 4536, + 4526, + 4534 + ], + [ + 7427, + 421, + 82, + 10, + 2, + 1936, + 1937, + 4929, + 4876, + 1926, + 4879, + 4878, + 4827, + 231, + 4831, + 1080, + 1905, + 4832, + 4822, + 4830 + ], + [ + 7427, + 421, + 82, + 10, + 2, + 1936, + 1937, + 5024, + 5025, + 1968, + 5027, + 5026, + 5015, + 235, + 5019, + 1099, + 1953, + 5020, + 5010, + 5018 + ], + [ + 7427, + 1107, + 239, + 69, + 42, + 5084, + 5085, + 5178, + 5179, + 2005, + 5181, + 5180, + 5169, + 241, + 5173, + 1120, + 1990, + 5174, + 5164, + 5172 + ], + [ + 7427, + 1175, + 258, + 77, + 43, + 5637, + 5638, + 5780, + 5727, + 2126, + 5730, + 5729, + 5678, + 260, + 5682, + 1185, + 2105, + 5683, + 5673, + 5681 + ], + [ + 7427, + 1221, + 271, + 71, + 36, + 6070, + 6071, + 6009, + 6010, + 2198, + 6014, + 6013, + 5960, + 268, + 5964, + 1212, + 2178, + 5965, + 5955, + 5963 + ], + [ + 7427, + 1279, + 286, + 75, + 44, + 6592, + 6593, + 6530, + 6533, + 2325, + 6536, + 6535, + 6483, + 283, + 6487, + 1270, + 2305, + 6488, + 6478, + 6486 + ], + [ + 7427, + 1298, + 291, + 76, + 45, + 6744, + 6745, + 6682, + 6685, + 2363, + 6688, + 6687, + 6635, + 288, + 6639, + 1289, + 2343, + 6640, + 6630, + 6638 + ], + [ + 7427, + 1329, + 299, + 78, + 46, + 6976, + 6977, + 7119, + 7066, + 2457, + 7069, + 7068, + 7017, + 301, + 7021, + 1339, + 2436, + 7022, + 7012, + 7020 + ], + [ + 7427, + 1348, + 173, + 79, + 47, + 7132, + 7133, + 7275, + 7222, + 2494, + 7225, + 7224, + 7173, + 305, + 7177, + 1358, + 2473, + 7178, + 7168, + 7176 + ], + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + function(e, t) { + "use strict" + ;(t["default"] = function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }), + (t.__esModule = !0) + }, + function(e, t) { + var r = Object + e.exports = { + create: r.create, + getProto: r.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: r.getOwnPropertyDescriptor, + setDesc: r.defineProperty, + setDescs: r.defineProperties, + getKeys: r.keys, + getNames: r.getOwnPropertyNames, + getSymbols: r.getOwnPropertySymbols, + each: [].forEach + } + }, + [7331, 4932], + [7331, 3536], + [7331, 4599], + [7331, 3051], + 80, + 80, + [7331, 4297], + 80, + 80, + 80, + [7331, 6272], + 80, + [7480, 562, 180, 148], + 81, + 81, + 81, + function(e, t) { + var r = (e.exports = { version: "1.2.6" }) + "number" == typeof __e && (__e = r) + }, + function(e, t) { + function r(e) { + var t = typeof e + return !!e && ("object" == t || "function" == t) + } + e.exports = r + }, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 81, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + 99, + [7331, 2568], + [ + 7396, + 146, + 797, + 2562, + 5, + 3, + 798, + 2607, + 2624, + 176, + 561, + 16, + 308, + 808, + 1390, + 308, + 808, + 1390 + ], + function(e, t) { + function r(e) { + return !!e && "object" == typeof e + } + e.exports = r + }, + [7480, 592, 193, 194], + [7480, 601, 199, 200], + [7480, 623, 210, 211], + 80, + [7480, 661, 224, 225], + [7480, 683, 236, 237], + [7480, 690, 242, 243], + [7480, 740, 274, 275], + 98, + 98, + [7480, 586, 314, 188], + [7480, 614, 322, 204], + [7331, 3951], + 98, + [7480, 655, 329, 219], + [7480, 674, 335, 229], + [7480, 677, 337, 232], + [7480, 720, 347, 261], + [7480, 728, 350, 266], + [7480, 735, 352, 269], + [7480, 750, 357, 279], + [7480, 756, 360, 284], + [7480, 762, 363, 289], + [7480, 781, 369, 302], + [7331, 7134], + [7480, 787, 372, 306], + function(e, t, r) { + ;(function(e) { + function r(e, t) { + for (var r = 0, n = e.length - 1; n >= 0; n--) { + var i = e[n] + "." === i + ? e.splice(n, 1) + : ".." === i + ? (e.splice(n, 1), r++) + : r && (e.splice(n, 1), r--) + } + if (t) for (; r--; r) e.unshift("..") + return e + } + function n(e, t) { + if (e.filter) return e.filter(t) + for (var r = [], n = 0; n < e.length; n++) t(e[n], n, e) && r.push(e[n]) + return r + } + var i = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/, + s = function(e) { + return i.exec(e).slice(1) + } + ;(t.resolve = function() { + for (var t = "", i = !1, s = arguments.length - 1; s >= -1 && !i; s--) { + var a = s >= 0 ? arguments[s] : e.cwd() + if ("string" != typeof a) + throw new TypeError("Arguments to path.resolve must be strings") + a && ((t = a + "/" + t), (i = "/" === a.charAt(0))) + } + return ( + (t = r( + n(t.split("/"), function(e) { + return !!e + }), + !i + ).join("/")), + (i ? "/" : "") + t || "." + ) + }), + (t.normalize = function(e) { + var i = t.isAbsolute(e), + s = "/" === a(e, -1) + return ( + (e = r( + n(e.split("/"), function(e) { + return !!e + }), + !i + ).join("/")), + e || i || (e = "."), + e && s && (e += "/"), + (i ? "/" : "") + e + ) + }), + (t.isAbsolute = function(e) { + return "/" === e.charAt(0) + }), + (t.join = function() { + var e = Array.prototype.slice.call(arguments, 0) + return t.normalize( + n(e, function(e, t) { + if ("string" != typeof e) + throw new TypeError( + "Arguments to path.join must be strings" + ) + return e + }).join("/") + ) + }), + (t.relative = function(e, r) { + function n(e) { + for (var t = 0; t < e.length && "" === e[t]; t++); + for (var r = e.length - 1; r >= 0 && "" === e[r]; r--); + return t > r ? [] : e.slice(t, r - t + 1) + } + ;(e = t.resolve(e).substr(1)), (r = t.resolve(r).substr(1)) + for ( + var i = n(e.split("/")), + s = n(r.split("/")), + a = Math.min(i.length, s.length), + o = a, + u = 0; + a > u; + u++ + ) + if (i[u] !== s[u]) { + o = u + break + } + for (var l = [], u = o; u < i.length; u++) l.push("..") + return (l = l.concat(s.slice(o))), l.join("/") + }), + (t.sep = "/"), + (t.delimiter = ":"), + (t.dirname = function(e) { + var t = s(e), + r = t[0], + n = t[1] + return r || n ? (n && (n = n.substr(0, n.length - 1)), r + n) : "." + }), + (t.basename = function(e, t) { + var r = s(e)[2] + return ( + t && + r.substr(-1 * t.length) === t && + (r = r.substr(0, r.length - t.length)), + r + ) + }), + (t.extname = function(e) { + return s(e)[3] + }) + var a = + "b" === "ab".substr(-1) + ? function(e, t, r) { + return e.substr(t, r) + } + : function(e, t, r) { + return 0 > t && (t = e.length + t), e.substr(t, r) + } + }.call(t, r(1))) + }, + [7330, 3], + [7363, 466, 98, 556], + [7380, 1382, 805, 466], + [7422, 146, 3, 16], + function(e, t) { + function r(e) { + return "number" == typeof e && e > -1 && e % 1 == 0 && n >= e + } + var n = 9007199254740991 + e.exports = r + }, + [7475, 99], + [7422, 186, 29, 33], + 148, + [7475, 121], + [7480, 572, 380, 183], + [7331, 2900], + [7422, 85, 6, 11], + 148, + [7475, 122], + [7331, 3202], + 98, + [7422, 190, 38, 54], + 180, + 148, + [7475, 123], + [7331, 3384], + 98, + [7422, 196, 39, 55], + 180, + 148, + [7475, 124], + 98, + [7422, 83, 7, 13], + 148, + [7475, 125], + [7331, 3766], + 80, + 98, + [7422, 206, 31, 40], + 180, + 148, + [7475, 126], + [7422, 161, 23, 26], + 148, + [7475, 127], + [7480, 638, 405, 214], + 98, + [7422, 88, 8, 14], + 148, + [7475, 128], + [7331, 4448], + 98, + [7422, 221, 41, 56], + 180, + 148, + [7475, 129], + 98, + [7422, 84, 9, 15], + 148, + [7475, 130], + [7422, 82, 2, 57], + 148, + [7475, 131], + 98, + [7422, 82, 2, 58], + 180, + 148, + [7475, 132], + [7331, 5086], + 98, + [7422, 239, 42, 59], + 180, + 148, + [7475, 133], + [7422, 249, 34, 49], + 148, + [7475, 134], + [7480, 699, 430, 246], + [7331, 5379], + 80, + 98, + [7331, 5427], + 98, + [7422, 252, 24, 28], + 148, + [7475, 135], + [7480, 713, 436, 255], + [7331, 5639], + 98, + [7422, 258, 43, 60], + 148, + [7475, 136], + [7331, 5793], + 98, + [7422, 263, 35, 51], + 148, + [7475, 137], + [7422, 271, 36, 61], + 148, + [7475, 138], + [7331, 6072], + 98, + [7422, 92, 4, 12], + 180, + 148, + [7475, 139], + 98, + [7422, 281, 37, 52], + 148, + [7475, 140], + [7331, 6425], + 98, + [7422, 286, 44, 62], + 148, + [7475, 141], + [7331, 6594], + 98, + [7422, 291, 45, 63], + 148, + [7475, 142], + [7331, 6746], + 98, + [7331, 6792], + 98, + [7422, 293, 27, 30], + 148, + [7475, 143], + [7480, 775, 455, 296], + [7331, 6978], + 98, + [7422, 299, 46, 64], + 148, + [7475, 144], + 98, + [7422, 173, 47, 65], + 148, + [7475, 145], + [ + 7401, + 80, + 3, + 5, + 1392, + 2646, + 1391, + 2626, + 147, + 565, + 808, + 16, + 2608, + 2614, + 2622, + 2612, + 2611, + 2617, + 2610, + 2621, + 2620, + 2613, + 2609 + ], + [7491, 562, 375, 99, 2691], + [ + 7401, + 311, + 29, + 48, + 1442, + 2790, + 1441, + 2794, + 378, + 1452, + 829, + 33, + 2754, + 2760, + 2768, + 2758, + 2757, + 2763, + 2756, + 2767, + 2766, + 2759, + 2755 + ], + 80, + [ + 7401, + 86, + 6, + 17, + 1488, + 3008, + 1487, + 3012, + 479, + 1498, + 855, + 11, + 2972, + 2978, + 2986, + 2976, + 2975, + 2981, + 2974, + 2985, + 2984, + 2977, + 2973 + ], + [ + 7401, + 86, + 6, + 17, + 1516, + 3131, + 1515, + 3135, + 485, + 1536, + 871, + 11, + 3098, + 3104, + 3112, + 3102, + 3101, + 3107, + 3100, + 3111, + 3110, + 3103, + 3099 + ], + 180, + 80, + [ + 7401, + 315, + 38, + 66, + 1553, + 3273, + 1552, + 3277, + 388, + 897, + 888, + 54, + 3238, + 3244, + 3252, + 3242, + 3241, + 3247, + 3240, + 3251, + 3250, + 3243, + 3239 + ], + 80, + [ + 7401, + 317, + 39, + 73, + 1597, + 3454, + 1596, + 3458, + 391, + 921, + 912, + 55, + 3419, + 3425, + 3433, + 3423, + 3422, + 3428, + 3421, + 3432, + 3431, + 3424, + 3420 + ], + [ + 7401, + 87, + 7, + 18, + 1635, + 3607, + 1634, + 3611, + 494, + 939, + 931, + 13, + 3572, + 3578, + 3586, + 3576, + 3575, + 3581, + 3574, + 3585, + 3584, + 3577, + 3573 + ], + [7480, 1645, 394, 611], + [ + 7401, + 87, + 7, + 18, + 1649, + 3694, + 1648, + 3698, + 495, + 1669, + 941, + 13, + 3661, + 3667, + 3675, + 3665, + 3664, + 3670, + 3663, + 3674, + 3673, + 3666, + 3662 + ], + 180, + [ + 7396, + 206, + 619, + 3761, + 67, + 31, + 1674, + 3802, + 3819, + 960, + 962, + 40, + 324, + 959, + 1683, + 324, + 959, + 1683 + ], + [ + 7401, + 207, + 31, + 67, + 1685, + 3839, + 1684, + 3843, + 323, + 627, + 959, + 40, + 3803, + 3809, + 3817, + 3807, + 3806, + 3812, + 3805, + 3816, + 3815, + 3808, + 3804 + ], + [ + 7396, + 161, + 498, + 3944, + 32, + 23, + 1715, + 4018, + 4035, + 631, + 990, + 26, + 326, + 989, + 1729, + 326, + 989, + 1729 + ], + [ + 7401, + 152, + 23, + 32, + 1731, + 4055, + 1730, + 4059, + 325, + 1741, + 989, + 26, + 4019, + 4025, + 4033, + 4023, + 4022, + 4028, + 4021, + 4032, + 4031, + 4024, + 4020 + ], + [ + 7401, + 89, + 8, + 19, + 1769, + 4255, + 1768, + 4259, + 505, + 1779, + 1007, + 14, + 4219, + 4225, + 4233, + 4223, + 4222, + 4228, + 4221, + 4232, + 4231, + 4224, + 4220 + ], + [ + 7401, + 89, + 8, + 19, + 1795, + 4376, + 1794, + 4380, + 510, + 1815, + 1024, + 14, + 4343, + 4349, + 4357, + 4347, + 4346, + 4352, + 4345, + 4356, + 4355, + 4348, + 4344 + ], + 180, + 80, + [ + 7401, + 330, + 41, + 68, + 1831, + 4519, + 1830, + 4523, + 412, + 1052, + 1043, + 56, + 4484, + 4490, + 4498, + 4488, + 4487, + 4493, + 4486, + 4497, + 4496, + 4489, + 4485 + ], + [ + 7401, + 90, + 9, + 21, + 1868, + 4670, + 1867, + 4674, + 514, + 1071, + 1063, + 15, + 4635, + 4641, + 4649, + 4639, + 4638, + 4644, + 4637, + 4648, + 4647, + 4640, + 4636 + ], + [7480, 1878, 417, 671], + [ + 7401, + 90, + 9, + 21, + 1882, + 4757, + 1881, + 4761, + 515, + 1902, + 1073, + 15, + 4724, + 4730, + 4738, + 4728, + 4727, + 4733, + 4726, + 4737, + 4736, + 4729, + 4725 + ], + 180, + [ + 7401, + 91, + 2, + 10, + 1908, + 4867, + 1907, + 4871, + 516, + 1928, + 1081, + 57, + 4834, + 4840, + 4848, + 4838, + 4837, + 4843, + 4836, + 4847, + 4846, + 4839, + 4835 + ], + 180, + [ + 7401, + 91, + 2, + 10, + 1948, + 5003, + 1947, + 5007, + 424, + 1106, + 1097, + 58, + 4968, + 4974, + 4982, + 4972, + 4971, + 4977, + 4970, + 4981, + 4980, + 4973, + 4969 + ], + 80, + [ + 7401, + 339, + 42, + 69, + 1985, + 5157, + 1984, + 5161, + 427, + 1127, + 1118, + 59, + 5122, + 5128, + 5136, + 5126, + 5125, + 5131, + 5124, + 5135, + 5134, + 5127, + 5123 + ], + [ + 7401, + 250, + 34, + 70, + 2011, + 5270, + 2010, + 5274, + 522, + 2021, + 1128, + 49, + 5234, + 5240, + 5248, + 5238, + 5237, + 5243, + 5236, + 5247, + 5246, + 5239, + 5235 + ], + 80, + [ + 7396, + 252, + 1149, + 5422, + 50, + 24, + 2051, + 5493, + 5510, + 1165, + 1166, + 28, + 344, + 1164, + 2064, + 344, + 1164, + 2064 + ], + [ + 7401, + 342, + 24, + 50, + 2066, + 5530, + 2065, + 5534, + 343, + 2076, + 1164, + 28, + 5494, + 5500, + 5508, + 5498, + 5497, + 5503, + 5496, + 5507, + 5506, + 5499, + 5495 + ], + 80, + [ + 7401, + 345, + 43, + 77, + 2108, + 5718, + 2107, + 5722, + 529, + 2128, + 1186, + 60, + 5685, + 5691, + 5699, + 5689, + 5688, + 5694, + 5687, + 5698, + 5697, + 5690, + 5686 + ], + 180, + 80, + [ + 7401, + 348, + 35, + 74, + 2146, + 5872, + 2145, + 5876, + 531, + 2166, + 1204, + 51, + 5839, + 5845, + 5853, + 5843, + 5842, + 5848, + 5841, + 5852, + 5851, + 5844, + 5840 + ], + 180, + [ + 7401, + 353, + 36, + 71, + 2181, + 6e3, + 2180, + 6004, + 532, + 2200, + 1213, + 61, + 5967, + 5973, + 5981, + 5971, + 5970, + 5976, + 5969, + 5980, + 5979, + 5972, + 5968 + ], + 180, + 80, + [ + 7401, + 93, + 4, + 20, + 2218, + 6155, + 2217, + 6159, + 534, + 744, + 1231, + 12, + 6119, + 6125, + 6133, + 6123, + 6122, + 6128, + 6121, + 6132, + 6131, + 6124, + 6120 + ], + [ + 7401, + 93, + 4, + 20, + 2226, + 6207, + 2225, + 6211, + 535, + 744, + 1234, + 12, + 6174, + 6180, + 6188, + 6178, + 6177, + 6183, + 6176, + 6187, + 6186, + 6179, + 6175 + ], + [ + 7401, + 358, + 37, + 72, + 2265, + 6354, + 2264, + 6358, + 540, + 2285, + 1253, + 52, + 6321, + 6327, + 6335, + 6325, + 6324, + 6330, + 6323, + 6334, + 6333, + 6326, + 6322 + ], + 180, + 80, + [ + 7401, + 361, + 44, + 75, + 2308, + 6523, + 2307, + 6527, + 542, + 2327, + 1271, + 62, + 6490, + 6496, + 6504, + 6494, + 6493, + 6499, + 6492, + 6503, + 6502, + 6495, + 6491 + ], + 180, + 80, + [ + 7401, + 364, + 45, + 76, + 2346, + 6675, + 2345, + 6679, + 544, + 2365, + 1290, + 63, + 6642, + 6648, + 6656, + 6646, + 6645, + 6651, + 6644, + 6655, + 6654, + 6647, + 6643 + ], + 180, + 80, + 80, + [ + 7401, + 365, + 27, + 53, + 2396, + 6862, + 2395, + 6866, + 547, + 2406, + 1317, + 30, + 6827, + 6833, + 6841, + 6831, + 6830, + 6836, + 6829, + 6840, + 6839, + 6832, + 6828 + ], + 80, + [ + 7401, + 367, + 46, + 78, + 2439, + 7057, + 2438, + 7061, + 550, + 2459, + 1340, + 64, + 7024, + 7030, + 7038, + 7028, + 7027, + 7033, + 7026, + 7037, + 7036, + 7029, + 7025 + ], + 180, + 80, + [ + 7401, + 370, + 47, + 79, + 2476, + 7213, + 2475, + 7217, + 552, + 2496, + 1359, + 65, + 7180, + 7186, + 7194, + 7184, + 7183, + 7189, + 7182, + 7193, + 7192, + 7185, + 7181 + ], + 180, + function(e, t) {}, + [7345, 555, 2563], + [7470, 816, 180], + [7480, 1439, 474, 825], + 99, + [ + 7396, + 186, + 841, + 2895, + 48, + 29, + 1471, + 2753, + 2770, + 830, + 831, + 33, + 310, + 829, + 1440, + 310, + 829, + 1440 + ], + 99, + 180, + [7380, 1479, 1481, 575], + [7480, 1485, 478, 851], + 99, + 99, + [7380, 1510, 1512, 583], + [7491, 586, 875, 122, 3181], + [7380, 1549, 1550, 590], + [ + 7396, + 190, + 588, + 3197, + 66, + 38, + 1542, + 3237, + 3254, + 889, + 891, + 54, + 316, + 888, + 1551, + 316, + 888, + 1551 + ], + [7491, 592, 894, 123, 3333], + [7380, 1593, 1594, 599], + [ + 7396, + 196, + 902, + 3379, + 73, + 39, + 1586, + 3418, + 3435, + 913, + 915, + 55, + 318, + 912, + 1595, + 318, + 912, + 1595 + ], + [7491, 601, 918, 124, 3514], + [7380, 1631, 1632, 608], + 180, + 99, + [7491, 614, 945, 125, 3744], + [7380, 1681, 1682, 621], + [7491, 623, 965, 126, 3899], + 180, + [7480, 1711, 399, 969], + [7380, 1723, 1724, 632], + [7480, 1728, 501, 985], + 99, + 99, + 180, + [7480, 1766, 504, 1003], + 99, + 99, + [7380, 1790, 1791, 652], + [7491, 655, 1028, 128, 4426], + [7380, 1827, 1828, 659], + [ + 7396, + 221, + 1033, + 4443, + 68, + 41, + 1820, + 4483, + 4500, + 1044, + 1046, + 56, + 331, + 1043, + 1829, + 331, + 1043, + 1829 + ], + [7491, 661, 1049, 129, 4579], + [7339, 4606], + [7341, 4608], + [7380, 1864, 1865, 668], + 180, + 99, + [7491, 674, 1077, 130, 4807], + [7491, 677, 1085, 131, 4917], + [7339, 4939], + [7341, 4941], + [7380, 1944, 1945, 681], + [ + 7396, + 82, + 422, + 1933, + 10, + 2, + 679, + 4967, + 4984, + 1098, + 1100, + 58, + 338, + 1097, + 1946, + 338, + 1097, + 1946 + ], + [7491, 683, 1103, 132, 5063], + [7380, 1981, 1982, 688], + [ + 7396, + 239, + 1108, + 5081, + 69, + 42, + 1974, + 5121, + 5138, + 1119, + 1121, + 59, + 340, + 1118, + 1983, + 340, + 1118, + 1983 + ], + [7491, 690, 1124, 133, 5217], + 99, + 180, + [7380, 2047, 2048, 703], + [7380, 2058, 2059, 707], + [7480, 2063, 526, 1160], + 99, + 99, + 180, + [7380, 2103, 2104, 717], + [7491, 720, 1190, 136, 5768], + [7380, 2141, 2142, 725], + [7491, 728, 1208, 137, 5922], + 81, + [7491, 735, 1218, 138, 6052], + [7380, 2213, 2214, 738], + [7436, 2240, 1237, 156, 742, 274, 2245, 6264], + [7491, 740, 1238, 139, 6254], + [7380, 2259, 2260, 747], + [7491, 750, 1257, 140, 6404], + [7380, 2298, 2299, 753], + [7491, 756, 1276, 141, 6574], + [7380, 2340, 2341, 759], + [7491, 762, 1295, 142, 6726], + [7380, 2378, 2379, 765], + [7380, 2392, 2393, 770], + 99, + 180, + [7380, 2434, 2435, 778], + [7491, 781, 1344, 144, 7107], + [7380, 2471, 2472, 784], + [7491, 787, 1363, 145, 7263], + function(e, t) { + "use strict" + e.exports = { + filename: { + type: "filename", + description: + "filename to use when reading from stdin - this will be used in source-maps, errors etc", + default: "unknown", + shorthand: "f" + }, + filenameRelative: { hidden: !0, type: "string" }, + inputSourceMap: { hidden: !0 }, + env: { hidden: !0, default: {} }, + mode: { description: "", hidden: !0 }, + retainLines: { + type: "boolean", + default: !1, + description: "retain line numbers - will result in really ugly code" + }, + highlightCode: { + description: + "enable/disable ANSI syntax highlighting of code frames (on by default)", + type: "boolean", + default: !0 + }, + suppressDeprecationMessages: { type: "boolean", default: !1, hidden: !0 }, + presets: { type: "list", description: "", default: [] }, + plugins: { type: "list", default: [], description: "" }, + ignore: { + type: "list", + description: "list of glob paths to **not** compile", + default: [] + }, + only: { type: "list", description: "list of glob paths to **only** compile" }, + code: { hidden: !0, default: !0, type: "boolean" }, + metadata: { hidden: !0, default: !0, type: "boolean" }, + ast: { hidden: !0, default: !0, type: "boolean" }, + extends: { type: "string", hidden: !0 }, + comments: { + type: "boolean", + default: !0, + description: "write comments to generated output (true by default)" + }, + shouldPrintComment: { + hidden: !0, + description: + "optional callback to control whether a comment should be inserted, when this is used the comments option is ignored" + }, + compact: { + type: "booleanString", + default: "auto", + description: + "do not include superfluous whitespace characters and line terminators [true|false|auto]" + }, + minified: { + type: "boolean", + default: !1, + description: "save as much bytes when printing [true|false]" + }, + sourceMap: { alias: "sourceMaps", hidden: !0 }, + sourceMaps: { + type: "booleanString", + description: "[true|false|inline]", + default: !1, + shorthand: "s" + }, + sourceMapTarget: { + type: "string", + description: "set `file` on returned source map" + }, + sourceFileName: { + type: "string", + description: "set `sources[0]` on returned source map" + }, + sourceRoot: { + type: "filename", + description: "the root from which all sources are relative" + }, + babelrc: { + description: "Whether or not to look up .babelrc and .babelignore files", + type: "boolean", + default: !0 + }, + sourceType: { description: "", default: "module" }, + auxiliaryCommentBefore: { + type: "string", + description: "print a comment before any injected non-user code" + }, + auxiliaryCommentAfter: { + type: "string", + description: "print a comment after any injected non-user code" + }, + resolveModuleSource: { hidden: !0 }, + getModuleId: { hidden: !0 }, + moduleRoot: { + type: "filename", + description: + "optional prefix for the AMD module formatter that will be prepend to the filename on module definitions" + }, + moduleIds: { + type: "boolean", + default: !1, + shorthand: "M", + description: "insert an explicit id for modules" + }, + moduleId: { + description: "specify a custom name for module ids", + type: "string" + }, + passPerPreset: { + description: + "Whether to spawn a traversal pass per a preset. By default all presets are merged.", + type: "boolean", + default: !1, + hidden: !0 + } + } + }, + function(e, t, r) { + ;(function(n) { + "use strict" + function i(e) { + var t = N[e] + return null == t ? (N[e] = D["default"].sync(e)) : t + } + var s = r(80)["default"], + a = r(796)["default"], + o = r(3)["default"], + u = r(5)["default"] + t.__esModule = !0 + var l = r(1366), + c = o(l), + p = r(553), + f = u(p), + h = r(176), + d = o(h), + m = r(792), + y = r(2506), + v = u(y), + g = r(2649), + E = u(g), + b = r(2707), + x = u(b), + A = r(2706), + D = u(A), + C = r(1413), + S = u(C), + F = r(564), + w = u(F), + _ = r(2504), + T = u(_), + P = r(460), + B = u(P), + k = r(794), + I = u(k), + O = r(175), + M = u(O), + R = r(373), + L = u(R), + N = {}, + j = {}, + U = ".babelignore", + V = ".babelrc", + G = "package.json", + W = (function() { + function e(t) { + s(this, e), + (this.resolvedConfigs = []), + (this.options = e.createBareOptions()), + (this.log = t) + } + return ( + (e.memoisePluginContainer = function(t, r, n, i) { + for (var s = e.memoisedPlugins, a = 0; a < s.length; a++) { + var o = s[a] + if (o.container === t) return o.plugin + } + var u = void 0 + if ( + ((u = "function" == typeof t ? t(c) : t), + "object" == typeof u) + ) { + var l = new f["default"](u, i) + return ( + e.memoisedPlugins.push({ container: t, plugin: l }), l + ) + } + throw new TypeError( + d.get("pluginNotObject", r, n, typeof u) + r + n + ) + }), + (e.createBareOptions = function() { + var e = {} + for (var t in B["default"]) { + var r = B["default"][t] + e[t] = w["default"](r["default"]) + } + return e + }), + (e.normalisePlugin = function(t, r, n, i) { + if ( + ((t = t.__esModule ? t["default"] : t), + !(t instanceof f["default"])) + ) { + if ("function" != typeof t && "object" != typeof t) + throw new TypeError( + d.get("pluginNotFunction", r, n, typeof t) + ) + t = e.memoisePluginContainer(t, r, n, i) + } + return t.init(r, n), t + }), + (e.normalisePlugins = function(t, n, i) { + return i.map(function(i, s) { + var a = void 0, + o = void 0 + if (!i) throw new TypeError("Falsy value found in plugins") + Array.isArray(i) ? ((a = i[0]), (o = i[1])) : (a = i) + var u = "string" == typeof a ? a : t + "$" + s + if ("string" == typeof a) { + var l = + v["default"]("babel-plugin-" + a, n) || + v["default"](a, n) + if (!l) + throw new ReferenceError( + d.get("pluginUnknown", a, t, s, n) + ) + a = r(1367)(l) + } + return (a = e.normalisePlugin(a, t, s, u)), [a, o] + }) + }), + (e.prototype.addConfig = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? E["default"] + : arguments[2] + if (this.resolvedConfigs.indexOf(e) >= 0) return !1 + var n = L["default"].readFileSync(e, "utf8"), + i = void 0 + try { + ;(i = j[n] = j[n] || r.parse(n)), t && (i = i[t]) + } catch (s) { + throw ((s.message = + e + ": Error while parsing JSON - " + s.message), + s) + } + return ( + this.mergeOptions({ + options: i, + alias: e, + dirname: M["default"].dirname(e) + }), + this.resolvedConfigs.push(e), + !!i + ) + }), + (e.prototype.mergeOptions = function(t) { + var r = this, + i = t.options, + s = t.extending, + o = t.alias, + u = t.loc, + l = t.dirname + if (((o = o || "foreign"), i)) { + ;("object" != typeof i || Array.isArray(i)) && + this.log.error( + "Invalid options type for " + o, + TypeError + ) + var c = S["default"](i, function(e) { + return e instanceof f["default"] ? e : void 0 + }) + ;(l = l || n.cwd()), (u = u || o) + for (var p in c) { + var h = B["default"][p] + if (!h && this.log) { + var d = + "Check out http://babeljs.io/docs/usage/options/ for more info" + I["default"][p] + ? this.log.error( + "Using removed Babel 5 option: " + + o + + "." + + p + + " - " + + I["default"][p].message, + ReferenceError + ) + : this.log.error( + "Unknown option: " + + o + + "." + + p + + ". " + + d, + ReferenceError + ) + } + } + if ( + (m.normaliseOptions(c), + c.plugins && + (c.plugins = e.normalisePlugins(u, l, c.plugins)), + c["extends"]) + ) { + var y = v["default"](c["extends"], l) + y + ? this.addConfig(y) + : this.log && + this.log.error( + "Couldn't resolve extends clause of " + + c["extends"] + + " in " + + o + ), + delete c["extends"] + } + c.presets && + (c.passPerPreset + ? (c.presets = this.resolvePresets( + c.presets, + l, + function(e, t) { + r.mergeOptions({ + options: e, + extending: e, + alias: t, + loc: t, + dirname: l + }) + } + )) + : (this.mergePresets(c.presets, l), + delete c.presets)) + var g = void 0, + E = n.env.BABEL_ENV || "production" || "development" + c.env && ((g = c.env[E]), delete c.env), + i === s ? a(s, c) : T["default"](s || this.options, c), + this.mergeOptions({ + options: g, + extending: s, + alias: o + ".env." + E, + dirname: l + }) + } + }), + (e.prototype.mergePresets = function(e, t) { + var r = this + this.resolvePresets(e, t, function(e, t) { + r.mergeOptions({ + options: e, + alias: t, + loc: t, + dirname: M["default"].dirname(t) + }) + }) + }), + (e.prototype.resolvePresets = function(e, t, n) { + return e.map(function(e) { + if ("string" == typeof e) { + var i = + v["default"]("babel-preset-" + e, t) || + v["default"](e, t) + if (i) { + var s = r(1367)(i) + return n && n(s, i), s + } + throw new Error( + "Couldn't find preset " + + JSON.stringify(e) + + " relative to directory " + + JSON.stringify(t) + ) + } + if ("object" == typeof e) return n && n(e), e + throw new Error("Unsupported preset format: " + e + ".") + }) + }), + (e.prototype.addIgnoreConfig = function(e) { + var t = L["default"].readFileSync(e, "utf8"), + r = t.split("\n") + ;(r = r + .map(function(e) { + return e.replace(/#(.*?)$/, "").trim() + }) + .filter(function(e) { + return !!e + })), + this.mergeOptions({ options: { ignore: r }, loc: e }) + }), + (e.prototype.findConfigs = function(e) { + if (e) { + x["default"](e) || (e = M["default"].join(n.cwd(), e)) + for ( + var t = !1, r = !1; + e !== (e = M["default"].dirname(e)); + + ) { + if (!t) { + var s = M["default"].join(e, V) + i(s) && (this.addConfig(s), (t = !0)) + var a = M["default"].join(e, G) + !t && i(a) && (t = this.addConfig(a, "babel", JSON)) + } + if (!r) { + var o = M["default"].join(e, U) + i(o) && (this.addIgnoreConfig(o), (r = !0)) + } + if (r && t) return + } + } + }), + (e.prototype.normaliseOptions = function() { + var e = this.options + for (var t in B["default"]) { + var r = B["default"][t], + n = e[t] + ;(!n && r.optional) || + (r.alias ? (e[r.alias] = e[r.alias] || n) : (e[t] = n)) + } + }), + (e.prototype.init = function() { + var e = + arguments.length <= 0 || void 0 === arguments[0] + ? {} + : arguments[0], + t = e.filename + return ( + e.babelrc !== !1 && this.findConfigs(t), + this.mergeOptions({ + options: e, + alias: "base", + dirname: t && M["default"].dirname(t) + }), + this.normaliseOptions(e), + this.options + ) + }), + e + ) + })() + ;(t["default"] = W), (W.memoisedPlugins = []), (e.exports = t["default"]) + }.call(t, r(1))) + }, + [7339, 2577], + [7358, 559], + [7361, 465], + function(e, t) { + e.exports = function(e) { + try { + return !!e() + } catch (t) { + return !0 + } + } + }, + function(e, t) { + var r = (e.exports = + "undefined" != typeof window && window.Math == Math + ? window + : "undefined" != typeof self && self.Math == Math + ? self + : Function("return this")()) + "number" == typeof __g && (__g = r) + }, + [7365, 81, 803, 464], + function(e, t) { + e.exports = {} + }, + [7378, 1378, 557], + [7455, 1420], + [7471, 375, 563, 99], + [7479, 375, 148], + function(e, t) { + function r(e, t, r) { + if (t in e) return e[t] + if (3 === arguments.length) return r + throw new Error('"' + t + '" is a required argument.') + } + function n(e) { + var t = e.match(d) + return t + ? { scheme: t[1], auth: t[2], host: t[3], port: t[4], path: t[5] } + : null + } + function i(e) { + var t = "" + return ( + e.scheme && (t += e.scheme + ":"), + (t += "//"), + e.auth && (t += e.auth + "@"), + e.host && (t += e.host), + e.port && (t += ":" + e.port), + e.path && (t += e.path), + t + ) + } + function s(e) { + var r = e, + s = n(e) + if (s) { + if (!s.path) return e + r = s.path + } + for ( + var a, o = t.isAbsolute(r), u = r.split(/\/+/), l = 0, c = u.length - 1; + c >= 0; + c-- + ) + (a = u[c]), + "." === a + ? u.splice(c, 1) + : ".." === a + ? l++ + : l > 0 && + ("" === a ? (u.splice(c + 1, l), (l = 0)) : (u.splice(c, 2), l--)) + return ( + (r = u.join("/")), + "" === r && (r = o ? "/" : "."), + s ? ((s.path = r), i(s)) : r + ) + } + function a(e, t) { + "" === e && (e = "."), "" === t && (t = ".") + var r = n(t), + a = n(e) + if ((a && (e = a.path || "/"), r && !r.scheme)) + return a && (r.scheme = a.scheme), i(r) + if (r || t.match(m)) return t + if (a && !a.host && !a.path) return (a.host = t), i(a) + var o = "/" === t.charAt(0) ? t : s(e.replace(/\/+$/, "") + "/" + t) + return a ? ((a.path = o), i(a)) : o + } + function o(e, t) { + "" === e && (e = "."), (e = e.replace(/\/$/, "")) + for (var r = 0; 0 !== t.indexOf(e + "/"); ) { + var n = e.lastIndexOf("/") + if (0 > n) return t + if (((e = e.slice(0, n)), e.match(/^([^\/]+:\/)?\/*$/))) return t + ++r + } + return Array(r + 1).join("../") + t.substr(e.length + 1) + } + function u(e) { + return "$" + e + } + function l(e) { + return e.substr(1) + } + function c(e, t, r) { + var n = e.source - t.source + return 0 !== n + ? n + : ((n = e.originalLine - t.originalLine), + 0 !== n + ? n + : ((n = e.originalColumn - t.originalColumn), + 0 !== n || r + ? n + : ((n = e.generatedColumn - t.generatedColumn), + 0 !== n + ? n + : ((n = e.generatedLine - t.generatedLine), + 0 !== n ? n : e.name - t.name)))) + } + function p(e, t, r) { + var n = e.generatedLine - t.generatedLine + return 0 !== n + ? n + : ((n = e.generatedColumn - t.generatedColumn), + 0 !== n || r + ? n + : ((n = e.source - t.source), + 0 !== n + ? n + : ((n = e.originalLine - t.originalLine), + 0 !== n + ? n + : ((n = e.originalColumn - t.originalColumn), + 0 !== n ? n : e.name - t.name)))) + } + function f(e, t) { + return e === t ? 0 : e > t ? 1 : -1 + } + function h(e, t) { + var r = e.generatedLine - t.generatedLine + return 0 !== r + ? r + : ((r = e.generatedColumn - t.generatedColumn), + 0 !== r + ? r + : ((r = f(e.source, t.source)), + 0 !== r + ? r + : ((r = e.originalLine - t.originalLine), + 0 !== r + ? r + : ((r = e.originalColumn - t.originalColumn), + 0 !== r ? r : f(e.name, t.name))))) + } + t.getArg = r + var d = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/, + m = /^data:.+\,.+$/ + ;(t.urlParse = n), + (t.urlGenerate = i), + (t.normalize = s), + (t.join = a), + (t.isAbsolute = function(e) { + return "/" === e.charAt(0) || !!e.match(d) + }), + (t.relative = o), + (t.toSetString = u), + (t.fromSetString = l), + (t.compareByOriginalPositions = c), + (t.compareByGeneratedPositionsDeflated = p), + (t.compareByGeneratedPositionsInflated = h) + }, + 180, + 180, + [7363, 575, 157, 2914], + [7378, 1475, 843], + 180, + [ + 7396, + 85, + 482, + 1501, + 17, + 6, + 581, + 2971, + 2988, + 856, + 857, + 11, + 312, + 855, + 1486, + 312, + 855, + 1486 + ], + 180, + [7339, 3059], + [7341, 3061], + [7363, 583, 158, 3065], + [7378, 1506, 863], + [ + 7396, + 85, + 482, + 1501, + 17, + 6, + 581, + 3097, + 3114, + 872, + 873, + 11, + 313, + 871, + 1514, + 313, + 871, + 1514 + ], + [7378, 3217, 880], + [7455, 1576], + [7380, 3363, 3367, 899], + [7378, 3399, 904], + [7455, 1620], + [7339, 3543], + [7341, 3545], + [7378, 3551, 923], + [ + 7396, + 83, + 492, + 1623, + 18, + 7, + 606, + 3571, + 3588, + 932, + 933, + 13, + 319, + 931, + 1633, + 319, + 931, + 1633 + ], + [ + 7396, + 83, + 492, + 1623, + 18, + 7, + 606, + 3660, + 3677, + 942, + 943, + 13, + 321, + 941, + 1647, + 321, + 941, + 1647 + ], + [7378, 3781, 951], + [7455, 1708], + [7341, 3961], + [7363, 632, 162, 1716], + [7378, 3966, 976], + 180, + 180, + [7380, 4172, 4176, 1e3], + 180, + [ + 7396, + 88, + 508, + 1782, + 19, + 8, + 650, + 4218, + 4235, + 1008, + 1009, + 14, + 327, + 1007, + 1767, + 327, + 1007, + 1767 + ], + 180, + [7339, 4304], + [7341, 4306], + [7378, 4312, 1015], + [ + 7396, + 88, + 508, + 1782, + 19, + 8, + 650, + 4342, + 4359, + 1025, + 1026, + 14, + 328, + 1024, + 1793, + 328, + 1024, + 1793 + ], + [7378, 4463, 1035], + [7455, 1854], + [7378, 4614, 1055], + [ + 7396, + 84, + 415, + 1856, + 21, + 9, + 666, + 4634, + 4651, + 1064, + 1065, + 15, + 332, + 1063, + 1866, + 332, + 1063, + 1866 + ], + [ + 7396, + 84, + 415, + 1856, + 21, + 9, + 666, + 4723, + 4740, + 1074, + 1075, + 15, + 334, + 1073, + 1880, + 334, + 1073, + 1880 + ], + [ + 7396, + 82, + 422, + 1933, + 10, + 2, + 679, + 4833, + 4850, + 1082, + 1083, + 57, + 336, + 1081, + 1906, + 336, + 1081, + 1906 + ], + [7334, 4934], + [7378, 4947, 1089], + [7455, 1971], + [7378, 5101, 1110], + [7455, 2008], + [ + 7396, + 249, + 701, + 5374, + 70, + 34, + 2040, + 5233, + 5250, + 695, + 1129, + 49, + 341, + 1128, + 2009, + 341, + 1128, + 2009 + ], + 180, + [7378, 5394, 1140], + [7378, 5442, 1151], + 180, + 180, + [7378, 5654, 1177], + [ + 7396, + 258, + 2095, + 5634, + 77, + 43, + 2096, + 5684, + 5701, + 1187, + 1188, + 60, + 346, + 1186, + 2106, + 346, + 1186, + 2106 + ], + [7378, 5808, 1195], + [ + 7396, + 263, + 2133, + 5788, + 74, + 35, + 2134, + 5838, + 5855, + 1205, + 1206, + 51, + 349, + 1204, + 2144, + 349, + 1204, + 2144 + ], + [ + 7396, + 271, + 2205, + 6067, + 71, + 36, + 2206, + 5966, + 5983, + 1214, + 1215, + 61, + 351, + 1213, + 2179, + 351, + 1213, + 2179 + ], + [7378, 6087, 1223], + [ + 7396, + 92, + 538, + 2251, + 20, + 4, + 745, + 6118, + 6135, + 1232, + 444, + 12, + 354, + 1231, + 2216, + 354, + 1231, + 2216 + ], + [ + 7396, + 92, + 538, + 2251, + 20, + 4, + 745, + 6173, + 6190, + 1235, + 444, + 12, + 355, + 1234, + 2224, + 355, + 1234, + 2224 + ], + [7455, 2249], + [7339, 6279], + [7341, 6281], + [7378, 6287, 1244], + [ + 7396, + 281, + 2290, + 6420, + 72, + 37, + 2291, + 6320, + 6337, + 1254, + 1255, + 52, + 356, + 1253, + 2263, + 356, + 1253, + 2263 + ], + [7378, 6440, 1262], + [ + 7396, + 286, + 2332, + 6589, + 75, + 44, + 2333, + 6489, + 6506, + 1272, + 1274, + 62, + 359, + 1271, + 2306, + 359, + 1271, + 2306 + ], + [7378, 6609, 1281], + [ + 7396, + 291, + 2370, + 6741, + 76, + 45, + 2371, + 6641, + 6658, + 1291, + 1293, + 63, + 362, + 1290, + 2344, + 362, + 1290, + 2344 + ], + [7378, 6761, 1300], + [7378, 6807, 1309], + [ + 7396, + 293, + 2384, + 6787, + 53, + 27, + 2385, + 6826, + 6843, + 1318, + 1319, + 30, + 366, + 1317, + 2394, + 366, + 1317, + 2394 + ], + 180, + [7378, 6993, 1331], + [ + 7396, + 299, + 2426, + 6973, + 78, + 46, + 2427, + 7023, + 7040, + 1341, + 1342, + 64, + 368, + 1340, + 2437, + 368, + 1340, + 2437 + ], + [7378, 7149, 1350], + [ + 7396, + 173, + 2463, + 7129, + 79, + 47, + 2464, + 7179, + 7196, + 1360, + 1361, + 65, + 371, + 1359, + 2474, + 371, + 1359, + 2474 + ], + function(e, t, r) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(146)["default"], + a = r(5)["default"], + o = r(3)["default"] + t.__esModule = !0 + var u = r(461), + l = a(u), + c = r(176), + p = o(c), + f = r(790), + h = a(f), + d = r(147), + m = a(d), + y = r(565), + v = a(y), + g = r(564), + E = a(g), + b = ["enter", "exit"], + x = (function(e) { + function t(r, n) { + i(this, t), + e.call(this), + (this.initialized = !1), + (this.raw = v["default"]({}, r)), + (this.key = n), + (this.manipulateOptions = this.take("manipulateOptions")), + (this.post = this.take("post")), + (this.pre = this.take("pre")), + (this.visitor = this.normaliseVisitor( + E["default"](this.take("visitor")) || {} + )) + } + return ( + n(t, e), + (t.prototype.take = function(e) { + var t = this.raw[e] + return delete this.raw[e], t + }), + (t.prototype.chain = function(e, t) { + if (!e[t]) return this[t] + if (!this[t]) return e[t] + var r = [e[t], this[t]] + return function() { + for ( + var e = void 0, t = arguments.length, n = Array(t), i = 0; + t > i; + i++ + ) + n[i] = arguments[i] + for (var s = 0; s < r.length; s++) { + var a = r[s] + if (a) { + var o = a.apply(this, n) + null != o && (e = o) + } + } + return e + } + }), + (t.prototype.maybeInherit = function(e) { + var t = this.take("inherits") + t && + ((t = l["default"].normalisePlugin(t, e, "inherits")), + (this.manipulateOptions = this.chain(t, "manipulateOptions")), + (this.post = this.chain(t, "post")), + (this.pre = this.chain(t, "pre")), + (this.visitor = m["default"].visitors.merge([ + t.visitor, + this.visitor + ]))) + }), + (t.prototype.init = function(e, t) { + if (!this.initialized) { + ;(this.initialized = !0), this.maybeInherit(e) + for (var r in this.raw) + throw new Error(p.get("pluginInvalidProperty", e, t, r)) + } + }), + (t.prototype.normaliseVisitor = function(e) { + for (var t = b, r = Array.isArray(t), n = 0, t = r ? t : s(t); ; ) { + var i + if (r) { + if (n >= t.length) break + i = t[n++] + } else { + if (((n = t.next()), n.done)) break + i = n.value + } + var a = i + if (e[a]) + throw new Error( + "Plugins aren't allowed to specify catch-all enter/exit handlers. Please target individual nodes." + ) + } + return m["default"].explode(e), e + }), + t + ) + })(h["default"]) + ;(t["default"] = x), (e.exports = t["default"]) + }, + [7328, 2554], + [7334, 2572], + [7360, 2581], + function(e, t) { + e.exports = function(e) { + if (void 0 == e) throw TypeError("Can't call method on " + e) + return e + } + }, + function(e, t) { + var r = {}.hasOwnProperty + e.exports = function(e, t) { + return r.call(e, t) + } + }, + function(e, t) { + e.exports = function(e) { + return "object" == typeof e ? null !== e : "function" == typeof e + } + }, + [7375, 81, 558, 178], + [7436, 1406, 816, 94, 471, 180, 819, 2698], + [7468, 2693], + function(e, t) { + function r(e, t) { + return ( + (e = "number" == typeof e || n.test(e) ? +e : -1), + (t = null == t ? i : t), + e > -1 && e % 1 == 0 && t > e + ) + } + var n = /^\d+$/, + i = 9007199254740991 + e.exports = r + }, + [7477, 1401, 470, 471], + [7488, 2660, 1400, 1411], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.messages + return { + visitor: { + Scope: function(e) { + var r = e.scope + for (var n in r.bindings) { + var i = r.bindings[n] + if ("const" === i.kind || "module" === i.kind) + for ( + var s = i.constantViolations, a = 0; + a < s.length; + a++ + ) { + var o = s[a] + throw o.buildCodeFrameError(t.get("readOnly", n)) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("asyncFunctions") + } + } + }), + (e.exports = t["default"]) + }, + 563, + 148, + [7480, 1450, 475, 569], + [7491, 1450, 832, 379, 2814], + [7468, 2882], + [7491, 572, 837, 121, 2878], + 465, + 466, + 468, + 563, + 148, + [7480, 1496, 480, 578], + [7491, 1496, 858, 384, 3032], + function(e, t) { + "use strict" + ;(t["default"] = function(e) { + return e && e.__esModule ? e["default"] : e + }), + (t.__esModule = !0) + }, + 465, + 466, + 468, + [7455, 1538], + [7468, 3184], + [7471, 875, 876, 122], + [7341, 3211], + [7363, 590, 191, 3215], + 466, + 468, + [7468, 3337], + 563, + [7471, 894, 593, 123], + [7479, 894, 194], + 468, + 81, + [7363, 599, 197, 3397], + 466, + 468, + [7468, 3518], + 563, + [7471, 918, 602, 124], + [7479, 918, 200], + [7334, 3538], + 581, + [7363, 608, 202, 3549], + 466, + 468, + 563, + 148, + [7491, 1645, 935, 395, 3637], + [7455, 1671], + [7468, 3747], + [7471, 945, 946, 125], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + ArrowFunctionExpression: function(e, r) { + if (r.opts.spec) { + var n = e.node + if (n.shadow) return + ;(n.shadow = { this: !1 }), (n.type = "FunctionExpression") + var i = t.thisExpression() + ;(i._forceShadow = e), + e.ensureBlock(), + e + .get("body") + .unshiftContainer( + "body", + t.expressionStatement( + t.callExpression( + r.addHelper("newArrowCheck"), + [t.thisExpression(), i] + ) + ) + ), + e.replaceWith( + t.callExpression( + t.memberExpression(n, t.identifier("bind")), + [t.thisExpression()] + ) + ) + } else e.arrowFunctionToShadowed() + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e, t) { + for (var n = t.get(e), i = 0; i < n.length; i++) { + var s = n[i], + a = s.node + if (s.isFunctionDeclaration()) { + var o = r.variableDeclaration("let", [ + r.variableDeclarator(a.id, r.toExpression(a)) + ]) + ;(o._blockHoist = 2), (a.id = null), s.replaceWith(o) + } + } + } + var r = e.types + return { + visitor: { + BlockStatement: function(e) { + var n = e.node, + i = e.parent + r.isFunction(i, { body: n }) || + r.isExportDeclaration(i) || + t("body", e) + }, + SwitchCase: function(e) { + t("consequent", e) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e) { + return g.isVariableDeclaration(e) + ? e[g.BLOCK_SCOPED_SYMBOL] + ? !0 + : "let" === e.kind || "const" === e.kind + : !1 + } + function i(e, t, r) { + var n = arguments.length <= 3 || void 0 === arguments[3] ? !1 : arguments[3], + i = e.node + if (!g.isFor(t)) + for (var s = 0; s < i.declarations.length; s++) { + var a = i.declarations[s] + a.init = a.init || r.buildUndefinedNode() + } + if (((i[g.BLOCK_SCOPED_SYMBOL] = !0), (i.kind = "var"), n)) { + var o = r.getFunctionParent() + if (o === r) return + var u = e.getBindingIdentifiers() + for (var l in u) r.removeOwnBinding(l) + o.registerBinding("var", e) + } + } + function s(e) { + return g.isVariableDeclaration(e, { kind: "var" }) && !n(e) + } + function a(e, t, r, n) { + var i = n[t.name] + if (i) { + var s = r.getBindingIdentifier(t.name) + s === i.binding ? r.rename(t.name, i.uid) : e && e.skip() + } + } + function o(e, t, r, n) { + if ((g.isIdentifier(e) && a(e, t, r, n), g.isAssignmentExpression(e))) { + var i = g.getBindingIdentifiers(e) + for (var s in i) a(i[s], t, r, n) + } + r.traverse(e, F, n) + } + function u(e) { + return g.isBreakStatement(e) + ? "break" + : g.isContinueStatement(e) + ? "continue" + : void 0 + } + var l = r(207)["default"], + c = r(948)["default"], + p = r(619)["default"], + f = r(67)["default"], + h = r(31)["default"] + t.__esModule = !0 + var d = r(323), + m = f(d), + y = r(3757), + v = r(40), + g = h(v), + E = r(1707), + b = f(E), + x = r(3909), + A = f(x), + D = r(3800), + C = f(D) + t["default"] = function() { + return { + visitor: { + VariableDeclaration: function(e, t) { + var r = e.node, + s = e.parent, + a = e.scope + if (n(r) && (i(e, s, a, !0), r._tdzThis)) { + for (var o = [r], u = 0; u < r.declarations.length; u++) { + var l = r.declarations[u] + if (l.init) { + var c = g.assignmentExpression("=", l.id, l.init) + ;(c._ignoreBlockScopingTDZ = !0), + o.push(g.expressionStatement(c)) + } + l.init = t.addHelper("temporalUndefined") + } + ;(r._blockHoist = 2), + e.isCompletionRecord() && + o.push(g.expressionStatement(a.buildUndefinedNode())), + e.replaceWithMultiple(o) + } + }, + Loop: function(e, t) { + var r = e.node, + n = e.parent, + i = e.scope + g.ensureBlock(r) + var s = new I(e, e.get("body"), n, i, t), + a = s.run() + a && e.replaceWith(a) + }, + "BlockStatement|Program": function(e, t) { + if (!g.isLoop(e.parent)) { + var r = new I(null, e, e.parent, e.scope, t) + r.run() + } + } + } + } + } + var S = C["default"]('\n if (typeof RETURN === "object") return RETURN.v;\n'), + F = { + ReferencedIdentifier: function(e, t) { + a(e, e.node, e.scope, t) + }, + AssignmentExpression: function(e, t) { + var r = e.getBindingIdentifiers() + for (var n in r) a(null, r[n], e.scope, t) + } + }, + w = m["default"].visitors.merge([ + { + Function: function(e, t) { + return e.traverse(_, t), e.skip() + } + }, + y.visitor + ]), + _ = m["default"].visitors.merge([ + { + ReferencedIdentifier: function(e, t) { + var r = t.letReferences[e.node.name] + if (r) { + var n = e.scope.getBindingIdentifier(e.node.name) + ;(n && n !== r) || (t.closurify = !0) + } + } + }, + y.visitor + ]), + T = { + enter: function(e, t) { + var r = e.node, + n = e.parent + if (e.isForStatement()) { + if (s(r.init, r)) { + var i = t.pushDeclar(r.init) + 1 === i.length + ? (r.init = i[0]) + : (r.init = g.sequenceExpression(i)) + } + } else if (e.isFor()) + s(r.left, r) && + (t.pushDeclar(r.left), (r.left = r.left.declarations[0].id)) + else if (s(r, n)) + e.replaceWithMultiple( + t.pushDeclar(r).map(function(e) { + return g.expressionStatement(e) + }) + ) + else if (e.isFunction()) return e.skip() + } + }, + P = { + LabeledStatement: function(e, t) { + var r = e.node + t.innerLabels.push(r.label.name) + } + }, + B = { + enter: function(e, t) { + if (e.isAssignmentExpression() || e.isUpdateExpression()) { + var r = e.getBindingIdentifiers() + for (var n in r) + t.outsideReferences[n] === e.scope.getBindingIdentifier(n) && + (t.reassignments[n] = !0) + } + } + }, + k = { + Loop: function(e, t) { + var r = t.ignoreLabeless + ;(t.ignoreLabeless = !0), + e.traverse(k, t), + (t.ignoreLabeless = r), + e.skip() + }, + Function: function(e) { + e.skip() + }, + SwitchCase: function(e, t) { + var r = t.inSwitchCase + ;(t.inSwitchCase = !0), e.traverse(k, t), (t.inSwitchCase = r), e.skip() + }, + "BreakStatement|ContinueStatement|ReturnStatement": function(e, t) { + var r = e.node, + n = e.parent, + i = e.scope + if (!r[this.LOOP_IGNORE]) { + var s = void 0, + a = u(r) + if (a) { + if (r.label) { + if (t.innerLabels.indexOf(r.label.name) >= 0) return + a = a + "|" + r.label.name + } else { + if (t.ignoreLabeless) return + if (t.inSwitchCase) return + if (g.isBreakStatement(r) && g.isSwitchCase(n)) return + } + ;(t.hasBreakContinue = !0), + (t.map[a] = r), + (s = g.stringLiteral(a)) + } + e.isReturnStatement() && + ((t.hasReturn = !0), + (s = g.objectExpression([ + g.objectProperty( + g.identifier("v"), + r.argument || i.buildUndefinedNode() + ) + ]))), + s && + ((s = g.returnStatement(s)), + (s[this.LOOP_IGNORE] = !0), + e.skip(), + e.replaceWith(g.inherits(s, r))) + } + } + }, + I = (function() { + function e(t, r, n, i, s) { + l(this, e), + (this.parent = n), + (this.scope = i), + (this.file = s), + (this.blockPath = r), + (this.block = r.node), + (this.outsideLetReferences = c(null)), + (this.hasLetReferences = !1), + (this.letReferences = c(null)), + (this.letReferencesDeclars = []), + (this.body = []), + t && + ((this.loopParent = t.parent), + (this.loopLabel = + g.isLabeledStatement(this.loopParent) && + this.loopParent.label), + (this.loopPath = t), + (this.loop = t.node)) + } + return ( + (e.prototype.run = function() { + var e = this.block + if (!e._letDone) { + e._letDone = !0 + var t = this.getLetReferences() + if ( + !g.isFunction(this.parent) && + !g.isProgram(this.block) && + this.hasLetReferences + ) + return ( + t ? this.wrapClosure() : this.remap(), + this.loopLabel && !g.isLabeledStatement(this.loopParent) + ? g.labeledStatement(this.loopLabel, this.loop) + : void 0 + ) + } + }), + (e.prototype.remap = function() { + var e = !1, + t = this.letReferences, + r = this.scope, + n = r.getFunctionParent(), + i = c(null) + for (var s in t) { + var a = t[s] + if (r.parentHasBinding(s) || r.hasGlobal(s)) { + var u = r.generateUidIdentifier(a.name).name + ;(a.name = u), + (e = !0), + (i[s] = i[u] = { binding: a, uid: u }) + } + n !== r && r.removeOwnBinding(a.name) + } + if (n !== r) + for ( + var l = this.letReferencesDeclars, p = 0; + p < l.length; + p++ + ) { + var f = l[p] + n.registerBinding("var", f) + } + if (e) { + var h = this.loop + h && + (o(h.right, h, r, i), + o(h.test, h, r, i), + o(h.update, h, r, i)), + this.blockPath.traverse(F, i) + } + }), + (e.prototype.wrapClosure = function() { + var e = this.block, + t = this.outsideLetReferences + if (this.loop) + for (var r in t) { + var n = t[r] + ;(this.scope.hasGlobal(n.name) || + this.scope.parentHasBinding(n.name)) && + (delete t[n.name], + delete this.letReferences[n.name], + this.scope.rename(n.name), + (this.letReferences[n.name] = n), + (t[n.name] = n)) + } + ;(this.has = this.checkLoop()), this.hoistVarDeclarations() + var i = b["default"](t), + s = b["default"](t), + a = g.functionExpression(null, i, g.blockStatement(e.body)) + ;(a.shadow = !0), this.addContinuations(a), (e.body = this.body) + var o = a + this.loop && + ((o = this.scope.generateUidIdentifier("loop")), + this.loopPath.insertBefore( + g.variableDeclaration("var", [g.variableDeclarator(o, a)]) + )) + var u = g.callExpression(o, s), + l = this.scope.generateUidIdentifier("ret"), + c = m["default"].hasType( + a.body, + this.scope, + "YieldExpression", + g.FUNCTION_TYPES + ) + c && ((a.generator = !0), (u = g.yieldExpression(u, !0))) + var p = m["default"].hasType( + a.body, + this.scope, + "AwaitExpression", + g.FUNCTION_TYPES + ) + p && ((a.async = !0), (u = g.awaitExpression(u))), + this.buildClosure(l, u) + }), + (e.prototype.buildClosure = function(e, t) { + var r = this.has + r.hasReturn || r.hasBreakContinue + ? this.buildHas(e, t) + : this.body.push(g.expressionStatement(t)) + }), + (e.prototype.addContinuations = function(e) { + var t = { + reassignments: {}, + outsideReferences: this.outsideLetReferences + } + this.scope.traverse(e, B, t) + for (var r = 0; r < e.params.length; r++) { + var n = e.params[r] + if (t.reassignments[n.name]) { + var i = this.scope.generateUidIdentifier(n.name) + ;(e.params[r] = i), + this.scope.rename(n.name, i.name, e), + e.body.body.push( + g.expressionStatement( + g.assignmentExpression("=", n, i) + ) + ) + } + } + }), + (e.prototype.getLetReferences = function() { + var e = this.block, + t = [] + if (this.loop) { + var r = this.loop.left || this.loop.init + n(r) && + (t.push(r), + A["default"]( + this.outsideLetReferences, + g.getBindingIdentifiers(r) + )) + } + if (e.body) + for (var s = 0; s < e.body.length; s++) { + var a = e.body[s] + if ( + g.isClassDeclaration(a) || + g.isFunctionDeclaration(a) || + n(a) + ) { + var o = this.blockPath.get("body")[s] + n(a) && + (i(o, e, this.scope), + this.letReferencesDeclars.push(o)), + (t = t.concat(a.declarations || a)) + } + } + for (var s = 0; s < t.length; s++) { + var a = t[s], + u = g.getBindingIdentifiers(a) + A["default"](this.letReferences, u), + (this.hasLetReferences = !0) + } + if (this.hasLetReferences) { + var l = { + letReferences: this.letReferences, + closurify: !1, + file: this.file + } + return this.blockPath.traverse(w, l), l.closurify + } + }), + (e.prototype.checkLoop = function() { + var e = { + hasBreakContinue: !1, + ignoreLabeless: !1, + inSwitchCase: !1, + innerLabels: [], + hasReturn: !1, + isLoop: !!this.loop, + map: {}, + LOOP_IGNORE: p() + } + return ( + this.blockPath.traverse(P, e), this.blockPath.traverse(k, e), e + ) + }), + (e.prototype.hoistVarDeclarations = function() { + this.blockPath.traverse(T, this) + }), + (e.prototype.pushDeclar = function(e) { + var t = [], + r = g.getBindingIdentifiers(e) + for (var n in r) t.push(g.variableDeclarator(r[n])) + this.body.push(g.variableDeclaration(e.kind, t)) + for (var i = [], s = 0; s < e.declarations.length; s++) { + var a = e.declarations[s] + if (a.init) { + var o = g.assignmentExpression("=", a.id, a.init) + i.push(g.inherits(o, a)) + } + } + return i + }), + (e.prototype.buildHas = function(e, t) { + var r = this.body + r.push(g.variableDeclaration("var", [g.variableDeclarator(e, t)])) + var n = void 0, + i = this.has, + s = [] + if ((i.hasReturn && (n = S({ RETURN: e })), i.hasBreakContinue)) { + for (var a in i.map) + s.push(g.switchCase(g.stringLiteral(a), [i.map[a]])) + if ( + (i.hasReturn && s.push(g.switchCase(null, [n])), + 1 === s.length) + ) { + var o = s[0] + r.push( + g.ifStatement( + g.binaryExpression("===", e, o.test), + o.consequent[0] + ) + ) + } else { + for (var u = 0; u < s.length; u++) { + var l = s[u].consequent[0] + g.isBreakStatement(l) && + !l.label && + (l.label = this.loopLabel = + this.loopLabel || + this.scope.generateUidIdentifier("loop")) + } + r.push(g.switchStatement(e, s)) + } + } else i.hasReturn && r.push(n) + }), + e + ) + })() + e.exports = t["default"] + }, + [7341, 3775], + [7363, 621, 208, 3779], + 466, + 468, + [7468, 3903], + 563, + [7471, 965, 624, 126], + [7479, 965, 211], + [7488, 3869, 1695, 3885], + function(e, t, r) { + "use strict" + var n = r(498)["default"], + i = r(32)["default"] + t.__esModule = !0 + var s = r(3913), + a = i(s), + o = r(1709), + u = i(o), + l = r(971), + c = i(l) + ;(t["default"] = function(e) { + var t = e.types, + r = n() + return { + visitor: { + ExportDefaultDeclaration: function(e) { + if (e.get("declaration").isClassDeclaration()) { + var r = e.node, + n = + r.declaration.id || + e.scope.generateUidIdentifier("class") + ;(r.declaration.id = n), + e.replaceWith(r.declaration), + e.insertAfter(t.exportDefaultDeclaration(n)) + } + }, + ClassDeclaration: function(e) { + var r = e.node, + n = r.id || e.scope.generateUidIdentifier("class") + e.replaceWith( + t.variableDeclaration("let", [ + t.variableDeclarator(n, t.toExpression(r)) + ]) + ) + }, + ClassExpression: function(e, t) { + var n = e.node + if (!n[r]) { + var i = c["default"](e) + if (i && i !== n) return e.replaceWith(i) + n[r] = !0 + var s = u["default"] + t.opts.loose && (s = a["default"]), + e.replaceWith(new s(e, t.file).run()) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7475, 630], + 99, + [7330, 23], + 466, + 468, + 563, + 148, + [7480, 1739, 502, 635], + [7491, 1739, 991, 404, 4079], + [7468, 4147], + [7491, 638, 996, 127, 4143], + function(e, t, r) { + "use strict" + var n = r(4156)["default"] + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + return o.isObjectProperty(e) + ? e.value + : o.isObjectMethod(e) + ? o.functionExpression(null, e.params, e.body, e.generator, e.async) + : void 0 + } + function r(e, r, n) { + "get" === r.kind && "set" === r.kind + ? i(e, r, n) + : n.push( + o.expressionStatement( + o.assignmentExpression( + "=", + o.memberExpression( + e, + r.key, + r.computed || o.isLiteral(r.key) + ), + t(r) + ) + ) + ) + } + function i(e, r) { + var n = (e.objId, e.body), + i = e.getMutatorId, + s = e.scope, + a = + !r.computed && o.isIdentifier(r.key) + ? o.stringLiteral(r.key.name) + : r.key, + u = s.maybeGenerateMemoised(a) + u && + (n.push(o.expressionStatement(o.assignmentExpression("=", u, a))), + (a = u)), + n.push.apply( + n, + l({ + MUTATOR_MAP_REF: i(), + KEY: a, + VALUE: t(r), + KIND: o.identifier(r.kind) + }) + ) + } + function s(e) { + for ( + var t = e.computedProps, + s = Array.isArray(t), + a = 0, + t = s ? t : n(t); + ; + + ) { + var o + if (s) { + if (a >= t.length) break + o = t[a++] + } else { + if (((a = t.next()), a.done)) break + o = a.value + } + var u = o + "get" === u.kind || "set" === u.kind + ? i(e, u) + : r(e.objId, u, e.body) + } + } + function a(e) { + for ( + var s = e.objId, + a = e.body, + u = e.computedProps, + l = e.state, + c = u, + p = Array.isArray(c), + f = 0, + c = p ? c : n(c); + ; + + ) { + var h + if (p) { + if (f >= c.length) break + h = c[f++] + } else { + if (((f = c.next()), f.done)) break + h = f.value + } + var d = h, + m = o.toComputedKey(d) + if ("get" === d.kind || "set" === d.kind) i(e, d) + else if (o.isStringLiteral(m, { value: "__proto__" })) r(s, d, a) + else { + if (1 === u.length) + return o.callExpression(l.addHelper("defineProperty"), [ + e.initPropExpression, + m, + t(d) + ]) + a.push( + o.expressionStatement( + o.callExpression(l.addHelper("defineProperty"), [ + s, + m, + t(d) + ]) + ) + ) + } + } + } + var o = e.types, + u = e.template, + l = u( + "\n MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};\n MUTATOR_MAP_REF[KEY].KIND = VALUE;\n " + ) + return { + visitor: { + ObjectExpression: { + exit: function(e, t) { + for ( + var r = e.node, + i = e.parent, + u = e.scope, + l = !1, + c = r.properties, + p = 0; + p < c.length; + p++ + ) { + var f = c[p] + if ((l = f.computed === !0)) break + } + if (l) { + for ( + var h = [], + d = [], + m = !1, + y = r.properties, + v = Array.isArray(y), + g = 0, + y = v ? y : n(y); + ; + + ) { + var E + if (v) { + if (g >= y.length) break + E = y[g++] + } else { + if (((g = y.next()), g.done)) break + E = g.value + } + var f = E + f.computed && (m = !0), m ? d.push(f) : h.push(f) + } + var b = u.generateUidIdentifierBasedOnNode(i), + x = o.objectExpression(h), + A = [] + A.push( + o.variableDeclaration("var", [ + o.variableDeclarator(b, x) + ]) + ) + var D = a + t.opts.loose && (D = s) + var C = void 0, + S = function() { + return ( + C || + ((C = u.generateUidIdentifier( + "mutatorMap" + )), + A.push( + o.variableDeclaration("var", [ + o.variableDeclarator( + C, + o.objectExpression([]) + ) + ]) + )), + C + ) + }, + F = D({ + scope: u, + objId: b, + body: A, + computedProps: d, + initPropExpression: x, + getMutatorId: S, + state: t + }) + C && + A.push( + o.expressionStatement( + o.callExpression( + t.addHelper( + "defineEnumerableProperties" + ), + [b, C] + ) + ) + ), + F + ? e.replaceWith(F) + : (A.push(o.expressionStatement(b)), + e.replaceWithMultiple(A)) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + 468, + 81, + function(e, t, r) { + "use strict" + var n = r(4182)["default"] + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + for (var t = e.declarations, r = 0; r < t.length; r++) { + var n = t[r] + if (i.isPattern(n.id)) return !0 + } + return !1 + } + function r(e) { + for (var t = e.elements, r = 0; r < t.length; r++) { + var n = t[r] + if (i.isRestElement(n)) return !0 + } + return !1 + } + var i = e.types, + s = { + ReferencedIdentifier: function(e, t) { + t.bindings[e.node.name] && ((t.deopt = !0), e.stop()) + } + }, + a = (function() { + function e(t) { + n(this, e), + (this.blockHoist = t.blockHoist), + (this.operator = t.operator), + (this.arrays = {}), + (this.nodes = t.nodes || []), + (this.scope = t.scope), + (this.file = t.file), + (this.kind = t.kind) + } + return ( + (e.prototype.buildVariableAssignment = function(e, t) { + var r = this.operator + i.isMemberExpression(e) && (r = "=") + var n = void 0 + return ( + (n = r + ? i.expressionStatement( + i.assignmentExpression(r, e, t) + ) + : i.variableDeclaration(this.kind, [ + i.variableDeclarator(e, t) + ])), + (n._blockHoist = this.blockHoist), + n + ) + }), + (e.prototype.buildVariableDeclaration = function(e, t) { + var r = i.variableDeclaration("var", [ + i.variableDeclarator(e, t) + ]) + return (r._blockHoist = this.blockHoist), r + }), + (e.prototype.push = function(e, t) { + i.isObjectPattern(e) + ? this.pushObjectPattern(e, t) + : i.isArrayPattern(e) + ? this.pushArrayPattern(e, t) + : i.isAssignmentPattern(e) + ? this.pushAssignmentPattern(e, t) + : this.nodes.push(this.buildVariableAssignment(e, t)) + }), + (e.prototype.toArray = function(e, t) { + return this.file.opts.loose || + (i.isIdentifier(e) && this.arrays[e.name]) + ? e + : this.scope.toArray(e, t) + }), + (e.prototype.pushAssignmentPattern = function(e, t) { + var r = this.scope.generateUidIdentifierBasedOnNode(t), + n = i.variableDeclaration("var", [ + i.variableDeclarator(r, t) + ]) + ;(n._blockHoist = this.blockHoist), this.nodes.push(n) + var s = i.conditionalExpression( + i.binaryExpression( + "===", + r, + i.identifier("undefined") + ), + e.right, + r + ), + a = e.left + if (i.isPattern(a)) { + var o = i.expressionStatement( + i.assignmentExpression("=", r, s) + ) + ;(o._blockHoist = this.blockHoist), + this.nodes.push(o), + this.push(a, r) + } else this.nodes.push(this.buildVariableAssignment(a, s)) + }), + (e.prototype.pushObjectRest = function(e, t, r, n) { + for (var s = [], a = 0; a < e.properties.length; a++) { + var o = e.properties[a] + if (a >= n) break + if (!i.isRestProperty(o)) { + var u = o.key + i.isIdentifier(u) && + !o.computed && + (u = i.stringLiteral(o.key.name)), + s.push(u) + } + } + s = i.arrayExpression(s) + var l = i.callExpression( + this.file.addHelper("objectWithoutProperties"), + [t, s] + ) + this.nodes.push(this.buildVariableAssignment(r.argument, l)) + }), + (e.prototype.pushObjectProperty = function(e, t) { + i.isLiteral(e.key) && (e.computed = !0) + var r = e.value, + n = i.memberExpression(t, e.key, e.computed) + i.isPattern(r) + ? this.push(r, n) + : this.nodes.push(this.buildVariableAssignment(r, n)) + }), + (e.prototype.pushObjectPattern = function(e, t) { + if ( + (e.properties.length || + this.nodes.push( + i.expressionStatement( + i.callExpression( + this.file.addHelper( + "objectDestructuringEmpty" + ), + [t] + ) + ) + ), + e.properties.length > 1 && !this.scope.isStatic(t)) + ) { + var r = this.scope.generateUidIdentifierBasedOnNode(t) + this.nodes.push(this.buildVariableDeclaration(r, t)), + (t = r) + } + for (var n = 0; n < e.properties.length; n++) { + var s = e.properties[n] + i.isRestProperty(s) + ? this.pushObjectRest(e, t, s, n) + : this.pushObjectProperty(s, t) + } + }), + (e.prototype.canUnpackArrayPattern = function(e, t) { + if (!i.isArrayExpression(t)) return !1 + if (!(e.elements.length > t.elements.length)) { + if (e.elements.length < t.elements.length && !r(e)) + return !1 + for (var n = e.elements, a = 0; a < n.length; a++) { + var o = n[a] + if (!o) return !1 + if (i.isMemberExpression(o)) return !1 + } + for (var u = t.elements, l = 0; l < u.length; l++) { + var o = u[l] + if (i.isSpreadElement(o)) return !1 + } + var c = i.getBindingIdentifiers(e), + p = { deopt: !1, bindings: c } + return this.scope.traverse(t, s, p), !p.deopt + } + }), + (e.prototype.pushUnpackedArrayPattern = function(e, t) { + for (var r = 0; r < e.elements.length; r++) { + var n = e.elements[r] + i.isRestElement(n) + ? this.push( + n.argument, + i.arrayExpression(t.elements.slice(r)) + ) + : this.push(n, t.elements[r]) + } + }), + (e.prototype.pushArrayPattern = function(e, t) { + if (e.elements) { + if (this.canUnpackArrayPattern(e, t)) + return this.pushUnpackedArrayPattern(e, t) + var n = !r(e) && e.elements.length, + s = this.toArray(t, n) + i.isIdentifier(s) + ? (t = s) + : ((t = this.scope.generateUidIdentifierBasedOnNode( + t + )), + (this.arrays[t.name] = !0), + this.nodes.push( + this.buildVariableDeclaration(t, s) + )) + for (var a = 0; a < e.elements.length; a++) { + var o = e.elements[a] + if (o) { + var u = void 0 + i.isRestElement(o) + ? ((u = this.toArray(t)), + a > 0 && + (u = i.callExpression( + i.memberExpression( + u, + i.identifier("slice") + ), + [i.numericLiteral(a)] + )), + (o = o.argument)) + : (u = i.memberExpression( + t, + i.numericLiteral(a), + !0 + )), + this.push(o, u) + } + } + } + }), + (e.prototype.init = function(e, t) { + if (!i.isArrayExpression(t) && !i.isMemberExpression(t)) { + var r = this.scope.maybeGenerateMemoised(t, !0) + r && + (this.nodes.push( + this.buildVariableDeclaration(r, t) + ), + (t = r)) + } + return this.push(e, t), this.nodes + }), + e + ) + })() + return { + visitor: { + ExportNamedDeclaration: function(e) { + var r = e.get("declaration") + if (r.isVariableDeclaration() && t(r.node)) { + var n = [] + for (var s in e.getOuterBindingIdentifiers(e)) { + var a = i.identifier(s) + n.push(i.exportSpecifier(a, a)) + } + e.replaceWith(r.node), + e.insertAfter(i.exportNamedDeclaration(null, n)) + } + }, + ForXStatement: function(e, t) { + var r = e.node, + n = e.scope, + s = r.left + if (i.isPattern(s)) { + var o = n.generateUidIdentifier("ref") + return ( + (r.left = i.variableDeclaration("var", [ + i.variableDeclarator(o) + ])), + e.ensureBlock(), + void r.body.body.unshift( + i.variableDeclaration("var", [ + i.variableDeclarator(s, o) + ]) + ) + ) + } + if (i.isVariableDeclaration(s)) { + var u = s.declarations[0].id + if (i.isPattern(u)) { + var l = n.generateUidIdentifier("ref") + r.left = i.variableDeclaration(s.kind, [ + i.variableDeclarator(l, null) + ]) + var c = [], + p = new a({ + kind: s.kind, + file: t, + scope: n, + nodes: c + }) + p.init(u, l), e.ensureBlock() + var f = r.body + f.body = c.concat(f.body) + } + } + }, + CatchClause: function(e, t) { + var r = e.node, + n = e.scope, + s = r.param + if (i.isPattern(s)) { + var o = n.generateUidIdentifier("ref") + r.param = o + var u = [], + l = new a({ kind: "let", file: t, scope: n, nodes: u }) + l.init(s, o), (r.body.body = u.concat(r.body.body)) + } + }, + AssignmentExpression: function(e, t) { + var r = e.node, + n = e.scope + if (i.isPattern(r.left)) { + var s = [], + o = new a({ + operator: r.operator, + file: t, + scope: n, + nodes: s + }), + u = void 0 + ;(!e.isCompletionRecord() && + e.parentPath.isExpressionStatement()) || + ((u = n.generateUidIdentifierBasedOnNode( + r.right, + "ref" + )), + s.push( + i.variableDeclaration("var", [ + i.variableDeclarator(u, r.right) + ]) + ), + i.isArrayExpression(r.right) && + (o.arrays[u.name] = !0)), + o.init(r.left, u || r.right), + u && s.push(i.expressionStatement(u)), + e.replaceWithMultiple(s) + } + }, + VariableDeclaration: function(e, r) { + var n = e.node, + s = e.scope, + o = e.parent + if (!i.isForXStatement(o) && o && e.container && t(n)) { + for ( + var u = [], l = void 0, c = 0; + c < n.declarations.length; + c++ + ) { + l = n.declarations[c] + var p = l.init, + f = l.id, + h = new a({ + blockHoist: n._blockHoist, + nodes: u, + scope: s, + kind: n.kind, + file: r + }) + i.isPattern(f) + ? (h.init(f, p), + +c !== n.declarations.length - 1 && + i.inherits(u[u.length - 1], l)) + : u.push( + i.inherits( + h.buildVariableAssignment(l.id, l.init), + l + ) + ) + } + e.replaceWithMultiple(u) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + var t = e.node, + r = e.scope, + n = [], + i = t.right + if (!a.isIdentifier(i) || !r.hasBinding(i.name)) { + var s = r.generateUidIdentifier("arr") + n.push(a.variableDeclaration("var", [a.variableDeclarator(s, i)])), + (i = s) + } + var u = r.generateUidIdentifier("i"), + l = o({ BODY: t.body, KEY: u, ARR: i }) + a.inherits(l, t), a.ensureBlock(l) + var c = a.memberExpression(i, u, !0), + p = t.left + return ( + a.isVariableDeclaration(p) + ? ((p.declarations[0].init = c), l.body.body.unshift(p)) + : l.body.body.unshift( + a.expressionStatement(a.assignmentExpression("=", p, c)) + ), + e.parentPath.isLabeledStatement() && + (l = a.labeledStatement(e.parentPath.node.label, l)), + n.push(l), + n + ) + } + function r(e, t) { + var r = e.node, + n = e.scope, + s = r.left, + o = void 0, + l = void 0 + if (a.isIdentifier(s) || a.isPattern(s) || a.isMemberExpression(s)) + l = s + else { + if (!a.isVariableDeclaration(s)) + throw t.buildCodeFrameError(s, i.get("unknownForHead", s.type)) + ;(l = n.generateUidIdentifier("ref")), + (o = a.variableDeclaration(s.kind, [ + a.variableDeclarator(s.declarations[0].id, l) + ])) + } + var c = n.generateUidIdentifier("iterator"), + p = n.generateUidIdentifier("isArray"), + f = u({ + LOOP_OBJECT: c, + IS_ARRAY: p, + OBJECT: r.right, + INDEX: n.generateUidIdentifier("i"), + ID: l + }) + return o || f.body.body.shift(), { declar: o, node: f, loop: f } + } + function n(e, t) { + var r = e.node, + n = e.scope, + s = e.parent, + o = r.left, + u = void 0, + c = n.generateUidIdentifier("step"), + p = a.memberExpression(c, a.identifier("value")) + if (a.isIdentifier(o) || a.isPattern(o) || a.isMemberExpression(o)) + u = a.expressionStatement(a.assignmentExpression("=", o, p)) + else { + if (!a.isVariableDeclaration(o)) + throw t.buildCodeFrameError(o, i.get("unknownForHead", o.type)) + u = a.variableDeclaration(o.kind, [ + a.variableDeclarator(o.declarations[0].id, p) + ]) + } + var f = n.generateUidIdentifier("iterator"), + h = l({ + ITERATOR_HAD_ERROR_KEY: n.generateUidIdentifier( + "didIteratorError" + ), + ITERATOR_COMPLETION: n.generateUidIdentifier( + "iteratorNormalCompletion" + ), + ITERATOR_ERROR_KEY: n.generateUidIdentifier("iteratorError"), + ITERATOR_KEY: f, + STEP_KEY: c, + OBJECT: r.right, + BODY: null + }), + d = a.isLabeledStatement(s), + m = h[3].block.body, + y = m[0] + return ( + d && (m[0] = a.labeledStatement(s.label, y)), + { replaceParent: d, declar: u, loop: y, node: h } + ) + } + var i = e.messages, + s = e.template, + a = e.types, + o = s("\n for (var KEY = 0; KEY < ARR.length; KEY++) BODY;\n "), + u = s( + "\n for (var LOOP_OBJECT = OBJECT,\n IS_ARRAY = Array.isArray(LOOP_OBJECT),\n INDEX = 0,\n LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {\n var ID;\n if (IS_ARRAY) {\n if (INDEX >= LOOP_OBJECT.length) break;\n ID = LOOP_OBJECT[INDEX++];\n } else {\n INDEX = LOOP_OBJECT.next();\n if (INDEX.done) break;\n ID = INDEX.value;\n }\n }\n " + ), + l = s( + "\n var ITERATOR_COMPLETION = true;\n var ITERATOR_HAD_ERROR_KEY = false;\n var ITERATOR_ERROR_KEY = undefined;\n try {\n for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(ITERATOR_COMPLETION = (STEP_KEY = ITERATOR_KEY.next()).done); ITERATOR_COMPLETION = true) {\n }\n } catch (err) {\n ITERATOR_HAD_ERROR_KEY = true;\n ITERATOR_ERROR_KEY = err;\n } finally {\n try {\n if (!ITERATOR_COMPLETION && ITERATOR_KEY.return) {\n ITERATOR_KEY.return();\n }\n } finally {\n if (ITERATOR_HAD_ERROR_KEY) {\n throw ITERATOR_ERROR_KEY;\n }\n }\n }\n " + ) + return { + visitor: { + ForOfStatement: function(e, i) { + if (e.get("right").isArrayExpression()) + return e.replaceWithMultiple(t.call(this, e, i)) + var s = n + i.opts.loose && (s = r) + var o = e.node, + u = s(e, i), + l = u.declar, + c = u.loop, + p = c.body + e.ensureBlock(), + l && p.body.push(l), + (p.body = p.body.concat(o.body.body)), + a.inherits(c, o), + a.inherits(c.body, o.body), + u.replaceParent + ? (e.parentPath.replaceWithMultiple(u.node), e.remove()) + : e.replaceWithMultiple(u.node) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(19)["default"] + t.__esModule = !0 + var i = r(4183), + s = n(i) + ;(t["default"] = function() { + return { + visitor: { + "ArrowFunctionExpression|FunctionExpression": { + exit: function(e) { + if ("value" !== e.key && !e.parentPath.isObjectProperty()) { + var t = s["default"](e) + t && e.replaceWith(t) + } + } + }, + ObjectProperty: function(e) { + var t = e.get("value") + if (t.isFunction()) { + var r = s["default"](t) + r && t.replaceWith(r) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 563, + 148, + [7480, 1777, 506, 647], + [7491, 1777, 1010, 408, 4279], + 581, + [7363, 652, 217, 4310], + 466, + 468, + [7455, 1817], + [7468, 4429], + [7471, 1028, 1029, 128], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + NumericLiteral: function(e) { + var t = e.node + t.extra && /^0[ob]/i.test(t.extra.raw) && (t.extra = void 0) + }, + StringLiteral: function(e) { + var t = e.node + t.extra && /\\[u]/gi.test(t.extra.raw) && (t.extra = void 0) + } + } + } + }), + (e.exports = t["default"]) + }, + [7363, 659, 222, 4461], + 466, + 468, + [7468, 4583], + 563, + [7471, 1049, 662, 129], + [7479, 1049, 225], + [7334, 4601], + 581, + [7363, 668, 227, 4612], + 466, + 468, + 563, + 148, + [7491, 1878, 1067, 418, 4700], + [7455, 1904], + [7468, 4810], + [7471, 1077, 1078, 130], + [7455, 1930], + [7468, 4920], + [7471, 1085, 1086, 131], + 581, + [7363, 681, 234, 4945], + 466, + 468, + [7468, 5067], + 563, + [7471, 1103, 684, 132], + [7479, 1103, 237], + [7363, 688, 240, 5099], + 466, + 468, + [7468, 5221], + 563, + [7471, 1124, 691, 133], + [7479, 1124, 243], + function(e, t, r) { + "use strict" + var n = r(701)["default"], + i = r(70)["default"] + t.__esModule = !0 + var s = r(5231), + a = i(s) + ;(t["default"] = function(e) { + function t(e, t, r, n, i) { + var s = new a["default"]({ + getObjectRef: n, + methodNode: t, + methodPath: e, + isStatic: !0, + scope: r, + file: i + }) + s.replace() + } + var r = e.types, + i = n() + return { + visitor: { + Super: function(e) { + var t = e.findParent(function(e) { + return e.isObjectExpression() + }) + t && (t.node[i] = !0) + }, + ObjectExpression: { + exit: function(e, n) { + if (e.node[i]) { + for ( + var s = void 0, + a = function() { + return (s = + s || e.scope.generateUidIdentifier("obj")) + }, + o = e.get("properties"), + u = 0; + u < o.length; + u++ + ) { + var l = o[u] + l.isObjectProperty() && (l = l.get("value")), + t(l, l.node, e.scope, a, n) + } + s && + (e.scope.push({ id: s }), + e.replaceWith(r.assignmentExpression("=", s, e.node))) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7330, 34], + 148, + [7480, 2019, 523, 696], + [7491, 2019, 1130, 429, 5294], + [7468, 5362], + [7491, 699, 1135, 134, 5358], + [7341, 5388], + [7363, 703, 251, 5392], + 466, + 468, + function(e, t, r) { + "use strict" + var n = r(24)["default"] + t.__esModule = !0 + var i = r(343), + s = r(5414), + a = n(s), + o = r(5413), + u = n(o), + l = r(5415), + c = n(l) + ;(t["default"] = function() { + return { + visitor: i.visitors.merge([ + { + ArrowFunctionExpression: function(e) { + for (var t = e.get("params"), r = 0; r < t.length; r++) { + var n = t[r] + if (n.isRestElement() || n.isAssignmentPattern()) { + e.arrowFunctionToShadowed() + break + } + } + } + }, + a.visitor, + c.visitor, + u.visitor + ]) + } + }), + (e.exports = t["default"]) + }, + [7363, 707, 253, 5440], + 466, + 468, + 563, + 148, + [7480, 2074, 527, 710], + [7491, 2074, 1167, 435, 5554], + [7468, 5622], + [7491, 713, 1172, 135, 5618], + function(e, t, r) { + "use strict" + var n = r(43)["default"] + t.__esModule = !0 + var i = r(60), + s = n(i) + ;(t["default"] = function() { + return { + visitor: { + ObjectMethod: function(e) { + var t = e.node + "method" === t.kind && + e.replaceWith( + s.objectProperty( + t.key, + s.functionExpression( + null, + t.params, + t.body, + t.generator, + t.async + ), + t.computed + ) + ) + }, + ObjectProperty: function(e) { + var t = e.node + t.shorthand && (t.shorthand = !1) + } + } + } + }), + (e.exports = t["default"]) + }, + [7363, 717, 259, 5652], + 466, + 468, + [7455, 2130], + [7468, 5771], + [7471, 1190, 1191, 136], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e, t, r) { + return r.opts.loose && + !i.isIdentifier(e.argument, { name: "arguments" }) + ? e.argument + : t.toArray(e.argument, !0) + } + function r(e) { + for (var t = 0; t < e.length; t++) + if (i.isSpreadElement(e[t])) return !0 + return !1 + } + function n(e, r, n) { + function s() { + o.length && (a.push(i.arrayExpression(o)), (o = [])) + } + for (var a = [], o = [], u = 0; u < e.length; u++) { + var l = e[u] + i.isSpreadElement(l) ? (s(), a.push(t(l, r, n))) : o.push(l) + } + return s(), a + } + var i = e.types + return { + visitor: { + ArrayExpression: function(e, t) { + var s = e.node, + a = e.scope, + o = s.elements + if (r(o)) { + var u = n(o, a, t), + l = u.shift() + i.isArrayExpression(l) || + (u.unshift(l), (l = i.arrayExpression([]))), + e.replaceWith( + i.callExpression( + i.memberExpression(l, i.identifier("concat")), + u + ) + ) + } + }, + CallExpression: function(e, t) { + var s = e.node, + a = e.scope, + o = s.arguments + if (r(o)) { + var u = e.get("callee") + if (!u.isSuper()) { + var l = i.identifier("undefined") + s.arguments = [] + var c = void 0 + c = + 1 === o.length && "arguments" === o[0].argument.name + ? [o[0].argument] + : n(o, a, t) + var p = c.shift() + c.length + ? s.arguments.push( + i.callExpression( + i.memberExpression( + p, + i.identifier("concat") + ), + c + ) + ) + : s.arguments.push(p) + var f = s.callee + if (u.isMemberExpression()) { + var h = a.maybeGenerateMemoised(f.object) + h + ? ((f.object = i.assignmentExpression( + "=", + h, + f.object + )), + (l = h)) + : (l = f.object), + i.appendToMemberExpression( + f, + i.identifier("apply") + ) + } else + s.callee = i.memberExpression( + s.callee, + i.identifier("apply") + ) + i.isSuper(l) && (l = i.thisExpression()), + s.arguments.unshift(l) + } + } + }, + NewExpression: function(e, t) { + var s = e.node, + a = e.scope, + o = s.arguments + if (r(o)) { + var u = n(o, a, t), + l = i.arrayExpression([i.nullLiteral()]) + ;(o = i.callExpression( + i.memberExpression(l, i.identifier("concat")), + u + )), + e.replaceWith( + i.newExpression( + i.callExpression( + i.memberExpression( + i.memberExpression( + i.memberExpression( + i.identifier("Function"), + i.identifier("prototype") + ), + i.identifier("bind") + ), + i.identifier("apply") + ), + [s.callee, o] + ), + [] + ) + ) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(35)["default"] + t.__esModule = !0 + var i = r(5781), + s = n(i), + a = r(51), + o = n(a) + ;(t["default"] = function() { + return { + visitor: { + RegExpLiteral: function(e) { + var t = e.node + s.is(t, "y") && + e.replaceWith( + o.newExpression(o.identifier("RegExp"), [ + o.stringLiteral(t.pattern), + o.stringLiteral(t.flags) + ]) + ) + } + } + } + }), + (e.exports = t["default"]) + }, + [7363, 725, 264, 5806], + 466, + 468, + [7455, 2168], + [7468, 5925], + [7471, 1208, 1209, 137], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + return n.isLiteral(e) && "string" == typeof e.value + } + function r(e, t) { + return n.binaryExpression("+", e, t) + } + var n = e.types + return { + visitor: { + TaggedTemplateExpression: function(e, t) { + for ( + var r = e.node, + i = r.quasi, + s = [], + a = [], + o = [], + u = i.quasis, + l = 0; + l < u.length; + l++ + ) { + var c = u[l] + a.push(n.stringLiteral(c.value.cooked)), + o.push(n.stringLiteral(c.value.raw)) + } + ;(a = n.arrayExpression(a)), (o = n.arrayExpression(o)) + var p = "taggedTemplateLiteral" + t.opts.loose && (p += "Loose") + var f = t.file.addTemplateObject(p, a, o) + s.push(f), + (s = s.concat(i.expressions)), + e.replaceWith(n.callExpression(r.tag, s)) + }, + TemplateLiteral: function(e, i) { + for ( + var s = [], + a = e.get("expressions"), + o = e.node.quasis, + u = 0; + u < o.length; + u++ + ) { + var l = o[u] + s.push(n.stringLiteral(l.value.cooked)) + var c = a.shift() + c && + (!i.opts.spec || + c.isBaseType("string") || + c.isBaseType("number") + ? s.push(c.node) + : s.push( + n.callExpression(n.identifier("String"), [ + c.node + ]) + )) + } + if ( + ((s = s.filter(function(e) { + return !n.isLiteral(e, { value: "" }) + })), + t(s[0]) || t(s[1]) || s.unshift(n.stringLiteral("")), + s.length > 1) + ) { + for ( + var p = r(s.shift(), s.shift()), f = 0; + f < s.length; + f++ + ) { + var h = s[f] + p = r(p, h) + } + e.replaceWith(p) + } else e.replaceWith(s[0]) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(5935)["default"] + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types, + r = n() + return { + visitor: { + Scope: function(e) { + var t = e.scope + t.getBinding("Symbol") && t.rename("Symbol") + }, + UnaryExpression: function(e) { + var n = e.node, + i = e.parent + if ( + !n[r] && + !e.find(function(e) { + return e.node && !!e.node._generated + }) + ) { + if ( + e.parentPath.isBinaryExpression() && + t.EQUALITY_BINARY_OPERATORS.indexOf(i.operator) >= 0 + ) { + var s = e.getOpposite() + if ( + s.isLiteral() && + "symbol" !== s.node.value && + "object" !== s.node.value + ) + return + } + if ("typeof" === n.operator) { + var a = t.callExpression(this.addHelper("typeof"), [ + n.argument + ]) + if (e.get("argument").isIdentifier()) { + var o = t.stringLiteral("undefined"), + u = t.unaryExpression("typeof", n.argument) + ;(u[r] = !0), + e.replaceWith( + t.conditionalExpression( + t.binaryExpression("===", u, o), + o, + a + ) + ) + } else e.replaceWith(a) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + 466, + function(e, t, r) { + "use strict" + var n = r(71)["default"], + i = r(36)["default"] + t.__esModule = !0 + var s = r(6109), + a = n(s), + o = r(5954), + u = i(o) + ;(t["default"] = function() { + return { + visitor: { + RegExpLiteral: function(e) { + var t = e.node + u.is(t, "u") && + ((t.pattern = a["default"](t.pattern, t.flags)), + u.pullFlag(t, "u")) + } + } + } + }), + (e.exports = t["default"]) + }, + [7455, 2202], + [7468, 6055], + [7471, 1218, 1219, 138], + [7363, 738, 272, 6085], + 466, + 468, + [7468, 6258], + 563, + [7471, 1238, 741, 139], + [7479, 1238, 275], + [7488, 6224, 2236, 6240], + 581, + [7363, 747, 277, 6285], + 466, + 468, + [7455, 2287], + [7468, 6407], + [7471, 1257, 1258, 140], + [7363, 753, 282, 6438], + 466, + 468, + [7455, 2329], + [7468, 6577], + [7471, 1276, 1277, 141], + [7363, 759, 287, 6607], + 466, + 468, + [7455, 2367], + [7468, 6729], + [7471, 1295, 1296, 142], + [7363, 765, 292, 6759], + 466, + 468, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return r(6783) + }), + (e.exports = t["default"]) + }, + [7339, 6799], + [7363, 770, 294, 6805], + 466, + 468, + 148, + [7480, 2404, 548, 772], + [7491, 2404, 1320, 454, 6886], + [7468, 6954], + [7491, 775, 1325, 143, 6950], + [7363, 778, 300, 6991], + 466, + 468, + [7455, 2461], + [7468, 7110], + [7471, 1344, 1345, 144], + [7363, 784, 304, 7147], + 466, + 468, + [7455, 2498], + [7468, 7266], + [7471, 1363, 1364, 145], + function(e, t, r) { + function n(e, t) { + return h.isUndefined(t) + ? "" + t + : h.isNumber(t) && !isFinite(t) + ? t.toString() + : h.isFunction(t) || h.isRegExp(t) + ? t.toString() + : t + } + function i(e, t) { + return h.isString(e) ? (e.length < t ? e : e.slice(0, t)) : e + } + function s(e) { + return ( + i(JSON.stringify(e.actual, n), 128) + + " " + + e.operator + + " " + + i(JSON.stringify(e.expected, n), 128) + ) + } + function a(e, t, r, n, i) { + throw new y.AssertionError({ + message: r, + actual: e, + expected: t, + operator: n, + stackStartFunction: i + }) + } + function o(e, t) { + e || a(e, !0, t, "==", y.ok) + } + function u(e, t) { + if (e === t) return !0 + if (h.isBuffer(e) && h.isBuffer(t)) { + if (e.length != t.length) return !1 + for (var r = 0; r < e.length; r++) if (e[r] !== t[r]) return !1 + return !0 + } + return h.isDate(e) && h.isDate(t) + ? e.getTime() === t.getTime() + : h.isRegExp(e) && h.isRegExp(t) + ? e.source === t.source && + e.global === t.global && + e.multiline === t.multiline && + e.lastIndex === t.lastIndex && + e.ignoreCase === t.ignoreCase + : h.isObject(e) || h.isObject(t) + ? c(e, t) + : e == t + } + function l(e) { + return "[object Arguments]" == Object.prototype.toString.call(e) + } + function c(e, t) { + if (h.isNullOrUndefined(e) || h.isNullOrUndefined(t)) return !1 + if (e.prototype !== t.prototype) return !1 + if (h.isPrimitive(e) || h.isPrimitive(t)) return e === t + var r = l(e), + n = l(t) + if ((r && !n) || (!r && n)) return !1 + if (r) return (e = d.call(e)), (t = d.call(t)), u(e, t) + var i, + s, + a = v(e), + o = v(t) + if (a.length != o.length) return !1 + for (a.sort(), o.sort(), s = a.length - 1; s >= 0; s--) + if (a[s] != o[s]) return !1 + for (s = a.length - 1; s >= 0; s--) if (((i = a[s]), !u(e[i], t[i]))) return !1 + return !0 + } + function p(e, t) { + return e && t + ? "[object RegExp]" == Object.prototype.toString.call(t) + ? t.test(e) + : e instanceof t + ? !0 + : t.call({}, e) === !0 + : !1 + } + function f(e, t, r, n) { + var i + h.isString(r) && ((n = r), (r = null)) + try { + t() + } catch (s) { + i = s + } + if ( + ((n = (r && r.name ? " (" + r.name + ")." : ".") + (n ? " " + n : ".")), + e && !i && a(i, r, "Missing expected exception" + n), + !e && p(i, r) && a(i, r, "Got unwanted exception" + n), + (e && i && r && !p(i, r)) || (!e && i)) + ) + throw i + } + var h = r(22), + d = Array.prototype.slice, + m = Object.prototype.hasOwnProperty, + y = (e.exports = o) + ;(y.AssertionError = function(e) { + ;(this.name = "AssertionError"), + (this.actual = e.actual), + (this.expected = e.expected), + (this.operator = e.operator), + e.message + ? ((this.message = e.message), (this.generatedMessage = !1)) + : ((this.message = s(this)), (this.generatedMessage = !0)) + var t = e.stackStartFunction || a + if (Error.captureStackTrace) Error.captureStackTrace(this, t) + else { + var r = new Error() + if (r.stack) { + var n = r.stack, + i = t.name, + o = n.indexOf("\n" + i) + if (o >= 0) { + var u = n.indexOf("\n", o + 1) + n = n.substring(u + 1) + } + this.stack = n + } + } + }), + h.inherits(y.AssertionError, Error), + (y.fail = a), + (y.ok = o), + (y.equal = function(e, t, r) { + e != t && a(e, t, r, "==", y.equal) + }), + (y.notEqual = function(e, t, r) { + e == t && a(e, t, r, "!=", y.notEqual) + }), + (y.deepEqual = function(e, t, r) { + u(e, t) || a(e, t, r, "deepEqual", y.deepEqual) + }), + (y.notDeepEqual = function(e, t, r) { + u(e, t) && a(e, t, r, "notDeepEqual", y.notDeepEqual) + }), + (y.strictEqual = function(e, t, r) { + e !== t && a(e, t, r, "===", y.strictEqual) + }), + (y.notStrictEqual = function(e, t, r) { + e === t && a(e, t, r, "!==", y.notStrictEqual) + }), + (y["throws"] = function(e, t, r) { + f.apply(this, [!0].concat(d.call(arguments))) + }), + (y.doesNotThrow = function(e, t) { + f.apply(this, [!1].concat(d.call(arguments))) + }), + (y.ifError = function(e) { + if (e) throw e + }) + var v = + Object.keys || + function(e) { + var t = [] + for (var r in e) m.call(e, r) && t.push(r) + return t + } + }, + function(e, t, r) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(2558)["default"] + t.__esModule = !0 + var a = (function(e) { + function t() { + i(this, t), e.call(this), (this.dynamicData = {}) + } + return ( + n(t, e), + (t.prototype.setDynamic = function(e, t) { + this.dynamicData[e] = t + }), + (t.prototype.get = function(t) { + if (this.has(t)) return e.prototype.get.call(this, t) + if (Object.prototype.hasOwnProperty.call(this.dynamicData, t)) { + var r = this.dynamicData[t]() + return this.set(t, r), r + } + }), + t + ) + })(s) + ;(t["default"] = a), (e.exports = t["default"]) + }, + function(e, t, r) { + ;(function(e) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(796)["default"], + a = r(555)["default"], + o = r(5)["default"], + u = r(3)["default"] + t.__esModule = !0 + var l = r(1374), + c = o(l), + p = r(2509), + f = u(p), + h = r(2645), + d = o(h), + m = r(461), + y = o(m), + v = r(2513), + g = o(v), + E = r(2708), + b = o(E), + x = r(147), + A = r(1425), + D = o(A), + C = r(1372), + S = o(C), + F = r(1368), + w = o(F), + _ = r(1419), + T = o(_), + P = o(x), + B = r(2508), + k = o(B), + I = r(790), + O = o(I), + M = r(810), + R = r(795), + L = u(R), + N = r(175), + j = o(N), + U = r(16), + V = u(U), + G = r(2510), + W = o(G), + q = r(2511), + H = o(q), + Y = [[W["default"]], [H["default"]]], + J = { + enter: function(e, t) { + var r = e.node.loc + r && ((t.loc = r), e.stop()) + } + }, + K = (function(t) { + function r(e, n) { + var o = this + void 0 === e && (e = {}), + i(this, r), + t.call(this), + (this.pipeline = n), + (this.log = new k["default"](this, e.filename || "unknown")), + (this.opts = this.initOptions(e)), + (this.parserOpts = { + highlightCode: this.opts.highlightCode, + nonStandard: this.opts.nonStandard, + sourceType: this.opts.sourceType, + filename: this.opts.filename, + plugins: [] + }), + (this.pluginVisitors = []), + (this.pluginPasses = []), + this.buildPluginsForOptions(this.opts), + this.opts.passPerPreset && + ((this.perPresetOpts = []), + this.opts.presets.forEach(function(e) { + var t = s(a(o.opts), e) + o.perPresetOpts.push(t), o.buildPluginsForOptions(t) + })), + (this.metadata = { + usedHelpers: [], + marked: [], + modules: { + imports: [], + exports: { exported: [], specifiers: [] } + } + }), + (this.dynamicImportTypes = {}), + (this.dynamicImportIds = {}), + (this.dynamicImports = []), + (this.declarations = {}), + (this.usedHelpers = {}), + (this.path = null), + (this.ast = {}), + (this.code = ""), + (this.shebang = ""), + (this.hub = new x.Hub(this)) + } + return ( + n(r, t), + (r.prototype.getMetadata = function() { + for ( + var e = !1, t = this.ast.program.body, r = 0; + r < t.length; + r++ + ) { + var n = t[r] + if (V.isModuleDeclaration(n)) { + e = !0 + break + } + } + e && this.path.traverse(f, this) + }), + (r.prototype.initOptions = function(e) { + ;(e = new y["default"](this.log, this.pipeline).init(e)), + e.inputSourceMap && (e.sourceMaps = !0), + e.moduleId && (e.moduleIds = !0), + (e.basename = j["default"].basename( + e.filename, + j["default"].extname(e.filename) + )), + (e.ignore = L.arrayify(e.ignore, L.regexify)), + e.only && (e.only = L.arrayify(e.only, L.regexify)), + T["default"](e, { moduleRoot: e.sourceRoot }), + T["default"](e, { sourceRoot: e.moduleRoot }), + T["default"](e, { filenameRelative: e.filename }) + var t = j["default"].basename(e.filenameRelative) + return ( + T["default"](e, { sourceFileName: t, sourceMapTarget: t }), + e + ) + }), + (r.prototype.buildPluginsForOptions = function(e) { + if (Array.isArray(e.plugins)) { + for ( + var t = e.plugins.concat(Y), r = [], n = [], i = 0; + i < t.length; + i++ + ) { + var s = t[i], + a = s[0], + o = s[1] + r.push(a.visitor), + n.push(new g["default"](this, a, o)), + a.manipulateOptions && + a.manipulateOptions(e, this.parserOpts, this) + } + this.pluginVisitors.push(r), this.pluginPasses.push(n) + } + }), + (r.prototype.getModuleName = function() { + var e = this.opts + if (!e.moduleIds) return null + if (null != e.moduleId && !e.getModuleId) return e.moduleId + var t = e.filenameRelative, + r = "" + if ( + (null != e.moduleRoot && (r = e.moduleRoot + "/"), + !e.filenameRelative) + ) + return r + e.filename.replace(/^\//, "") + if (null != e.sourceRoot) { + var n = new RegExp("^" + e.sourceRoot + "/?") + t = t.replace(n, "") + } + return ( + (t = t.replace(/\.(\w*?)$/, "")), + (r += t), + (r = r.replace(/\\/g, "/")), + e.getModuleId ? e.getModuleId(r) || r : r + ) + }), + (r.prototype.resolveModuleSource = function o(e) { + var o = this.opts.resolveModuleSource + return o && (e = o(e, this.opts.filename)), e + }), + (r.prototype.addImport = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? t + : arguments[2] + return function() { + var n = e + ":" + t, + i = this.dynamicImportIds[n] + if (!i) { + ;(e = this.resolveModuleSource(e)), + (i = this.dynamicImportIds[ + n + ] = this.scope.generateUidIdentifier(r)) + var s = [] + "*" === t + ? s.push(V.importNamespaceSpecifier(i)) + : "default" === t + ? s.push(V.importDefaultSpecifier(i)) + : s.push(V.importSpecifier(i, V.identifier(t))) + var a = V.importDeclaration(s, V.stringLiteral(e)) + ;(a._blockHoist = 3), + this.path.unshiftContainer("body", a) + } + return i + }.apply(this, arguments) + }), + (r.prototype.addHelper = function(e) { + var t = this.declarations[e] + if (t) return t + this.usedHelpers[e] || + (this.metadata.usedHelpers.push(e), + (this.usedHelpers[e] = !0)) + var r = this.get("helperGenerator"), + n = this.get("helpersNamespace") + if (r) { + var i = r(e) + if (i) return i + } else if (n) return V.memberExpression(n, V.identifier(e)) + var s = c["default"](e), + a = (this.declarations[ + e + ] = this.scope.generateUidIdentifier(e)) + return ( + V.isFunctionExpression(s) && !s.id + ? ((s.body._compact = !0), + (s._generated = !0), + (s.id = a), + (s.type = "FunctionDeclaration"), + this.path.unshiftContainer("body", s)) + : ((s._compact = !0), + this.scope.push({ id: a, init: s, unique: !0 })), + a + ) + }), + (r.prototype.addTemplateObject = function(e, t, r) { + var n = r.elements.map(function(e) { + return e.value + }), + i = e + "_" + r.elements.length + "_" + n.join(","), + s = this.declarations[i] + if (s) return s + var a = (this.declarations[ + i + ] = this.scope.generateUidIdentifier("templateObject")), + o = this.addHelper(e), + u = V.callExpression(o, [t, r]) + return ( + (u._compact = !0), + this.scope.push({ id: a, init: u, _blockHoist: 1.9 }), + a + ) + }), + (r.prototype.buildCodeFrameError = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? SyntaxError + : arguments[2], + n = e && (e.loc || e._loc), + i = new r(t) + return ( + n + ? (i.loc = n.start) + : (P["default"](e, J, this.scope, i), + (i.message += + " (This is an error on an internal node. Probably an internal error"), + i.loc && + (i.message += ". Location has been estimated."), + (i.message += ")")), + i + ) + }), + (r.prototype.mergeSourceMap = function(e) { + var t = this.opts.inputSourceMap + if (!t) return e + var r = (function() { + var r = new D["default"].SourceMapConsumer(t), + n = new D["default"].SourceMapConsumer(e), + i = new D["default"].SourceMapGenerator({ + file: r.file, + sourceRoot: r.sourceRoot + }), + s = n.sources[0] + r.eachMapping(function(e) { + var t = n.generatedPositionFor({ + line: e.generatedLine, + column: e.generatedColumn, + source: s + }) + null != t.column && + i.addMapping({ + source: e.source, + original: { + line: e.originalLine, + column: e.originalColumn + }, + generated: t + }) + }) + var a = i.toJSON() + return (t.mappings = a.mappings), { v: t } + })() + return "object" == typeof r ? r.v : void 0 + }), + (r.prototype.parse = function(e) { + this.log.debug("Parse start") + var t = M.parse(e, this.parserOpts) + return this.log.debug("Parse stop"), t + }), + (r.prototype._addAst = function(e) { + ;(this.path = x.NodePath.get({ + hub: this.hub, + parentPath: null, + parent: e, + container: e, + key: "program" + }).setContext()), + (this.scope = this.path.scope), + (this.ast = e), + this.getMetadata() + }), + (r.prototype.addAst = function(e) { + this.log.debug("Start set AST"), + this._addAst(e), + this.log.debug("End set AST") + }), + (r.prototype.transform = function() { + var e = this + return ( + this.pluginPasses.forEach(function(t, r) { + e.call("pre", t), + e.log.debug("Start transform traverse"), + P["default"]( + e.ast, + P["default"].visitors.merge( + e.pluginVisitors[r], + t + ), + e.scope + ), + e.log.debug("End transform traverse"), + e.call("post", t) + }), + this.generate() + ) + }), + (r.prototype.wrap = function(t, r) { + t += "" + try { + return this.shouldIgnore() + ? this.makeResult({ code: t, ignored: !0 }) + : r() + } catch (n) { + if (n._babel) throw n + n._babel = !0 + var i = (n.message = this.opts.filename + ": " + n.message), + s = n.loc + if ( + (s && + ((n.codeFrame = w["default"]( + t, + s.line, + s.column + 1, + this.opts + )), + (i += "\n" + n.codeFrame)), + e.browser && (n.message = i), + n.stack) + ) { + var a = n.stack.replace(n.message, i) + n.stack = a + } + throw n + } + }), + (r.prototype.addCode = function(e) { + ;(e = (e || "") + ""), + (e = this.parseInputSourceMap(e)), + (this.code = e) + }), + (r.prototype.parseCode = function() { + this.parseShebang() + var e = this.parse(this.code) + this.addAst(e) + }), + (r.prototype.shouldIgnore = function() { + var e = this.opts + return L.shouldIgnore(e.filename, e.ignore, e.only) + }), + (r.prototype.call = function(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r], + i = n.plugin, + s = i[e] + s && s.call(n, this) + } + }), + (r.prototype.parseInputSourceMap = function(e) { + var t = this.opts + if (t.inputSourceMap !== !1) { + var r = d["default"].fromSource(e) + r && + ((t.inputSourceMap = r.toObject()), + (e = d["default"].removeComments(e))) + } + return e + }), + (r.prototype.parseShebang = function() { + var e = b["default"].exec(this.code) + e && + ((this.shebang = e[0]), + (this.code = this.code.replace(b["default"], ""))) + }), + (r.prototype.makeResult = function(e) { + var t = e.code, + r = e.map, + n = e.ast, + i = e.ignored, + s = { + metadata: null, + options: this.opts, + ignored: !!i, + code: null, + ast: null, + map: r || null + } + return ( + this.opts.code && (s.code = t), + this.opts.ast && (s.ast = n), + this.opts.metadata && (s.metadata = this.metadata), + s + ) + }), + (r.prototype.generate = function() { + var e = this.opts, + t = this.ast, + r = { ast: t } + if (!e.code) return this.makeResult(r) + this.log.debug("Generation start") + var n = S["default"](t, e, this.code) + return ( + (r.code = n.code), + (r.map = n.map), + this.log.debug("Generation end"), + this.shebang && (r.code = this.shebang + "\n" + r.code), + r.map && (r.map = this.mergeSourceMap(r.map)), + ("inline" !== e.sourceMaps && "both" !== e.sourceMaps) || + (r.code += + "\n" + d["default"].fromObject(r.map).toComment()), + "inline" === e.sourceMaps && (r.map = null), + this.makeResult(r) + ) + }), + r + ) + })(O["default"]) + ;(t["default"] = K), (t.File = K) + }.call(t, r(1))) + }, + function(e, t, r) { + "use strict" + function n() { + var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0] + for (var t in e) { + var r = e[t] + if (null != r) { + var n = l["default"][t] + if ((n && n.alias && (n = l["default"][n.alias]), n)) { + var i = o[n.type] + i && (r = i(r)), (e[t] = r) + } + } + } + return e + } + var i = r(3)["default"], + s = r(5)["default"] + ;(t.__esModule = !0), (t.normaliseOptions = n) + var a = r(793), + o = i(a), + u = r(460), + l = s(u) + t.config = l["default"] + }, + function(e, t, r) { + "use strict" + function n(e) { + return !!e + } + function i(e) { + return p.booleanify(e) + } + function s(e) { + return p.list(e) + } + var a = r(5)["default"], + o = r(3)["default"] + ;(t.__esModule = !0), (t["boolean"] = n), (t.booleanString = i), (t.list = s) + var u = r(1421), + l = a(u), + c = r(795), + p = o(c), + f = l["default"] + t.filename = f + }, + function(e, t) { + "use strict" + e.exports = { + auxiliaryComment: { + message: "Use `auxiliaryCommentBefore` or `auxiliaryCommentAfter`" + }, + blacklist: { + message: "Put the specific transforms you want in the `plugins` option" + }, + breakConfig: { message: "This is not a necessary option in Babel 6" }, + experimental: { + message: "Put the specific transforms you want in the `plugins` option" + }, + externalHelpers: { + message: + "Use the `external-helpers` plugin instead. Check out http://babeljs.io/docs/plugins/external-helpers/" + }, + extra: { message: "" }, + jsxPragma: { + message: + "use the `pragma` option in the `react-jsx` plugin . Check out http://babeljs.io/docs/plugins/transform-react-jsx/" + }, + loose: { + message: + "Specify the `loose` option for the relevant plugin you are using or use a preset that sets the option." + }, + metadataUsedHelpers: { + message: "Not required anymore as this is enabled by default" + }, + modules: { + message: + "Use the corresponding module transform plugin in the `plugins` option. Check out http://babeljs.io/docs/plugins/#modules" + }, + nonStandard: { + message: + "Use the `react-jsx` and `flow-strip-types` plugins to support JSX and Flow. Also check out the react preset http://babeljs.io/docs/plugins/preset-react/" + }, + optional: { + message: "Put the specific transforms you want in the `plugins` option" + }, + sourceMapName: { message: "Use the `sourceMapTarget` option" }, + stage: { + message: + "Check out the corresponding stage-x presets http://babeljs.io/docs/plugins/#presets" + }, + whitelist: { + message: "Put the specific transforms you want in the `plugins` option" + } + } + }, + function(e, t, r) { + "use strict" + function n(e, t) { + var r = t || n.EXTENSIONS, + i = F["default"].extname(e) + return b["default"](r, i) + } + function i(e) { + return e + ? Array.isArray(e) + ? e + : "string" == typeof e + ? e.split(",") + : [e] + : [] + } + function s(e) { + if (!e) return new RegExp(/.^/) + if ( + (Array.isArray(e) && (e = new RegExp(e.map(f["default"]).join("|"), "i")), + "string" == typeof e) + ) { + ;(e = _["default"](e)), + (d["default"](e, "./") || d["default"](e, "*/")) && (e = e.slice(2)), + d["default"](e, "**/") && (e = e.slice(3)) + var t = g["default"].makeRe(e, { nocase: !0 }) + return new RegExp(t.source.slice(1, -1), "i") + } + if (C["default"](e)) return e + throw new TypeError("illegal type for regexify") + } + function a(e, t) { + return e + ? y["default"](e) + ? a([e], t) + : A["default"](e) + ? a(i(e), t) + : Array.isArray(e) + ? (t && (e = e.map(t)), e) + : [e] + : [] + } + function o(e) { + return "true" === e || 1 == e ? !0 : "false" !== e && 0 != e && e ? e : !1 + } + function u(e, t, r) { + if ((void 0 === t && (t = []), (e = _["default"](e)), r)) { + for (var n = 0; n < r.length; n++) { + var i = r[n] + if (l(i, e)) return !1 + } + return !0 + } + if (t.length) + for (var s = 0; s < t.length; s++) { + var i = t[s] + if (l(i, e)) return !0 + } + return !1 + } + function l(e, t) { + return "function" == typeof e ? e(t) : e.test(t) + } + var c = r(5)["default"] + ;(t.__esModule = !0), + (t.canCompile = n), + (t.list = i), + (t.regexify = s), + (t.arrayify = a), + (t.booleanify = o), + (t.shouldIgnore = u) + var p = r(2699), + f = c(p), + h = r(2700), + d = c(h), + m = r(1414), + y = c(m), + v = r(2702), + g = c(v), + E = r(2652), + b = c(E), + x = r(819), + A = c(x), + D = r(1418), + C = c(D), + S = r(175), + F = c(S), + w = r(1421), + _ = c(w), + T = r(22) + ;(t.inherits = T.inherits), + (t.inspect = T.inspect), + (n.EXTENSIONS = [".js", ".jsx", ".es6", ".es"]) + }, + [7333, 2571], + [7341, 2580], + 581, + function(e, t) { + var r = {}.toString + e.exports = function(e) { + return r.call(e).slice(8, -1) + } + }, + function(e, t, r) { + var n = r(556), + i = r(2589), + s = r(2587), + a = r(463), + o = r(2596), + u = r(1386) + e.exports = function(e, t, r, l) { + var c, + p, + f, + h = u(e), + d = n(r, l, t ? 2 : 1), + m = 0 + if ("function" != typeof h) throw TypeError(e + " is not iterable!") + if (s(h)) + for (c = o(e.length); c > m; m++) t ? d(a((p = e[m]))[0], p[1]) : d(e[m]) + else for (f = h.call(e); !(p = f.next()).done; ) i(f, d, p.value, t) + } + }, + [7369, 1380, 177, 804, 467, 558, 468, 2590, 560, 81, 178], + [7372, 177, 98, 465], + function(e, t) { + e.exports = function(e, t) { + return { + enumerable: !(1 & e), + configurable: !(2 & e), + writable: !(4 & e), + value: t + } + } + }, + [7373, 467], + function(e, t) { + var r = 0, + n = Math.random() + e.exports = function(e) { + return "Symbol(".concat(void 0 === e ? "" : e, ")_", (++r + n).toString(36)) + } + }, + [ + 7391, + 81, + 466, + 558, + 464, + 177, + 804, + 465, + 1382, + 560, + 805, + 178, + 2591, + 1377, + 2586, + 2588, + 463, + 469, + 803, + 1380 + ], + [7393, 797, 5, 3, 1413, 565, 2695, 147, 810, 16], + [ + 7412, + 2565, + 80, + 797, + 146, + 555, + 462, + 5, + 3, + 561, + 2627, + 2623, + 147, + 1419, + 176, + 1393, + 2625, + 16 + ], + [7416, 2564], + function(e, t, r) { + var n, n + !(function(t) { + e.exports = t() + })(function() { + return (function e(t, r, i) { + function s(o, u) { + if (!r[o]) { + if (!t[o]) { + var l = "function" == typeof n && n + if (!u && l) return n(o, !0) + if (a) return a(o, !0) + var c = new Error("Cannot find module '" + o + "'") + throw ((c.code = "MODULE_NOT_FOUND"), c) + } + var p = (r[o] = { exports: {} }) + t[o][0].call( + p.exports, + function(e) { + var r = t[o][1][e] + return s(r ? r : e) + }, + p, + p.exports, + e, + t, + r, + i + ) + } + return r[o].exports + } + for (var a = "function" == typeof n && n, o = 0; o < i.length; o++) s(i[o]) + return s + })( + { + 1: [ + function(e, t, r) { + "use strict" + function n(e, t) { + return new a["default"](t, e).parse() + } + var i = e(25)["default"] + ;(r.__esModule = !0), (r.parse = n) + var s = e(5), + a = i(s) + e(10), e(9), e(7), e(4), e(8), e(6), e(3) + var o = e(17) + e(15), e(14) + var u = e(11), + l = i(u), + c = e(12), + p = i(c) + ;(s.plugins.flow = l["default"]), + (s.plugins.jsx = p["default"]), + (r.tokTypes = o.types) + }, + { + 10: 10, + 11: 11, + 12: 12, + 14: 14, + 15: 15, + 17: 17, + 25: 25, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + } + ], + 2: [ + function(e, t, r) { + "use strict" + function n(e) { + var t = {} + for (var r in i) t[r] = e && r in e ? e[r] : i[r] + return t + } + ;(r.__esModule = !0), (r.getOptions = n) + var i = { + sourceType: "script", + allowReturnOutsideFunction: !1, + allowImportExportEverywhere: !1, + allowSuperOutsideMethod: !1, + plugins: [], + strictMode: null + } + r.defaultOptions = i + }, + {} + ], + 3: [ + function(e, t, r) { + "use strict" + function n(e) { + return e[e.length - 1] + } + var i = e(25)["default"], + s = e(5), + a = i(s), + o = a["default"].prototype + ;(o.addComment = function(e) { + this.state.trailingComments.push(e), + this.state.leadingComments.push(e) + }), + (o.processComment = function(e) { + if (!("Program" === e.type && e.body.length > 0)) { + var t = this.state.commentStack, + r = void 0, + i = void 0, + s = void 0 + if (this.state.trailingComments.length > 0) + this.state.trailingComments[0].start >= e.end + ? ((i = this.state.trailingComments), + (this.state.trailingComments = [])) + : (this.state.trailingComments.length = 0) + else { + var a = n(t) + t.length > 0 && + a.trailingComments && + a.trailingComments[0].start >= e.end && + ((i = a.trailingComments), + (a.trailingComments = null)) + } + for (; t.length > 0 && n(t).start >= e.start; ) + r = t.pop() + if (r) { + if (r.leadingComments) + if ( + r !== e && + n(r.leadingComments).end <= e.start + ) + (e.leadingComments = r.leadingComments), + (r.leadingComments = null) + else + for ( + s = r.leadingComments.length - 2; + s >= 0; + --s + ) + if ( + r.leadingComments[s].end <= + e.start + ) { + e.leadingComments = r.leadingComments.splice( + 0, + s + 1 + ) + break + } + } else if (this.state.leadingComments.length > 0) + if ( + n(this.state.leadingComments).end <= e.start + ) + (e.leadingComments = this.state.leadingComments), + (this.state.leadingComments = []) + else { + for ( + s = 0; + s < this.state.leadingComments.length && + !( + this.state.leadingComments[s].end > + e.start + ); + s++ + ); + ;(e.leadingComments = this.state.leadingComments.slice( + 0, + s + )), + 0 === e.leadingComments.length && + (e.leadingComments = null), + (i = this.state.leadingComments.slice( + s + )), + 0 === i.length && (i = null) + } + i && + (i.length && + i[0].start >= e.start && + n(i).end <= e.end + ? (e.innerComments = i) + : (e.trailingComments = i)), + t.push(e) + } + }) + }, + { 25: 25, 5: 5 } + ], + 4: [ + function(e, t, r) { + "use strict" + var n = e(21)["default"], + i = e(25)["default"], + s = e(17), + a = e(5), + o = i(a), + u = e(18), + l = o["default"].prototype + ;(l.checkPropClash = function(e, t) { + if (!e.computed) { + var r = e.key, + n = void 0 + switch (r.type) { + case "Identifier": + n = r.name + break + case "StringLiteral": + case "NumericLiteral": + n = String(r.value) + break + default: + return + } + "__proto__" === n && + "init" === e.kind && + (t.proto && + this.raise( + r.start, + "Redefinition of __proto__ property" + ), + (t.proto = !0)) + } + }), + (l.parseExpression = function(e, t) { + var r = this.state.start, + n = this.state.startLoc, + i = this.parseMaybeAssign(e, t) + if (this.match(s.types.comma)) { + var a = this.startNodeAt(r, n) + for (a.expressions = [i]; this.eat(s.types.comma); ) + a.expressions.push(this.parseMaybeAssign(e, t)) + return ( + this.toReferencedList(a.expressions), + this.finishNode(a, "SequenceExpression") + ) + } + return i + }), + (l.parseMaybeAssign = function(e, t, r) { + if ( + this.match(s.types._yield) && + this.state.inGenerator + ) + return this.parseYield() + var n = void 0 + t ? (n = !1) : ((t = { start: 0 }), (n = !0)) + var i = this.state.start, + a = this.state.startLoc + ;(this.match(s.types.parenL) || + this.match(s.types.name)) && + (this.state.potentialArrowAt = this.state.start) + var o = this.parseMaybeConditional(e, t) + if ( + (r && (o = r.call(this, o, i, a)), + this.state.type.isAssign) + ) { + var u = this.startNodeAt(i, a) + if ( + ((u.operator = this.state.value), + (u.left = this.match(s.types.eq) + ? this.toAssignable(o) + : o), + (t.start = 0), + this.checkLVal(o), + o.extra && o.extra.parenthesized) + ) { + var l = void 0 + "ObjectPattern" === o.type + ? (l = "`({a}) = 0` use `({a} = 0)`") + : "ArrayPattern" === o.type && + (l = "`([a]) = 0` use `([a] = 0)`"), + l && + this.raise( + o.start, + "You're trying to assign to a parenthesized expression, eg. instead of " + + l + ) + } + return ( + this.next(), + (u.right = this.parseMaybeAssign(e)), + this.finishNode(u, "AssignmentExpression") + ) + } + return n && t.start && this.unexpected(t.start), o + }), + (l.parseMaybeConditional = function(e, t) { + var r = this.state.start, + n = this.state.startLoc, + i = this.parseExprOps(e, t) + if (t && t.start) return i + if (this.eat(s.types.question)) { + var a = this.startNodeAt(r, n) + return ( + (a.test = i), + (a.consequent = this.parseMaybeAssign()), + this.expect(s.types.colon), + (a.alternate = this.parseMaybeAssign(e)), + this.finishNode(a, "ConditionalExpression") + ) + } + return i + }), + (l.parseExprOps = function(e, t) { + var r = this.state.start, + n = this.state.startLoc, + i = this.parseMaybeUnary(t) + return t && t.start + ? i + : this.parseExprOp(i, r, n, -1, e) + }), + (l.parseExprOp = function(e, t, r, n, i) { + var a = this.state.type.binop + if ( + !(null == a || (i && this.match(s.types._in))) && + a > n + ) { + var o = this.startNodeAt(t, r) + ;(o.left = e), + (o.operator = this.state.value), + "**" === o.operator && + "UnaryExpression" === e.type && + e.extra && + !e.extra.parenthesizedArgument && + this.raise( + e.argument.start, + "Illegal expression. Wrap left hand side or entire exponentiation in parentheses." + ) + var u = this.state.type + this.next() + var l = this.state.start, + c = this.state.startLoc + return ( + (o.right = this.parseExprOp( + this.parseMaybeUnary(), + l, + c, + u.rightAssociative ? a - 1 : a, + i + )), + this.finishNode( + o, + u === s.types.logicalOR || + u === s.types.logicalAND + ? "LogicalExpression" + : "BinaryExpression" + ), + this.parseExprOp(o, t, r, n, i) + ) + } + return e + }), + (l.parseMaybeUnary = function(e) { + if (this.state.type.prefix) { + var t = this.startNode(), + r = this.match(s.types.incDec) + ;(t.operator = this.state.value), + (t.prefix = !0), + this.next() + var n = this.state.type + return ( + this.addExtra( + t, + "parenthesizedArgument", + n === s.types.parenL + ), + (t.argument = this.parseMaybeUnary()), + e && e.start && this.unexpected(e.start), + r + ? this.checkLVal(t.argument) + : this.state.strict && + "delete" === t.operator && + "Identifier" === t.argument.type && + this.raise( + t.start, + "Deleting local variable in strict mode" + ), + this.finishNode( + t, + r ? "UpdateExpression" : "UnaryExpression" + ) + ) + } + var i = this.state.start, + a = this.state.startLoc, + o = this.parseExprSubscripts(e) + if (e && e.start) return o + for ( + ; + this.state.type.postfix && + !this.canInsertSemicolon(); + + ) { + var t = this.startNodeAt(i, a) + ;(t.operator = this.state.value), + (t.prefix = !1), + (t.argument = o), + this.checkLVal(o), + this.next(), + (o = this.finishNode(t, "UpdateExpression")) + } + return o + }), + (l.parseExprSubscripts = function(e) { + var t = this.state.start, + r = this.state.startLoc, + n = this.state.potentialArrowAt, + i = this.parseExprAtom(e) + return "ArrowFunctionExpression" === i.type && + i.start === n + ? i + : e && e.start + ? i + : this.parseSubscripts(i, t, r) + }), + (l.parseSubscripts = function(e, t, r, n) { + for (;;) { + if (!n && this.eat(s.types.doubleColon)) { + var i = this.startNodeAt(t, r) + return ( + (i.object = e), + (i.callee = this.parseNoCallExpr()), + this.parseSubscripts( + this.finishNode(i, "BindExpression"), + t, + r, + n + ) + ) + } + if (this.eat(s.types.dot)) { + var i = this.startNodeAt(t, r) + ;(i.object = e), + (i.property = this.parseIdentifier(!0)), + (i.computed = !1), + (e = this.finishNode(i, "MemberExpression")) + } else if (this.eat(s.types.bracketL)) { + var i = this.startNodeAt(t, r) + ;(i.object = e), + (i.property = this.parseExpression()), + (i.computed = !0), + this.expect(s.types.bracketR), + (e = this.finishNode(i, "MemberExpression")) + } else if (!n && this.match(s.types.parenL)) { + var a = + this.state.potentialArrowAt === e.start && + "Identifier" === e.type && + "async" === e.name && + !this.canInsertSemicolon() + this.next() + var i = this.startNodeAt(t, r) + if ( + ((i.callee = e), + (i.arguments = this.parseCallExpressionArguments( + s.types.parenR, + this.hasPlugin( + "trailingFunctionCommas" + ), + a + )), + (e = this.finishNode(i, "CallExpression")), + a && this.shouldParseAsyncArrow()) + ) + return this.parseAsyncArrowFromCallExpression( + this.startNodeAt(t, r), + i + ) + this.toReferencedList(i.arguments) + } else { + if (!this.match(s.types.backQuote)) return e + var i = this.startNodeAt(t, r) + ;(i.tag = e), + (i.quasi = this.parseTemplate()), + (e = this.finishNode( + i, + "TaggedTemplateExpression" + )) + } + } + }), + (l.parseCallExpressionArguments = function(e, t, r) { + for (var n = void 0, i = [], a = !0; !this.eat(e); ) { + if (a) a = !1 + else if ( + (this.expect(s.types.comma), t && this.eat(e)) + ) + break + this.match(s.types.parenL) && + !n && + (n = this.state.start), + i.push(this.parseExprListItem()) + } + return ( + r && + n && + this.shouldParseAsyncArrow() && + this.unexpected(), + i + ) + }), + (l.shouldParseAsyncArrow = function() { + return this.match(s.types.arrow) + }), + (l.parseAsyncArrowFromCallExpression = function(e, t) { + return ( + this.hasPlugin("asyncFunctions") || + this.unexpected(), + this.expect(s.types.arrow), + this.parseArrowExpression(e, t.arguments, !0) + ) + }), + (l.parseNoCallExpr = function() { + var e = this.state.start, + t = this.state.startLoc + return this.parseSubscripts( + this.parseExprAtom(), + e, + t, + !0 + ) + }), + (l.parseExprAtom = function(e) { + var t = void 0, + r = this.state.potentialArrowAt === this.state.start + switch (this.state.type) { + case s.types._super: + return ( + this.state.inMethod || + this.options.allowSuperOutsideMethod || + this.raise( + this.state.start, + "'super' outside of function or class" + ), + (t = this.startNode()), + this.next(), + this.match(s.types.parenL) || + this.match(s.types.bracketL) || + this.match(s.types.dot) || + this.unexpected(), + this.match(s.types.parenL) && + "constructor" !== this.state.inMethod && + !this.options.allowSuperOutsideMethod && + this.raise( + t.start, + "super() outside of class constructor" + ), + this.finishNode(t, "Super") + ) + case s.types._this: + return ( + (t = this.startNode()), + this.next(), + this.finishNode(t, "ThisExpression") + ) + case s.types._yield: + this.state.inGenerator && this.unexpected() + case s.types.name: + t = this.startNode() + var n = + this.hasPlugin("asyncFunctions") && + "await" === this.state.value && + this.state.inAsync, + i = this.shouldAllowYieldIdentifier(), + a = this.parseIdentifier(n || i) + if (this.hasPlugin("asyncFunctions")) + if ("await" === a.name) { + if (this.state.inAsync || this.inModule) + return this.parseAwait(t) + } else { + if ( + "async" === a.name && + this.match(s.types._function) && + !this.canInsertSemicolon() + ) + return ( + this.next(), + this.parseFunction( + t, + !1, + !1, + !0 + ) + ) + if ( + r && + "async" === a.name && + this.match(s.types.name) + ) { + var o = [this.parseIdentifier()] + return ( + this.expect(s.types.arrow), + this.parseArrowExpression( + t, + o, + !0 + ) + ) + } + } + return r && + !this.canInsertSemicolon() && + this.eat(s.types.arrow) + ? this.parseArrowExpression(t, [a]) + : a + case s.types._do: + if (this.hasPlugin("doExpressions")) { + var u = this.startNode() + this.next() + var l = this.state.inFunction, + c = this.state.labels + return ( + (this.state.labels = []), + (this.state.inFunction = !1), + (u.body = this.parseBlock(!1, !0)), + (this.state.inFunction = l), + (this.state.labels = c), + this.finishNode(u, "DoExpression") + ) + } + case s.types.regexp: + var p = this.state.value + return ( + (t = this.parseLiteral( + p.value, + "RegExpLiteral" + )), + (t.pattern = p.pattern), + (t.flags = p.flags), + t + ) + case s.types.num: + return this.parseLiteral( + this.state.value, + "NumericLiteral" + ) + case s.types.string: + return this.parseLiteral( + this.state.value, + "StringLiteral" + ) + case s.types._null: + return ( + (t = this.startNode()), + this.next(), + this.finishNode(t, "NullLiteral") + ) + case s.types._true: + case s.types._false: + return ( + (t = this.startNode()), + (t.value = this.match(s.types._true)), + this.next(), + this.finishNode(t, "BooleanLiteral") + ) + case s.types.parenL: + return this.parseParenAndDistinguishExpression( + null, + null, + r + ) + case s.types.bracketL: + return ( + (t = this.startNode()), + this.next(), + (t.elements = this.parseExprList( + s.types.bracketR, + !0, + !0, + e + )), + this.toReferencedList(t.elements), + this.finishNode(t, "ArrayExpression") + ) + case s.types.braceL: + return this.parseObj(!1, e) + case s.types._function: + return this.parseFunctionExpression() + case s.types.at: + this.parseDecorators() + case s.types._class: + return ( + (t = this.startNode()), + this.takeDecorators(t), + this.parseClass(t, !1) + ) + case s.types._new: + return this.parseNew() + case s.types.backQuote: + return this.parseTemplate() + case s.types.doubleColon: + ;(t = this.startNode()), + this.next(), + (t.object = null) + var f = (t.callee = this.parseNoCallExpr()) + if ("MemberExpression" === f.type) + return this.finishNode(t, "BindExpression") + this.raise( + f.start, + "Binding should be performed on object property." + ) + default: + this.unexpected() + } + }), + (l.parseFunctionExpression = function() { + var e = this.startNode(), + t = this.parseIdentifier(!0) + return this.state.inGenerator && + this.eat(s.types.dot) && + this.hasPlugin("functionSent") + ? this.parseMetaProperty(e, t, "sent") + : this.parseFunction(e, !1) + }), + (l.parseMetaProperty = function(e, t, r) { + return ( + (e.meta = t), + (e.property = this.parseIdentifier(!0)), + e.property.name !== r && + this.raise( + e.property.start, + "The only valid meta property for new is " + + t.name + + "." + + r + ), + this.finishNode(e, "MetaProperty") + ) + }), + (l.parseLiteral = function(e, t) { + var r = this.startNode() + return ( + this.addExtra(r, "rawValue", e), + this.addExtra( + r, + "raw", + this.input.slice( + this.state.start, + this.state.end + ) + ), + (r.value = e), + this.next(), + this.finishNode(r, t) + ) + }), + (l.parseParenExpression = function() { + this.expect(s.types.parenL) + var e = this.parseExpression() + return this.expect(s.types.parenR), e + }), + (l.parseParenAndDistinguishExpression = function( + e, + t, + r, + n, + i + ) { + ;(e = e || this.state.start), + (t = t || this.state.startLoc) + var a = void 0 + this.next() + for ( + var o = this.state.start, + u = this.state.startLoc, + l = [], + c = !0, + p = { start: 0 }, + f = void 0, + h = void 0; + !this.match(s.types.parenR); + + ) { + if (c) c = !1 + else if ( + (this.expect(s.types.comma), + this.match(s.types.parenR) && + this.hasPlugin("trailingFunctionCommas")) + ) { + h = this.state.start + break + } + if (this.match(s.types.ellipsis)) { + var d = this.state.start, + m = this.state.startLoc + ;(f = this.state.start), + l.push( + this.parseParenItem( + this.parseRest(), + m, + d + ) + ) + break + } + l.push( + this.parseMaybeAssign( + !1, + p, + this.parseParenItem + ) + ) + } + var y = this.state.start, + v = this.state.startLoc + if ( + (this.expect(s.types.parenR), + r && + !this.canInsertSemicolon() && + this.eat(s.types.arrow)) + ) { + for (var g = 0; g < l.length; g++) { + var E = l[g] + E.extra && + E.extra.parenthesized && + this.unexpected(E.extra.parenStart) + } + return this.parseArrowExpression( + this.startNodeAt(e, t), + l, + n + ) + } + if (!l.length) { + if (n) return + this.unexpected(this.state.lastTokStart) + } + return ( + h && !i && this.unexpected(h), + f && this.unexpected(f), + p.start && this.unexpected(p.start), + l.length > 1 + ? ((a = this.startNodeAt(o, u)), + (a.expressions = l), + this.toReferencedList(a.expressions), + this.finishNodeAt( + a, + "SequenceExpression", + y, + v + )) + : (a = l[0]), + this.addExtra(a, "parenthesized", !0), + this.addExtra(a, "parenStart", e), + a + ) + }), + (l.parseParenItem = function(e) { + return e + }), + (l.parseNew = function() { + var e = this.startNode(), + t = this.parseIdentifier(!0) + return this.eat(s.types.dot) + ? this.parseMetaProperty(e, t, "target") + : ((e.callee = this.parseNoCallExpr()), + this.eat(s.types.parenL) + ? ((e.arguments = this.parseExprList( + s.types.parenR, + this.hasPlugin("trailingFunctionCommas") + )), + this.toReferencedList(e.arguments)) + : (e.arguments = []), + this.finishNode(e, "NewExpression")) + }), + (l.parseTemplateElement = function() { + var e = this.startNode() + return ( + (e.value = { + raw: this.input + .slice(this.state.start, this.state.end) + .replace(/\r\n?/g, "\n"), + cooked: this.state.value + }), + this.next(), + (e.tail = this.match(s.types.backQuote)), + this.finishNode(e, "TemplateElement") + ) + }), + (l.parseTemplate = function() { + var e = this.startNode() + this.next(), (e.expressions = []) + var t = this.parseTemplateElement() + for (e.quasis = [t]; !t.tail; ) + this.expect(s.types.dollarBraceL), + e.expressions.push(this.parseExpression()), + this.expect(s.types.braceR), + e.quasis.push((t = this.parseTemplateElement())) + return ( + this.next(), this.finishNode(e, "TemplateLiteral") + ) + }), + (l.parseObj = function(e, t) { + var r = [], + i = n(null), + a = !0, + o = this.startNode() + for ( + o.properties = [], this.next(); + !this.eat(s.types.braceR); + + ) { + if (a) a = !1 + else if ( + (this.expect(s.types.comma), + this.eat(s.types.braceR)) + ) + break + for (; this.match(s.types.at); ) + r.push(this.parseDecorator()) + var u = this.startNode(), + l = !1, + c = !1, + p = void 0, + f = void 0 + if ( + (r.length && ((u.decorators = r), (r = [])), + this.hasPlugin("objectRestSpread") && + this.match(s.types.ellipsis)) + ) + (u = this.parseSpread()), + (u.type = e + ? "RestProperty" + : "SpreadProperty"), + o.properties.push(u) + else { + if ( + ((u.method = !1), + (u.shorthand = !1), + (e || t) && + ((p = this.state.start), + (f = this.state.startLoc)), + e || (l = this.eat(s.types.star)), + !e && + this.hasPlugin("asyncFunctions") && + this.isContextual("async")) + ) { + l && this.unexpected() + var h = this.parseIdentifier() + this.match(s.types.colon) || + this.match(s.types.parenL) || + this.match(s.types.braceR) + ? (u.key = h) + : ((c = !0), + this.hasPlugin("asyncGenerators") && + (l = this.eat(s.types.star)), + this.parsePropertyName(u)) + } else this.parsePropertyName(u) + this.parseObjPropValue(u, p, f, l, c, e, t), + this.checkPropClash(u, i), + u.shorthand && + this.addExtra(u, "shorthand", !0), + o.properties.push(u) + } + } + return ( + r.length && + this.raise( + this.state.start, + "You have trailing decorators with no property" + ), + this.finishNode( + o, + e ? "ObjectPattern" : "ObjectExpression" + ) + ) + }), + (l.parseObjPropValue = function(e, t, r, n, i, a, o) { + if (i || n || this.match(s.types.parenL)) + return ( + a && this.unexpected(), + (e.kind = "method"), + (e.method = !0), + this.parseMethod(e, n, i), + this.finishNode(e, "ObjectMethod") + ) + if (this.eat(s.types.colon)) + return ( + (e.value = a + ? this.parseMaybeDefault( + this.state.start, + this.state.startLoc + ) + : this.parseMaybeAssign(!1, o)), + this.finishNode(e, "ObjectProperty") + ) + if ( + !( + e.computed || + "Identifier" !== e.key.type || + ("get" !== e.key.name && + "set" !== e.key.name) || + this.match(s.types.comma) || + this.match(s.types.braceR) + ) + ) { + ;(n || i || a) && this.unexpected(), + (e.kind = e.key.name), + this.parsePropertyName(e), + this.parseMethod(e, !1) + var l = "get" === e.kind ? 0 : 1 + if (e.params.length !== l) { + var c = e.start + "get" === e.kind + ? this.raise( + c, + "getter should have no params" + ) + : this.raise( + c, + "setter should have exactly one param" + ) + } + return this.finishNode(e, "ObjectMethod") + } + if (!e.computed && "Identifier" === e.key.type) { + if (a) { + var p = this.isKeyword(e.key.name) + !p && + this.state.strict && + (p = + u.reservedWords.strictBind( + e.key.name + ) || + u.reservedWords.strict(e.key.name)), + p && + this.raise( + e.key.start, + "Binding " + e.key.name + ), + (e.value = this.parseMaybeDefault( + t, + r, + e.key.__clone() + )) + } else + this.match(s.types.eq) && o + ? (o.start || (o.start = this.state.start), + (e.value = this.parseMaybeDefault( + t, + r, + e.key.__clone() + ))) + : (e.value = e.key.__clone()) + return ( + (e.shorthand = !0), + this.finishNode(e, "ObjectProperty") + ) + } + this.unexpected() + }), + (l.parsePropertyName = function(e) { + return this.eat(s.types.bracketL) + ? ((e.computed = !0), + (e.key = this.parseMaybeAssign()), + this.expect(s.types.bracketR), + e.key) + : ((e.computed = !1), + (e.key = + this.match(s.types.num) || + this.match(s.types.string) + ? this.parseExprAtom() + : this.parseIdentifier(!0))) + }), + (l.initFunction = function(e, t) { + ;(e.id = null), + (e.generator = !1), + (e.expression = !1), + this.hasPlugin("asyncFunctions") && (e.async = !!t) + }), + (l.parseMethod = function(e, t, r) { + var n = this.state.inMethod + return ( + (this.state.inMethod = e.kind || !0), + this.initFunction(e, r), + this.expect(s.types.parenL), + (e.params = this.parseBindingList( + s.types.parenR, + !1, + this.hasPlugin("trailingFunctionCommas") + )), + (e.generator = t), + this.parseFunctionBody(e), + (this.state.inMethod = n), + e + ) + }), + (l.parseArrowExpression = function(e, t, r) { + return ( + this.initFunction(e, r), + (e.params = this.toAssignableList(t, !0)), + this.parseFunctionBody(e, !0), + this.finishNode(e, "ArrowFunctionExpression") + ) + }), + (l.parseFunctionBody = function(e, t) { + var r = t && !this.match(s.types.braceL), + i = this.state.inAsync + if (((this.state.inAsync = e.async), r)) + (e.body = this.parseMaybeAssign()), + (e.expression = !0) + else { + var a = this.state.inFunction, + o = this.state.inGenerator, + u = this.state.labels + ;(this.state.inFunction = !0), + (this.state.inGenerator = e.generator), + (this.state.labels = []), + (e.body = this.parseBlock(!0)), + (e.expression = !1), + (this.state.inFunction = a), + (this.state.inGenerator = o), + (this.state.labels = u) + } + this.state.inAsync = i + var l = this.state.strict, + c = !1, + p = !1 + if ((t && (l = !0), !r && e.body.directives.length)) + for ( + var f = e.body.directives, h = 0; + h < f.length; + h++ + ) { + var d = f[h] + if ("use strict" === d.value.value) { + ;(p = !0), (l = !0), (c = !0) + break + } + } + if ( + (p && + e.id && + "Identifier" === e.id.type && + "yield" === e.id.name && + this.raise( + e.id.start, + "Binding yield in strict mode" + ), + l) + ) { + var m = n(null), + y = this.state.strict + c && (this.state.strict = !0), + e.id && this.checkLVal(e.id, !0) + for (var v = e.params, g = 0; g < v.length; g++) { + var E = v[g] + this.checkLVal(E, !0, m) + } + this.state.strict = y + } + }), + (l.parseExprList = function(e, t, r, n) { + for (var i = [], a = !0; !this.eat(e); ) { + if (a) a = !1 + else if ( + (this.expect(s.types.comma), t && this.eat(e)) + ) + break + i.push(this.parseExprListItem(r, n)) + } + return i + }), + (l.parseExprListItem = function(e, t) { + var r = void 0 + return (r = + e && this.match(s.types.comma) + ? null + : this.match(s.types.ellipsis) + ? this.parseSpread(t) + : this.parseMaybeAssign(!1, t)) + }), + (l.parseIdentifier = function(e) { + var t = this.startNode() + return ( + this.match(s.types.name) + ? (!e && + this.state.strict && + u.reservedWords.strict( + this.state.value + ) && + this.raise( + this.state.start, + "The keyword '" + + this.state.value + + "' is reserved" + ), + (t.name = this.state.value)) + : e && this.state.type.keyword + ? (t.name = this.state.type.keyword) + : this.unexpected(), + !e && + "await" === t.name && + this.state.inAsync && + this.raise( + t.start, + "invalid use of await inside of an async function" + ), + this.next(), + this.finishNode(t, "Identifier") + ) + }), + (l.parseAwait = function(e) { + return ( + this.state.inAsync || this.unexpected(), + this.isLineTerminator() && this.unexpected(), + this.match(s.types.star) && + this.raise( + e.start, + "await* has been removed from the async functions proposal. Use Promise.all() instead." + ), + (e.argument = this.parseMaybeUnary()), + this.finishNode(e, "AwaitExpression") + ) + }), + (l.parseYield = function() { + var e = this.startNode() + return ( + this.next(), + this.match(s.types.semi) || + this.canInsertSemicolon() || + (!this.match(s.types.star) && + !this.state.type.startsExpr) + ? ((e.delegate = !1), (e.argument = null)) + : ((e.delegate = this.eat(s.types.star)), + (e.argument = this.parseMaybeAssign())), + this.finishNode(e, "YieldExpression") + ) + }) + }, + { 17: 17, 18: 18, 21: 21, 25: 25, 5: 5 } + ], + 5: [ + function(e, t, r) { + "use strict" + var n = e(24)["default"], + i = e(23)["default"], + s = e(25)["default"] + r.__esModule = !0 + var a = e(18), + o = e(2), + u = e(15), + l = s(u), + c = {} + r.plugins = c + var p = (function(e) { + function t(r, n) { + i(this, t), + (r = o.getOptions(r)), + e.call(this, r, n), + (this.options = r), + (this.inModule = + "module" === this.options.sourceType), + (this.isReservedWord = a.reservedWords[6]), + (this.input = n), + (this.plugins = this.loadPlugins( + this.options.plugins + )), + 0 === this.state.pos && + "#" === this.input[0] && + "!" === this.input[1] && + this.skipLineComment(2) + } + return ( + n(t, e), + (t.prototype.hasPlugin = function(e) { + return !(!this.plugins["*"] && !this.plugins[e]) + }), + (t.prototype.extend = function(e, t) { + this[e] = t(this[e]) + }), + (t.prototype.loadPlugins = function(e) { + var t = {} + e.indexOf("flow") >= 0 && + ((e = e.filter(function(e) { + return "flow" !== e + })), + e.push("flow")) + for (var n = 0; n < e.length; n++) { + var i = e[n] + if (!t[i]) { + t[i] = !0 + var s = r.plugins[i] + s && s(this) + } + } + return t + }), + (t.prototype.parse = function() { + var e = this.startNode(), + t = this.startNode() + return this.nextToken(), this.parseTopLevel(e, t) + }), + t + ) + })(l["default"]) + r["default"] = p + }, + { 15: 15, 18: 18, 2: 2, 23: 23, 24: 24, 25: 25 } + ], + 6: [ + function(e, t, r) { + "use strict" + var n = e(25)["default"], + i = e(19), + s = e(5), + a = n(s), + o = a["default"].prototype + o.raise = function(e, t) { + var r = i.getLineInfo(this.input, e) + t += " (" + r.line + ":" + r.column + ")" + var n = new SyntaxError(t) + throw ((n.pos = e), (n.loc = r), n) + } + }, + { 19: 19, 25: 25, 5: 5 } + ], + 7: [ + function(e, t, r) { + "use strict" + var n = e(25)["default"], + i = e(17), + s = e(5), + a = n(s), + o = e(18), + u = a["default"].prototype + ;(u.toAssignable = function(e, t) { + if (e) + switch (e.type) { + case "Identifier": + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + break + case "ObjectExpression": + e.type = "ObjectPattern" + for ( + var r = e.properties, n = 0; + n < r.length; + n++ + ) { + var i = r[n] + "ObjectMethod" === i.type + ? "get" === i.kind || "set" === i.kind + ? this.raise( + i.key.start, + "Object pattern can't contain getter or setter" + ) + : this.raise( + i.key.start, + "Object pattern can't contain methods" + ) + : this.toAssignable(i, t) + } + break + case "ObjectProperty": + this.toAssignable(e.value, t) + break + case "SpreadProperty": + e.type = "RestProperty" + break + case "ArrayExpression": + ;(e.type = "ArrayPattern"), + this.toAssignableList(e.elements, t) + break + case "AssignmentExpression": + "=" === e.operator + ? ((e.type = "AssignmentPattern"), + delete e.operator) + : this.raise( + e.left.end, + "Only '=' operator can be used for specifying default value." + ) + break + case "MemberExpression": + if (!t) break + default: + this.raise(e.start, "Assigning to rvalue") + } + return e + }), + (u.toAssignableList = function(e, t) { + var r = e.length + if (r) { + var n = e[r - 1] + if (n && "RestElement" === n.type) --r + else if (n && "SpreadElement" === n.type) { + n.type = "RestElement" + var i = n.argument + this.toAssignable(i, t), + "Identifier" !== i.type && + "MemberExpression" !== i.type && + "ArrayPattern" !== i.type && + this.unexpected(i.start), + --r + } + } + for (var s = 0; r > s; s++) { + var a = e[s] + a && this.toAssignable(a, t) + } + return e + }), + (u.toReferencedList = function(e) { + return e + }), + (u.parseSpread = function(e) { + var t = this.startNode() + return ( + this.next(), + (t.argument = this.parseMaybeAssign(e)), + this.finishNode(t, "SpreadElement") + ) + }), + (u.parseRest = function() { + var e = this.startNode() + return ( + this.next(), + (e.argument = this.parseBindingIdentifier()), + this.finishNode(e, "RestElement") + ) + }), + (u.shouldAllowYieldIdentifier = function() { + return ( + this.match(i.types._yield) && + !this.state.strict && + !this.state.inGenerator + ) + }), + (u.parseBindingIdentifier = function() { + return this.parseIdentifier( + this.shouldAllowYieldIdentifier() + ) + }), + (u.parseBindingAtom = function() { + switch (this.state.type) { + case i.types._yield: + ;(this.state.strict || + this.state.inGenerator) && + this.unexpected() + case i.types.name: + return this.parseIdentifier(!0) + case i.types.bracketL: + var e = this.startNode() + return ( + this.next(), + (e.elements = this.parseBindingList( + i.types.bracketR, + !0, + !0 + )), + this.finishNode(e, "ArrayPattern") + ) + case i.types.braceL: + return this.parseObj(!0) + default: + this.unexpected() + } + }), + (u.parseBindingList = function(e, t, r) { + for (var n = [], s = !0; !this.eat(e); ) + if ( + (s ? (s = !1) : this.expect(i.types.comma), + t && this.match(i.types.comma)) + ) + n.push(null) + else { + if (r && this.eat(e)) break + if (this.match(i.types.ellipsis)) { + n.push( + this.parseAssignableListItemTypes( + this.parseRest() + ) + ), + this.expect(e) + break + } + var a = this.parseMaybeDefault() + this.parseAssignableListItemTypes(a), + n.push( + this.parseMaybeDefault(null, null, a) + ) + } + return n + }), + (u.parseAssignableListItemTypes = function(e) { + return e + }), + (u.parseMaybeDefault = function(e, t, r) { + if ( + ((t = t || this.state.startLoc), + (e = e || this.state.start), + (r = r || this.parseBindingAtom()), + !this.eat(i.types.eq)) + ) + return r + var n = this.startNodeAt(e, t) + return ( + (n.left = r), + (n.right = this.parseMaybeAssign()), + this.finishNode(n, "AssignmentPattern") + ) + }), + (u.checkLVal = function(e, t, r) { + switch (e.type) { + case "Identifier": + if ( + (this.state.strict && + (o.reservedWords.strictBind(e.name) || + o.reservedWords.strict(e.name)) && + this.raise( + e.start, + (t ? "Binding " : "Assigning to ") + + e.name + + " in strict mode" + ), + r) + ) { + var n = "_" + e.name + r[n] + ? this.raise( + e.start, + "Argument name clash in strict mode" + ) + : (r[n] = !0) + } + break + case "MemberExpression": + t && + this.raise( + e.start, + (t ? "Binding" : "Assigning to") + + " member expression" + ) + break + case "ObjectPattern": + for ( + var i = e.properties, s = 0; + s < i.length; + s++ + ) { + var a = i[s] + "ObjectProperty" === a.type && + (a = a.value), + this.checkLVal(a, t, r) + } + break + case "ArrayPattern": + for ( + var u = e.elements, l = 0; + l < u.length; + l++ + ) { + var c = u[l] + c && this.checkLVal(c, t, r) + } + break + case "AssignmentPattern": + this.checkLVal(e.left, t, r) + break + case "RestProperty": + case "RestElement": + this.checkLVal(e.argument, t, r) + break + default: + this.raise( + e.start, + (t ? "Binding" : "Assigning to") + " rvalue" + ) + } + }) + }, + { 17: 17, 18: 18, 25: 25, 5: 5 } + ], + 8: [ + function(e, t, r) { + "use strict" + function n(e, t, r, n) { + return ( + (e.type = t), + (e.end = r), + (e.loc.end = n), + this.processComment(e), + e + ) + } + var i = e(23)["default"], + s = e(25)["default"], + a = e(5), + o = s(a), + u = e(19), + l = o["default"].prototype, + c = (function() { + function e(t, r) { + i(this, e), + (this.type = ""), + (this.start = t), + (this.end = 0), + (this.loc = new u.SourceLocation(r)) + } + return ( + (e.prototype.__clone = function() { + var t = new e() + for (var r in this) t[r] = this[r] + return t + }), + e + ) + })() + ;(l.startNode = function() { + return new c(this.state.start, this.state.startLoc) + }), + (l.startNodeAt = function(e, t) { + return new c(e, t) + }), + (l.finishNode = function(e, t) { + return n.call( + this, + e, + t, + this.state.lastTokEnd, + this.state.lastTokEndLoc + ) + }), + (l.finishNodeAt = function(e, t, r, i) { + return n.call(this, e, t, r, i) + }) + }, + { 19: 19, 23: 23, 25: 25, 5: 5 } + ], + 9: [ + function(e, t, r) { + "use strict" + var n = e(21)["default"], + i = e(25)["default"], + s = e(17), + a = e(5), + o = i(a), + u = e(20), + l = o["default"].prototype + l.parseTopLevel = function(e, t) { + return ( + (t.sourceType = this.options.sourceType), + this.parseBlockBody(t, !0, !0, s.types.eof), + (e.program = this.finishNode(t, "Program")), + (e.comments = this.state.comments), + (e.tokens = this.state.tokens), + this.finishNode(e, "File") + ) + } + var c = { kind: "loop" }, + p = { kind: "switch" } + ;(l.stmtToDirective = function(e) { + var t = e.expression, + r = this.startNodeAt(t.start, t.loc.start), + n = this.startNodeAt(e.start, e.loc.start), + i = this.input.slice(t.start, t.end), + s = (r.value = i.slice(1, -1)) + return ( + this.addExtra(r, "raw", i), + this.addExtra(r, "rawValue", s), + (n.value = this.finishNodeAt( + r, + "DirectiveLiteral", + t.end, + t.loc.end + )), + this.finishNodeAt(n, "Directive", e.end, e.loc.end) + ) + }), + (l.parseStatement = function(e, t) { + this.match(s.types.at) && this.parseDecorators(!0) + var r = this.state.type, + n = this.startNode() + switch (r) { + case s.types._break: + case s.types._continue: + return this.parseBreakContinueStatement( + n, + r.keyword + ) + case s.types._debugger: + return this.parseDebuggerStatement(n) + case s.types._do: + return this.parseDoStatement(n) + case s.types._for: + return this.parseForStatement(n) + case s.types._function: + return ( + e || this.unexpected(), + this.parseFunctionStatement(n) + ) + case s.types._class: + return ( + e || this.unexpected(), + this.takeDecorators(n), + this.parseClass(n, !0) + ) + case s.types._if: + return this.parseIfStatement(n) + case s.types._return: + return this.parseReturnStatement(n) + case s.types._switch: + return this.parseSwitchStatement(n) + case s.types._throw: + return this.parseThrowStatement(n) + case s.types._try: + return this.parseTryStatement(n) + case s.types._let: + case s.types._const: + e || this.unexpected() + case s.types._var: + return this.parseVarStatement(n, r) + case s.types._while: + return this.parseWhileStatement(n) + case s.types._with: + return this.parseWithStatement(n) + case s.types.braceL: + return this.parseBlock() + case s.types.semi: + return this.parseEmptyStatement(n) + case s.types._export: + case s.types._import: + return ( + this.options.allowImportExportEverywhere || + (t || + this.raise( + this.state.start, + "'import' and 'export' may only appear at the top level" + ), + this.inModule || + this.raise( + this.state.start, + "'import' and 'export' may appear only with 'sourceType: module'" + )), + r === s.types._import + ? this.parseImport(n) + : this.parseExport(n) + ) + case s.types.name: + if ( + this.hasPlugin("asyncFunctions") && + "async" === this.state.value + ) { + var i = this.state.clone() + if ( + (this.next(), + this.match(s.types._function) && + !this.canInsertSemicolon()) + ) + return ( + this.expect(s.types._function), + this.parseFunction(n, !0, !1, !0) + ) + this.state = i + } + } + var a = this.state.value, + o = this.parseExpression() + return r === s.types.name && + "Identifier" === o.type && + this.eat(s.types.colon) + ? this.parseLabeledStatement(n, a, o) + : this.parseExpressionStatement(n, o) + }), + (l.takeDecorators = function(e) { + this.state.decorators.length && + ((e.decorators = this.state.decorators), + (this.state.decorators = [])) + }), + (l.parseDecorators = function(e) { + for (; this.match(s.types.at); ) + this.state.decorators.push(this.parseDecorator()) + ;(e && this.match(s.types._export)) || + this.match(s.types._class) || + this.raise( + this.state.start, + "Leading decorators must be attached to a class declaration" + ) + }), + (l.parseDecorator = function() { + this.hasPlugin("decorators") || this.unexpected() + var e = this.startNode() + return ( + this.next(), + (e.expression = this.parseMaybeAssign()), + this.finishNode(e, "Decorator") + ) + }), + (l.parseBreakContinueStatement = function(e, t) { + var r = "break" === t + this.next(), + this.isLineTerminator() + ? (e.label = null) + : this.match(s.types.name) + ? ((e.label = this.parseIdentifier()), + this.semicolon()) + : this.unexpected() + var n = void 0 + for (n = 0; n < this.state.labels.length; ++n) { + var i = this.state.labels[n] + if (null == e.label || i.name === e.label.name) { + if (null != i.kind && (r || "loop" === i.kind)) + break + if (e.label && r) break + } + } + return ( + n === this.state.labels.length && + this.raise(e.start, "Unsyntactic " + t), + this.finishNode( + e, + r ? "BreakStatement" : "ContinueStatement" + ) + ) + }), + (l.parseDebuggerStatement = function(e) { + return ( + this.next(), + this.semicolon(), + this.finishNode(e, "DebuggerStatement") + ) + }), + (l.parseDoStatement = function(e) { + return ( + this.next(), + this.state.labels.push(c), + (e.body = this.parseStatement(!1)), + this.state.labels.pop(), + this.expect(s.types._while), + (e.test = this.parseParenExpression()), + this.eat(s.types.semi), + this.finishNode(e, "DoWhileStatement") + ) + }), + (l.parseForStatement = function(e) { + if ( + (this.next(), + this.state.labels.push(c), + this.expect(s.types.parenL), + this.match(s.types.semi)) + ) + return this.parseFor(e, null) + if ( + this.match(s.types._var) || + this.match(s.types._let) || + this.match(s.types._const) + ) { + var t = this.startNode(), + r = this.state.type + return ( + this.next(), + this.parseVar(t, !0, r), + this.finishNode(t, "VariableDeclaration"), + (!this.match(s.types._in) && + !this.isContextual("of")) || + 1 !== t.declarations.length || + t.declarations[0].init + ? this.parseFor(e, t) + : this.parseForIn(e, t) + ) + } + var n = { start: 0 }, + i = this.parseExpression(!0, n) + return this.match(s.types._in) || + this.isContextual("of") + ? (this.toAssignable(i), + this.checkLVal(i), + this.parseForIn(e, i)) + : (n.start && this.unexpected(n.start), + this.parseFor(e, i)) + }), + (l.parseFunctionStatement = function(e) { + return this.next(), this.parseFunction(e, !0) + }), + (l.parseIfStatement = function(e) { + return ( + this.next(), + (e.test = this.parseParenExpression()), + (e.consequent = this.parseStatement(!1)), + (e.alternate = this.eat(s.types._else) + ? this.parseStatement(!1) + : null), + this.finishNode(e, "IfStatement") + ) + }), + (l.parseReturnStatement = function(e) { + return ( + this.state.inFunction || + this.options.allowReturnOutsideFunction || + this.raise( + this.state.start, + "'return' outside of function" + ), + this.next(), + this.isLineTerminator() + ? (e.argument = null) + : ((e.argument = this.parseExpression()), + this.semicolon()), + this.finishNode(e, "ReturnStatement") + ) + }), + (l.parseSwitchStatement = function(e) { + this.next(), + (e.discriminant = this.parseParenExpression()), + (e.cases = []), + this.expect(s.types.braceL), + this.state.labels.push(p) + for ( + var t = void 0, r = void 0; + !this.match(s.types.braceR); + + ) + if ( + this.match(s.types._case) || + this.match(s.types._default) + ) { + var n = this.match(s.types._case) + t && this.finishNode(t, "SwitchCase"), + e.cases.push((t = this.startNode())), + (t.consequent = []), + this.next(), + n + ? (t.test = this.parseExpression()) + : (r && + this.raise( + this.state.lastTokStart, + "Multiple default clauses" + ), + (r = !0), + (t.test = null)), + this.expect(s.types.colon) + } else + t + ? t.consequent.push(this.parseStatement(!0)) + : this.unexpected() + return ( + t && this.finishNode(t, "SwitchCase"), + this.next(), + this.state.labels.pop(), + this.finishNode(e, "SwitchStatement") + ) + }), + (l.parseThrowStatement = function(e) { + return ( + this.next(), + u.lineBreak.test( + this.input.slice( + this.state.lastTokEnd, + this.state.start + ) + ) && + this.raise( + this.state.lastTokEnd, + "Illegal newline after throw" + ), + (e.argument = this.parseExpression()), + this.semicolon(), + this.finishNode(e, "ThrowStatement") + ) + }) + var f = [] + ;(l.parseTryStatement = function(e) { + if ( + (this.next(), + (e.block = this.parseBlock()), + (e.handler = null), + this.match(s.types._catch)) + ) { + var t = this.startNode() + this.next(), + this.expect(s.types.parenL), + (t.param = this.parseBindingAtom()), + this.checkLVal(t.param, !0, n(null)), + this.expect(s.types.parenR), + (t.body = this.parseBlock()), + (e.handler = this.finishNode(t, "CatchClause")) + } + return ( + (e.guardedHandlers = f), + (e.finalizer = this.eat(s.types._finally) + ? this.parseBlock() + : null), + e.handler || + e.finalizer || + this.raise( + e.start, + "Missing catch or finally clause" + ), + this.finishNode(e, "TryStatement") + ) + }), + (l.parseVarStatement = function(e, t) { + return ( + this.next(), + this.parseVar(e, !1, t), + this.semicolon(), + this.finishNode(e, "VariableDeclaration") + ) + }), + (l.parseWhileStatement = function(e) { + return ( + this.next(), + (e.test = this.parseParenExpression()), + this.state.labels.push(c), + (e.body = this.parseStatement(!1)), + this.state.labels.pop(), + this.finishNode(e, "WhileStatement") + ) + }), + (l.parseWithStatement = function(e) { + return ( + this.state.strict && + this.raise( + this.state.start, + "'with' in strict mode" + ), + this.next(), + (e.object = this.parseParenExpression()), + (e.body = this.parseStatement(!1)), + this.finishNode(e, "WithStatement") + ) + }), + (l.parseEmptyStatement = function(e) { + return this.next(), this.finishNode(e, "EmptyStatement") + }), + (l.parseLabeledStatement = function(e, t, r) { + for ( + var n = this.state.labels, i = 0; + i < n.length; + i++ + ) { + var a = n[i] + a.name === t && + this.raise( + r.start, + "Label '" + t + "' is already declared" + ) + } + for ( + var o = this.state.type.isLoop + ? "loop" + : this.match(s.types._switch) + ? "switch" + : null, + u = this.state.labels.length - 1; + u >= 0; + u-- + ) { + var a = this.state.labels[u] + if (a.statementStart !== e.start) break + ;(a.statementStart = this.state.start), (a.kind = o) + } + return ( + this.state.labels.push({ + name: t, + kind: o, + statementStart: this.state.start + }), + (e.body = this.parseStatement(!0)), + this.state.labels.pop(), + (e.label = r), + this.finishNode(e, "LabeledStatement") + ) + }), + (l.parseExpressionStatement = function(e, t) { + return ( + (e.expression = t), + this.semicolon(), + this.finishNode(e, "ExpressionStatement") + ) + }), + (l.parseBlock = function(e) { + var t = this.startNode() + return ( + this.expect(s.types.braceL), + this.parseBlockBody(t, e, !1, s.types.braceR), + this.finishNode(t, "BlockStatement") + ) + }), + (l.parseBlockBody = function(e, t, r, n) { + ;(e.body = []), (e.directives = []) + for ( + var i = !1, s = void 0, a = void 0; + !this.eat(n); + + ) { + i || + !this.state.containsOctal || + a || + (a = this.state.octalPosition) + var o = this.parseStatement(!0, r) + if ( + !t || + i || + "ExpressionStatement" !== o.type || + "StringLiteral" !== o.expression.type || + o.expression.extra.parenthesized + ) + (i = !0), e.body.push(o) + else { + var u = this.stmtToDirective(o) + e.directives.push(u), + void 0 === s && + "use strict" === u.value.value && + ((s = this.state.strict), + this.setStrict(!0), + a && + this.raise( + a, + "Octal literal in strict mode" + )) + } + } + s === !1 && this.setStrict(!1) + }), + (l.parseFor = function(e, t) { + return ( + (e.init = t), + this.expect(s.types.semi), + (e.test = this.match(s.types.semi) + ? null + : this.parseExpression()), + this.expect(s.types.semi), + (e.update = this.match(s.types.parenR) + ? null + : this.parseExpression()), + this.expect(s.types.parenR), + (e.body = this.parseStatement(!1)), + this.state.labels.pop(), + this.finishNode(e, "ForStatement") + ) + }), + (l.parseForIn = function(e, t) { + var r = this.match(s.types._in) + ? "ForInStatement" + : "ForOfStatement" + return ( + this.next(), + (e.left = t), + (e.right = this.parseExpression()), + this.expect(s.types.parenR), + (e.body = this.parseStatement(!1)), + this.state.labels.pop(), + this.finishNode(e, r) + ) + }), + (l.parseVar = function(e, t, r) { + for (e.declarations = [], e.kind = r.keyword; ; ) { + var n = this.startNode() + if ( + (this.parseVarHead(n), + this.eat(s.types.eq) + ? (n.init = this.parseMaybeAssign(t)) + : r !== s.types._const || + this.match(s.types._in) || + this.isContextual("of") + ? "Identifier" === n.id.type || + (t && + (this.match(s.types._in) || + this.isContextual("of"))) + ? (n.init = null) + : this.raise( + this.state.lastTokEnd, + "Complex binding patterns require an initialization value" + ) + : this.unexpected(), + e.declarations.push( + this.finishNode(n, "VariableDeclarator") + ), + !this.eat(s.types.comma)) + ) + break + } + return e + }), + (l.parseVarHead = function(e) { + ;(e.id = this.parseBindingAtom()), + this.checkLVal(e.id, !0) + }), + (l.parseFunction = function(e, t, r, n, i) { + var a = this.state.inMethod + return ( + (this.state.inMethod = !1), + this.initFunction(e, n), + this.match(s.types.star) && + (e.async && !this.hasPlugin("asyncGenerators") + ? this.unexpected() + : ((e.generator = !0), this.next())), + !t || + i || + this.match(s.types.name) || + this.match(s.types._yield) || + this.unexpected(), + (this.match(s.types.name) || + this.match(s.types._yield)) && + (e.id = this.parseBindingIdentifier()), + this.parseFunctionParams(e), + this.parseFunctionBody(e, r), + (this.state.inMethod = a), + this.finishNode( + e, + t ? "FunctionDeclaration" : "FunctionExpression" + ) + ) + }), + (l.parseFunctionParams = function(e) { + this.expect(s.types.parenL), + (e.params = this.parseBindingList( + s.types.parenR, + !1, + this.hasPlugin("trailingFunctionCommas") + )) + }), + (l.parseClass = function(e, t, r) { + return ( + this.next(), + this.parseClassId(e, t, r), + this.parseClassSuper(e), + this.parseClassBody(e), + this.finishNode( + e, + t ? "ClassDeclaration" : "ClassExpression" + ) + ) + }), + (l.isClassProperty = function() { + return this.match(s.types.eq) || this.isLineTerminator() + }), + (l.parseClassBody = function(e) { + var t = this.state.strict + this.state.strict = !0 + var r = !1, + n = !1, + i = [], + a = this.startNode() + for ( + a.body = [], this.expect(s.types.braceL); + !this.eat(s.types.braceR); + + ) + if (!this.eat(s.types.semi)) + if (this.match(s.types.at)) + i.push(this.parseDecorator()) + else { + var o = this.startNode() + i.length && ((o.decorators = i), (i = [])) + var u = !1, + l = + this.match(s.types.name) && + "static" === this.state.value, + c = this.eat(s.types.star), + p = !1, + f = !1 + if ( + (this.parsePropertyName(o), + (o["static"] = + l && !this.match(s.types.parenL)), + o["static"] && + (c && this.unexpected(), + (c = this.eat(s.types.star)), + this.parsePropertyName(o)), + !c && + "Identifier" === o.key.type && + !o.computed) + ) { + if (this.isClassProperty()) { + a.body.push( + this.parseClassProperty(o) + ) + continue + } + this.hasPlugin( + "classConstructorCall" + ) && + "call" === o.key.name && + this.match(s.types.name) && + "constructor" === + this.state.value && + ((u = !0), + this.parsePropertyName(o)) + } + var h = + this.hasPlugin("asyncFunctions") && + !this.match(s.types.parenL) && + !o.computed && + "Identifier" === o.key.type && + "async" === o.key.name + if ( + (h && + (this.hasPlugin( + "asyncGenerators" + ) && + this.eat(s.types.star) && + (c = !0), + (f = !0), + this.parsePropertyName(o)), + (o.kind = "method"), + !o.computed) + ) { + var d = o.key + f || + c || + "Identifier" !== d.type || + this.match(s.types.parenL) || + ("get" !== d.name && + "set" !== d.name) || + ((p = !0), + (o.kind = d.name), + (d = this.parsePropertyName(o))) + var m = + !u && + !o["static"] && + (("Identifier" === d.type && + "constructor" === d.name) || + ("StringLiteral" === d.type && + "constructor" === d.value)) + m && + (n && + this.raise( + d.start, + "Duplicate constructor in the same class" + ), + p && + this.raise( + d.start, + "Constructor can't have get/set modifier" + ), + c && + this.raise( + d.start, + "Constructor can't be a generator" + ), + f && + this.raise( + d.start, + "Constructor can't be an async function" + ), + (o.kind = "constructor"), + (n = !0)) + var y = + o["static"] && + (("Identifier" === d.type && + "prototype" === d.name) || + ("StringLiteral" === d.type && + "prototype" === d.value)) + y && + this.raise( + d.start, + "Classes may not have static property named prototype" + ) + } + if ( + (u && + (r && + this.raise( + o.start, + "Duplicate constructor call in the same class" + ), + (o.kind = "constructorCall"), + (r = !0)), + ("constructor" !== o.kind && + "constructorCall" !== o.kind) || + !o.decorators || + this.raise( + o.start, + "You can't attach decorators to a class constructor" + ), + this.parseClassMethod(a, o, c, f), + p) + ) { + var v = "get" === o.kind ? 0 : 1 + if (o.params.length !== v) { + var g = o.start + "get" === o.kind + ? this.raise( + g, + "getter should have no params" + ) + : this.raise( + g, + "setter should have exactly one param" + ) + } + } + } + i.length && + this.raise( + this.state.start, + "You have trailing decorators with no method" + ), + (e.body = this.finishNode(a, "ClassBody")), + (this.state.strict = t) + }), + (l.parseClassProperty = function(e) { + return ( + this.match(s.types.eq) + ? (this.hasPlugin("classProperties") || + this.unexpected(), + this.next(), + (e.value = this.parseMaybeAssign())) + : (e.value = null), + this.semicolon(), + this.finishNode(e, "ClassProperty") + ) + }), + (l.parseClassMethod = function(e, t, r, n) { + this.parseMethod(t, r, n), + e.body.push(this.finishNode(t, "ClassMethod")) + }), + (l.parseClassId = function(e, t, r) { + this.match(s.types.name) + ? (e.id = this.parseIdentifier()) + : r || !t + ? (e.id = null) + : this.unexpected() + }), + (l.parseClassSuper = function(e) { + e.superClass = this.eat(s.types._extends) + ? this.parseExprSubscripts() + : null + }), + (l.parseExport = function(e) { + if ((this.next(), this.match(s.types.star))) { + var t = this.startNode() + if ( + (this.next(), + !this.hasPlugin("exportExtensions") || + !this.eatContextual("as")) + ) + return ( + this.parseExportFrom(e, !0), + this.finishNode(e, "ExportAllDeclaration") + ) + ;(t.exported = this.parseIdentifier()), + (e.specifiers = [ + this.finishNode( + t, + "ExportNamespaceSpecifier" + ) + ]), + this.parseExportSpecifiersMaybe(e), + this.parseExportFrom(e, !0) + } else if ( + this.hasPlugin("exportExtensions") && + this.isExportDefaultSpecifier() + ) { + var t = this.startNode() + if ( + ((t.exported = this.parseIdentifier(!0)), + (e.specifiers = [ + this.finishNode(t, "ExportDefaultSpecifier") + ]), + this.match(s.types.comma) && + this.lookahead().type === s.types.star) + ) { + this.expect(s.types.comma) + var r = this.startNode() + this.expect(s.types.star), + this.expectContextual("as"), + (r.exported = this.parseIdentifier()), + e.specifiers.push( + this.finishNode( + r, + "ExportNamespaceSpecifier" + ) + ) + } else this.parseExportSpecifiersMaybe(e) + this.parseExportFrom(e, !0) + } else { + if (this.eat(s.types._default)) { + var n = this.startNode(), + i = !1 + return ( + this.eat(s.types._function) + ? (n = this.parseFunction( + n, + !0, + !1, + !1, + !0 + )) + : this.match(s.types._class) + ? (n = this.parseClass(n, !0, !0)) + : ((i = !0), + (n = this.parseMaybeAssign())), + (e.declaration = n), + i && this.semicolon(), + this.checkExport(e), + this.finishNode( + e, + "ExportDefaultDeclaration" + ) + ) + } + this.state.type.keyword || + this.shouldParseExportDeclaration() + ? ((e.specifiers = []), + (e.source = null), + (e.declaration = this.parseExportDeclaration( + e + ))) + : ((e.declaration = null), + (e.specifiers = this.parseExportSpecifiers()), + this.parseExportFrom(e)) + } + return ( + this.checkExport(e), + this.finishNode(e, "ExportNamedDeclaration") + ) + }), + (l.parseExportDeclaration = function() { + return this.parseStatement(!0) + }), + (l.isExportDefaultSpecifier = function() { + if (this.match(s.types.name)) + return ( + "type" !== this.state.value && + "async" !== this.state.value && + "interface" !== this.state.value + ) + if (!this.match(s.types._default)) return !1 + var e = this.lookahead() + return ( + e.type === s.types.comma || + (e.type === s.types.name && "from" === e.value) + ) + }), + (l.parseExportSpecifiersMaybe = function(e) { + this.eat(s.types.comma) && + (e.specifiers = e.specifiers.concat( + this.parseExportSpecifiers() + )) + }), + (l.parseExportFrom = function(e, t) { + this.eatContextual("from") + ? ((e.source = this.match(s.types.string) + ? this.parseExprAtom() + : this.unexpected()), + this.checkExport(e)) + : t + ? this.unexpected() + : (e.source = null), + this.semicolon() + }), + (l.shouldParseExportDeclaration = function() { + return ( + this.hasPlugin("asyncFunctions") && + this.isContextual("async") + ) + }), + (l.checkExport = function(e) { + if (this.state.decorators.length) { + var t = + e.declaration && + ("ClassDeclaration" === e.declaration.type || + "ClassExpression" === e.declaration.type) + ;(e.declaration && t) || + this.raise( + e.start, + "You can only use decorators on an export when exporting a class" + ), + this.takeDecorators(e.declaration) + } + }), + (l.parseExportSpecifiers = function() { + var e = [], + t = !0, + r = void 0 + for ( + this.expect(s.types.braceL); + !this.eat(s.types.braceR); + + ) { + if (t) t = !1 + else if ( + (this.expect(s.types.comma), + this.eat(s.types.braceR)) + ) + break + var n = this.match(s.types._default) + n && !r && (r = !0) + var i = this.startNode() + ;(i.local = this.parseIdentifier(n)), + (i.exported = this.eatContextual("as") + ? this.parseIdentifier(!0) + : i.local.__clone()), + e.push(this.finishNode(i, "ExportSpecifier")) + } + return ( + r && + !this.isContextual("from") && + this.unexpected(), + e + ) + }), + (l.parseImport = function(e) { + return ( + this.next(), + this.match(s.types.string) + ? ((e.specifiers = []), + (e.source = this.parseExprAtom())) + : ((e.specifiers = []), + this.parseImportSpecifiers(e), + this.expectContextual("from"), + (e.source = this.match(s.types.string) + ? this.parseExprAtom() + : this.unexpected())), + this.semicolon(), + this.finishNode(e, "ImportDeclaration") + ) + }), + (l.parseImportSpecifiers = function(e) { + var t = !0 + if (this.match(s.types.name)) { + var r = this.state.start, + n = this.state.startLoc + if ( + (e.specifiers.push( + this.parseImportSpecifierDefault( + this.parseIdentifier(), + r, + n + ) + ), + !this.eat(s.types.comma)) + ) + return + } + if (this.match(s.types.star)) { + var i = this.startNode() + return ( + this.next(), + this.expectContextual("as"), + (i.local = this.parseIdentifier()), + this.checkLVal(i.local, !0), + void e.specifiers.push( + this.finishNode( + i, + "ImportNamespaceSpecifier" + ) + ) + ) + } + for ( + this.expect(s.types.braceL); + !this.eat(s.types.braceR); + + ) { + if (t) t = !1 + else if ( + (this.expect(s.types.comma), + this.eat(s.types.braceR)) + ) + break + var i = this.startNode() + ;(i.imported = this.parseIdentifier(!0)), + (i.local = this.eatContextual("as") + ? this.parseIdentifier() + : i.imported.__clone()), + this.checkLVal(i.local, !0), + e.specifiers.push( + this.finishNode(i, "ImportSpecifier") + ) + } + }), + (l.parseImportSpecifierDefault = function(e, t, r) { + var n = this.startNodeAt(t, r) + return ( + (n.local = e), + this.checkLVal(n.local, !0), + this.finishNode(n, "ImportDefaultSpecifier") + ) + }) + }, + { 17: 17, 20: 20, 21: 21, 25: 25, 5: 5 } + ], + 10: [ + function(e, t, r) { + "use strict" + var n = e(25)["default"], + i = e(17), + s = e(5), + a = n(s), + o = e(20), + u = a["default"].prototype + ;(u.addExtra = function(e, t, r) { + if (e) { + var n = (e.extra = e.extra || {}) + n[t] = r + } + }), + (u.isRelational = function(e) { + return ( + this.match(i.types.relational) && + this.state.value === e + ) + }), + (u.expectRelational = function(e) { + this.isRelational(e) ? this.next() : this.unexpected() + }), + (u.isContextual = function(e) { + return ( + this.match(i.types.name) && this.state.value === e + ) + }), + (u.eatContextual = function(e) { + return this.state.value === e && this.eat(i.types.name) + }), + (u.expectContextual = function(e) { + this.eatContextual(e) || this.unexpected() + }), + (u.canInsertSemicolon = function() { + return ( + this.match(i.types.eof) || + this.match(i.types.braceR) || + o.lineBreak.test( + this.input.slice( + this.state.lastTokEnd, + this.state.start + ) + ) + ) + }), + (u.isLineTerminator = function() { + return ( + this.eat(i.types.semi) || this.canInsertSemicolon() + ) + }), + (u.semicolon = function() { + this.isLineTerminator() || this.unexpected() + }), + (u.expect = function(e) { + return this.eat(e) || this.unexpected() + }), + (u.unexpected = function(e) { + this.raise( + null != e ? e : this.state.start, + "Unexpected token" + ) + }) + }, + { 17: 17, 20: 20, 25: 25, 5: 5 } + ], + 11: [ + function(e, t, r) { + "use strict" + var n = e(25)["default"] + r.__esModule = !0 + var i = e(17), + s = e(5), + a = n(s), + o = a["default"].prototype + ;(o.flowParseTypeInitialiser = function(e, t) { + var r = this.state.inType + ;(this.state.inType = !0), + this.expect(e || i.types.colon), + t && + (this.match(i.types.bitwiseAND) || + this.match(i.types.bitwiseOR)) && + this.next() + var n = this.flowParseType() + return (this.state.inType = r), n + }), + (o.flowParseDeclareClass = function(e) { + return ( + this.next(), + this.flowParseInterfaceish(e, !0), + this.finishNode(e, "DeclareClass") + ) + }), + (o.flowParseDeclareFunction = function(e) { + this.next() + var t = (e.id = this.parseIdentifier()), + r = this.startNode(), + n = this.startNode() + this.isRelational("<") + ? (r.typeParameters = this.flowParseTypeParameterDeclaration()) + : (r.typeParameters = null), + this.expect(i.types.parenL) + var s = this.flowParseFunctionTypeParams() + return ( + (r.params = s.params), + (r.rest = s.rest), + this.expect(i.types.parenR), + (r.returnType = this.flowParseTypeInitialiser()), + (n.typeAnnotation = this.finishNode( + r, + "FunctionTypeAnnotation" + )), + (t.typeAnnotation = this.finishNode( + n, + "TypeAnnotation" + )), + this.finishNode(t, t.type), + this.semicolon(), + this.finishNode(e, "DeclareFunction") + ) + }), + (o.flowParseDeclare = function(e) { + return this.match(i.types._class) + ? this.flowParseDeclareClass(e) + : this.match(i.types._function) + ? this.flowParseDeclareFunction(e) + : this.match(i.types._var) + ? this.flowParseDeclareVariable(e) + : this.isContextual("module") + ? this.flowParseDeclareModule(e) + : this.isContextual("type") + ? this.flowParseDeclareTypeAlias(e) + : this.isContextual("interface") + ? this.flowParseDeclareInterface(e) + : void this.unexpected() + }), + (o.flowParseDeclareVariable = function(e) { + return ( + this.next(), + (e.id = this.flowParseTypeAnnotatableIdentifier()), + this.semicolon(), + this.finishNode(e, "DeclareVariable") + ) + }), + (o.flowParseDeclareModule = function(e) { + this.next(), + this.match(i.types.string) + ? (e.id = this.parseExprAtom()) + : (e.id = this.parseIdentifier()) + var t = (e.body = this.startNode()), + r = (t.body = []) + for ( + this.expect(i.types.braceL); + !this.match(i.types.braceR); + + ) { + var n = this.startNode() + this.next(), r.push(this.flowParseDeclare(n)) + } + return ( + this.expect(i.types.braceR), + this.finishNode(t, "BlockStatement"), + this.finishNode(e, "DeclareModule") + ) + }), + (o.flowParseDeclareTypeAlias = function(e) { + return ( + this.next(), + this.flowParseTypeAlias(e), + this.finishNode(e, "DeclareTypeAlias") + ) + }), + (o.flowParseDeclareInterface = function(e) { + return ( + this.next(), + this.flowParseInterfaceish(e), + this.finishNode(e, "DeclareInterface") + ) + }), + (o.flowParseInterfaceish = function(e, t) { + if ( + ((e.id = this.parseIdentifier()), + this.isRelational("<") + ? (e.typeParameters = this.flowParseTypeParameterDeclaration()) + : (e.typeParameters = null), + (e["extends"] = []), + (e.mixins = []), + this.eat(i.types._extends)) + ) + do + e["extends"].push( + this.flowParseInterfaceExtends() + ) + while (this.eat(i.types.comma)) + if (this.isContextual("mixins")) { + this.next() + do e.mixins.push(this.flowParseInterfaceExtends()) + while (this.eat(i.types.comma)) + } + e.body = this.flowParseObjectType(t) + }), + (o.flowParseInterfaceExtends = function() { + var e = this.startNode() + return ( + (e.id = this.parseIdentifier()), + this.isRelational("<") + ? (e.typeParameters = this.flowParseTypeParameterInstantiation()) + : (e.typeParameters = null), + this.finishNode(e, "InterfaceExtends") + ) + }), + (o.flowParseInterface = function(e) { + return ( + this.flowParseInterfaceish(e, !1), + this.finishNode(e, "InterfaceDeclaration") + ) + }), + (o.flowParseTypeAlias = function(e) { + return ( + (e.id = this.parseIdentifier()), + this.isRelational("<") + ? (e.typeParameters = this.flowParseTypeParameterDeclaration()) + : (e.typeParameters = null), + (e.right = this.flowParseTypeInitialiser( + i.types.eq, + !0 + )), + this.semicolon(), + this.finishNode(e, "TypeAlias") + ) + }), + (o.flowParseTypeParameterDeclaration = function() { + var e = this.startNode() + for ( + e.params = [], this.expectRelational("<"); + !this.isRelational(">"); + + ) + e.params.push( + this.flowParseExistentialTypeParam() || + this.flowParseTypeAnnotatableIdentifier() + ), + this.isRelational(">") || + this.expect(i.types.comma) + return ( + this.expectRelational(">"), + this.finishNode(e, "TypeParameterDeclaration") + ) + }), + (o.flowParseExistentialTypeParam = function() { + if (this.match(i.types.star)) { + var e = this.startNode() + return ( + this.next(), + this.finishNode(e, "ExistentialTypeParam") + ) + } + }), + (o.flowParseTypeParameterInstantiation = function() { + var e = this.startNode(), + t = this.state.inType + for ( + e.params = [], + this.state.inType = !0, + this.expectRelational("<"); + !this.isRelational(">"); + + ) + e.params.push( + this.flowParseExistentialTypeParam() || + this.flowParseType() + ), + this.isRelational(">") || + this.expect(i.types.comma) + return ( + this.expectRelational(">"), + (this.state.inType = t), + this.finishNode(e, "TypeParameterInstantiation") + ) + }), + (o.flowParseObjectPropertyKey = function() { + return this.match(i.types.num) || + this.match(i.types.string) + ? this.parseExprAtom() + : this.parseIdentifier(!0) + }), + (o.flowParseObjectTypeIndexer = function(e, t) { + return ( + (e["static"] = t), + this.expect(i.types.bracketL), + (e.id = this.flowParseObjectPropertyKey()), + (e.key = this.flowParseTypeInitialiser()), + this.expect(i.types.bracketR), + (e.value = this.flowParseTypeInitialiser()), + this.flowObjectTypeSemicolon(), + this.finishNode(e, "ObjectTypeIndexer") + ) + }), + (o.flowParseObjectTypeMethodish = function(e) { + for ( + e.params = [], + e.rest = null, + e.typeParameters = null, + this.isRelational("<") && + (e.typeParameters = this.flowParseTypeParameterDeclaration()), + this.expect(i.types.parenL); + this.match(i.types.name); + + ) + e.params.push(this.flowParseFunctionTypeParam()), + this.match(i.types.parenR) || + this.expect(i.types.comma) + return ( + this.eat(i.types.ellipsis) && + (e.rest = this.flowParseFunctionTypeParam()), + this.expect(i.types.parenR), + (e.returnType = this.flowParseTypeInitialiser()), + this.finishNode(e, "FunctionTypeAnnotation") + ) + }), + (o.flowParseObjectTypeMethod = function(e, t, r, n) { + var i = this.startNodeAt(e, t) + return ( + (i.value = this.flowParseObjectTypeMethodish( + this.startNodeAt(e, t) + )), + (i["static"] = r), + (i.key = n), + (i.optional = !1), + this.flowObjectTypeSemicolon(), + this.finishNode(i, "ObjectTypeProperty") + ) + }), + (o.flowParseObjectTypeCallProperty = function(e, t) { + var r = this.startNode() + return ( + (e["static"] = t), + (e.value = this.flowParseObjectTypeMethodish(r)), + this.flowObjectTypeSemicolon(), + this.finishNode(e, "ObjectTypeCallProperty") + ) + }), + (o.flowParseObjectType = function(e) { + var t = this.startNode(), + r = void 0, + n = void 0, + s = void 0 + for ( + t.callProperties = [], + t.properties = [], + t.indexers = [], + this.expect(i.types.braceL); + !this.match(i.types.braceR); + + ) { + var a = !1, + o = this.state.start, + u = this.state.startLoc + ;(r = this.startNode()), + e && + this.isContextual("static") && + (this.next(), (s = !0)), + this.match(i.types.bracketL) + ? t.indexers.push( + this.flowParseObjectTypeIndexer(r, s) + ) + : this.match(i.types.parenL) || + this.isRelational("<") + ? t.callProperties.push( + this.flowParseObjectTypeCallProperty( + r, + e + ) + ) + : ((n = + s && this.match(i.types.colon) + ? this.parseIdentifier() + : this.flowParseObjectPropertyKey()), + this.isRelational("<") || + this.match(i.types.parenL) + ? t.properties.push( + this.flowParseObjectTypeMethod( + o, + u, + s, + n + ) + ) + : (this.eat(i.types.question) && + (a = !0), + (r.key = n), + (r.value = this.flowParseTypeInitialiser()), + (r.optional = a), + (r["static"] = s), + this.flowObjectTypeSemicolon(), + t.properties.push( + this.finishNode( + r, + "ObjectTypeProperty" + ) + ))) + } + return ( + this.expect(i.types.braceR), + this.finishNode(t, "ObjectTypeAnnotation") + ) + }), + (o.flowObjectTypeSemicolon = function() { + this.eat(i.types.semi) || + this.eat(i.types.comma) || + this.match(i.types.braceR) || + this.unexpected() + }), + (o.flowParseGenericType = function(e, t, r) { + var n = this.startNodeAt(e, t) + for ( + n.typeParameters = null, n.id = r; + this.eat(i.types.dot); + + ) { + var s = this.startNodeAt(e, t) + ;(s.qualification = n.id), + (s.id = this.parseIdentifier()), + (n.id = this.finishNode( + s, + "QualifiedTypeIdentifier" + )) + } + return ( + this.isRelational("<") && + (n.typeParameters = this.flowParseTypeParameterInstantiation()), + this.finishNode(n, "GenericTypeAnnotation") + ) + }), + (o.flowParseTypeofType = function() { + var e = this.startNode() + return ( + this.expect(i.types._typeof), + (e.argument = this.flowParsePrimaryType()), + this.finishNode(e, "TypeofTypeAnnotation") + ) + }), + (o.flowParseTupleType = function() { + var e = this.startNode() + for ( + e.types = [], this.expect(i.types.bracketL); + this.state.pos < this.input.length && + !this.match(i.types.bracketR) && + (e.types.push(this.flowParseType()), + !this.match(i.types.bracketR)); + + ) + this.expect(i.types.comma) + return ( + this.expect(i.types.bracketR), + this.finishNode(e, "TupleTypeAnnotation") + ) + }), + (o.flowParseFunctionTypeParam = function() { + var e = !1, + t = this.startNode() + return ( + (t.name = this.parseIdentifier()), + this.eat(i.types.question) && (e = !0), + (t.optional = e), + (t.typeAnnotation = this.flowParseTypeInitialiser()), + this.finishNode(t, "FunctionTypeParam") + ) + }), + (o.flowParseFunctionTypeParams = function() { + for ( + var e = { params: [], rest: null }; + this.match(i.types.name); + + ) + e.params.push(this.flowParseFunctionTypeParam()), + this.match(i.types.parenR) || + this.expect(i.types.comma) + return ( + this.eat(i.types.ellipsis) && + (e.rest = this.flowParseFunctionTypeParam()), + e + ) + }), + (o.flowIdentToTypeAnnotation = function(e, t, r, n) { + switch (n.name) { + case "any": + return this.finishNode(r, "AnyTypeAnnotation") + case "void": + return this.finishNode(r, "VoidTypeAnnotation") + case "bool": + case "boolean": + return this.finishNode( + r, + "BooleanTypeAnnotation" + ) + case "mixed": + return this.finishNode(r, "MixedTypeAnnotation") + case "number": + return this.finishNode( + r, + "NumberTypeAnnotation" + ) + case "string": + return this.finishNode( + r, + "StringTypeAnnotation" + ) + default: + return this.flowParseGenericType(e, t, n) + } + }), + (o.flowParsePrimaryType = function() { + var e = this.state.start, + t = this.state.startLoc, + r = this.startNode(), + n = void 0, + s = void 0, + a = !1 + switch (this.state.type) { + case i.types.name: + return this.flowIdentToTypeAnnotation( + e, + t, + r, + this.parseIdentifier() + ) + case i.types.braceL: + return this.flowParseObjectType() + case i.types.bracketL: + return this.flowParseTupleType() + case i.types.relational: + if ("<" === this.state.value) + return ( + (r.typeParameters = this.flowParseTypeParameterDeclaration()), + this.expect(i.types.parenL), + (n = this.flowParseFunctionTypeParams()), + (r.params = n.params), + (r.rest = n.rest), + this.expect(i.types.parenR), + this.expect(i.types.arrow), + (r.returnType = this.flowParseType()), + this.finishNode( + r, + "FunctionTypeAnnotation" + ) + ) + case i.types.parenL: + if ( + (this.next(), + !this.match(i.types.parenR) && + !this.match(i.types.ellipsis)) + ) + if (this.match(i.types.name)) { + var o = this.lookahead().type + a = + o !== i.types.question && + o !== i.types.colon + } else a = !0 + return a + ? ((s = this.flowParseType()), + this.expect(i.types.parenR), + this.eat(i.types.arrow) && + this.raise( + r, + "Unexpected token =>. It looks like you are trying to write a function type, but you ended up writing a grouped type followed by an =>, which is a syntax error. Remember, function type parameters are named so function types look like (name1: type1, name2: type2) => returnType. You probably wrote (type1) => returnType" + ), + s) + : ((n = this.flowParseFunctionTypeParams()), + (r.params = n.params), + (r.rest = n.rest), + this.expect(i.types.parenR), + this.expect(i.types.arrow), + (r.returnType = this.flowParseType()), + (r.typeParameters = null), + this.finishNode( + r, + "FunctionTypeAnnotation" + )) + case i.types.string: + return ( + (r.value = this.state.value), + this.addExtra(r, "rawValue", r.value), + this.addExtra( + r, + "raw", + this.input.slice( + this.state.start, + this.state.end + ) + ), + this.next(), + this.finishNode( + r, + "StringLiteralTypeAnnotation" + ) + ) + case i.types._true: + case i.types._false: + return ( + (r.value = this.match(i.types._true)), + this.next(), + this.finishNode( + r, + "BooleanLiteralTypeAnnotation" + ) + ) + case i.types.num: + return ( + (r.value = this.state.value), + this.addExtra(r, "rawValue", r.value), + this.addExtra( + r, + "raw", + this.input.slice( + this.state.start, + this.state.end + ) + ), + this.next(), + this.finishNode( + r, + "NumericLiteralTypeAnnotation" + ) + ) + case i.types._null: + return ( + (r.value = this.match(i.types._null)), + this.next(), + this.finishNode( + r, + "NullLiteralTypeAnnotation" + ) + ) + case i.types._this: + return ( + (r.value = this.match(i.types._this)), + this.next(), + this.finishNode(r, "ThisTypeAnnotation") + ) + default: + if ("typeof" === this.state.type.keyword) + return this.flowParseTypeofType() + } + this.unexpected() + }), + (o.flowParsePostfixType = function() { + var e = this.startNode(), + t = (e.elementType = this.flowParsePrimaryType()) + return this.match(i.types.bracketL) + ? (this.expect(i.types.bracketL), + this.expect(i.types.bracketR), + this.finishNode(e, "ArrayTypeAnnotation")) + : t + }), + (o.flowParsePrefixType = function() { + var e = this.startNode() + return this.eat(i.types.question) + ? ((e.typeAnnotation = this.flowParsePrefixType()), + this.finishNode(e, "NullableTypeAnnotation")) + : this.flowParsePostfixType() + }), + (o.flowParseIntersectionType = function() { + var e = this.startNode(), + t = this.flowParsePrefixType() + for (e.types = [t]; this.eat(i.types.bitwiseAND); ) + e.types.push(this.flowParsePrefixType()) + return 1 === e.types.length + ? t + : this.finishNode(e, "IntersectionTypeAnnotation") + }), + (o.flowParseUnionType = function() { + var e = this.startNode(), + t = this.flowParseIntersectionType() + for (e.types = [t]; this.eat(i.types.bitwiseOR); ) + e.types.push(this.flowParseIntersectionType()) + return 1 === e.types.length + ? t + : this.finishNode(e, "UnionTypeAnnotation") + }), + (o.flowParseType = function() { + var e = this.state.inType + this.state.inType = !0 + var t = this.flowParseUnionType() + return (this.state.inType = e), t + }), + (o.flowParseTypeAnnotation = function() { + var e = this.startNode() + return ( + (e.typeAnnotation = this.flowParseTypeInitialiser()), + this.finishNode(e, "TypeAnnotation") + ) + }), + (o.flowParseTypeAnnotatableIdentifier = function(e, t) { + var r = this.parseIdentifier(), + n = !1 + return ( + t && + this.eat(i.types.question) && + (this.expect(i.types.question), (n = !0)), + (e || this.match(i.types.colon)) && + ((r.typeAnnotation = this.flowParseTypeAnnotation()), + this.finishNode(r, r.type)), + n && + ((r.optional = !0), this.finishNode(r, r.type)), + r + ) + }), + (r["default"] = function(e) { + function t(e) { + return ( + (e.expression.typeAnnotation = + e.typeAnnotation), + e.expression + ) + } + e.extend("parseFunctionBody", function(e) { + return function(t, r) { + return ( + this.match(i.types.colon) && + !r && + (t.returnType = this.flowParseTypeAnnotation()), + e.call(this, t, r) + ) + } + }), + e.extend("parseStatement", function(e) { + return function(t, r) { + if ( + this.state.strict && + this.match(i.types.name) && + "interface" === this.state.value + ) { + var n = this.startNode() + return ( + this.next(), + this.flowParseInterface(n) + ) + } + return e.call(this, t, r) + } + }), + e.extend("parseExpressionStatement", function(e) { + return function(t, r) { + if ("Identifier" === r.type) + if ("declare" === r.name) { + if ( + this.match(i.types._class) || + this.match(i.types.name) || + this.match(i.types._function) || + this.match(i.types._var) + ) + return this.flowParseDeclare(t) + } else if (this.match(i.types.name)) { + if ("interface" === r.name) + return this.flowParseInterface( + t + ) + if ("type" === r.name) + return this.flowParseTypeAlias( + t + ) + } + return e.call(this, t, r) + } + }), + e.extend("shouldParseExportDeclaration", function( + e + ) { + return function() { + return ( + this.isContextual("type") || + this.isContextual("interface") || + e.call(this) + ) + } + }), + e.extend("parseParenItem", function() { + return function(e, t, r, n) { + var s = (this.state.potentialArrowAt = r) + if (this.match(i.types.colon)) { + var a = this.startNodeAt(t, r) + if ( + ((a.expression = e), + (a.typeAnnotation = this.flowParseTypeAnnotation()), + n && + !this.match(i.types.arrow) && + this.unexpected(), + s && this.eat(i.types.arrow)) + ) { + var o = + "SequenceExpression" === + e.type + ? e.expressions + : [e], + u = this.parseArrowExpression( + this.startNodeAt(t, r), + o + ) + return ( + (u.returnType = + a.typeAnnotation), + u + ) + } + return this.finishNode( + a, + "TypeCastExpression" + ) + } + return e + } + }), + e.extend("parseExport", function(e) { + return function(t) { + return ( + (t = e.call(this, t)), + "ExportNamedDeclaration" === t.type && + (t.exportKind = + t.exportKind || "value"), + t + ) + } + }), + e.extend("parseExportDeclaration", function(e) { + return function(t) { + if (this.isContextual("type")) { + t.exportKind = "type" + var r = this.startNode() + return ( + this.next(), + this.match(i.types.braceL) + ? ((t.specifiers = this.parseExportSpecifiers()), + this.parseExportFrom(t), + null) + : this.flowParseTypeAlias(r) + ) + } + if (this.isContextual("interface")) { + t.exportKind = "type" + var r = this.startNode() + return ( + this.next(), + this.flowParseInterface(r) + ) + } + return e.call(this, t) + } + }), + e.extend("parseClassId", function(e) { + return function(t) { + e.apply(this, arguments), + this.isRelational("<") && + (t.typeParameters = this.flowParseTypeParameterDeclaration()) + } + }), + e.extend("isKeyword", function(e) { + return function(t) { + return this.state.inType && "void" === t + ? !1 + : e.call(this, t) + } + }), + e.extend("readToken", function(e) { + return function(t) { + return !this.state.inType || + (62 !== t && 60 !== t) + ? e.call(this, t) + : this.finishOp(i.types.relational, 1) + } + }), + e.extend("jsx_readToken", function(e) { + return function() { + return this.state.inType + ? void 0 + : e.call(this) + } + }), + e.extend("toAssignable", function(e) { + return function(r) { + return "TypeCastExpression" === r.type + ? t(r) + : e.apply(this, arguments) + } + }), + e.extend("toAssignableList", function(e) { + return function(r, n) { + for (var i = 0; i < r.length; i++) { + var s = r[i] + s && + "TypeCastExpression" === s.type && + (r[i] = t(s)) + } + return e.call(this, r, n) + } + }), + e.extend("toReferencedList", function() { + return function(e) { + for (var t = 0; t < e.length; t++) { + var r = e[t] + r && + r._exprListItem && + "TypeCastExpression" === r.type && + this.raise( + r.start, + "Unexpected type cast" + ) + } + return e + } + }), + e.extend("parseExprListItem", function(e) { + return function(t, r) { + var n = this.startNode(), + s = e.call(this, t, r) + return this.match(i.types.colon) + ? ((n._exprListItem = !0), + (n.expression = s), + (n.typeAnnotation = this.flowParseTypeAnnotation()), + this.finishNode( + n, + "TypeCastExpression" + )) + : s + } + }), + e.extend("checkLVal", function(e) { + return function(t) { + return "TypeCastExpression" !== t.type + ? e.apply(this, arguments) + : void 0 + } + }), + e.extend("parseClassProperty", function(e) { + return function(t) { + return ( + this.match(i.types.colon) && + (t.typeAnnotation = this.flowParseTypeAnnotation()), + e.call(this, t) + ) + } + }), + e.extend("isClassProperty", function(e) { + return function() { + return ( + this.match(i.types.colon) || + e.call(this) + ) + } + }), + e.extend("parseClassMethod", function() { + return function(e, t, r, n) { + this.isRelational("<") && + (t.typeParameters = this.flowParseTypeParameterDeclaration()), + this.parseMethod(t, r, n), + e.body.push( + this.finishNode(t, "ClassMethod") + ) + } + }), + e.extend("parseClassSuper", function(e) { + return function(t, r) { + if ( + (e.call(this, t, r), + t.superClass && + this.isRelational("<") && + (t.superTypeParameters = this.flowParseTypeParameterInstantiation()), + this.isContextual("implements")) + ) { + this.next() + var n = (t["implements"] = []) + do { + var s = this.startNode() + ;(s.id = this.parseIdentifier()), + this.isRelational("<") + ? (s.typeParameters = this.flowParseTypeParameterInstantiation()) + : (s.typeParameters = null), + n.push( + this.finishNode( + s, + "ClassImplements" + ) + ) + } while (this.eat(i.types.comma)) + } + } + }), + e.extend("parseObjPropValue", function(e) { + return function(t) { + var r = void 0 + this.isRelational("<") && + ((r = this.flowParseTypeParameterDeclaration()), + this.match(i.types.parenL) || + this.unexpected()), + e.apply(this, arguments), + r && ((t.value || t).typeParameters = r) + } + }), + e.extend( + "parseAssignableListItemTypes", + function() { + return function(e) { + return ( + this.eat(i.types.question) && + (e.optional = !0), + this.match(i.types.colon) && + (e.typeAnnotation = this.flowParseTypeAnnotation()), + this.finishNode(e, e.type), + e + ) + } + } + ), + e.extend("parseImportSpecifiers", function(e) { + return function(t) { + t.importKind = "value" + var r = null + if ( + (this.match(i.types._typeof) + ? (r = "typeof") + : this.isContextual("type") && + (r = "type"), + r) + ) { + var n = this.lookahead() + ;((n.type === i.types.name && + "from" !== n.value) || + n.type === i.types.braceL || + n.type === i.types.star) && + (this.next(), (t.importKind = r)) + } + e.call(this, t) + } + }), + e.extend("parseFunctionParams", function(e) { + return function(t) { + this.isRelational("<") && + (t.typeParameters = this.flowParseTypeParameterDeclaration()), + e.call(this, t) + } + }), + e.extend("parseVarHead", function(e) { + return function(t) { + e.call(this, t), + this.match(i.types.colon) && + ((t.id.typeAnnotation = this.flowParseTypeAnnotation()), + this.finishNode(t.id, t.id.type)) + } + }), + e.extend( + "parseAsyncArrowFromCallExpression", + function(e) { + return function(t, r) { + return ( + this.match(i.types.colon) && + (t.returnType = this.flowParseTypeAnnotation()), + e.call(this, t, r) + ) + } + } + ), + e.extend("shouldParseAsyncArrow", function(e) { + return function() { + return ( + this.match(i.types.colon) || + e.call(this) + ) + } + }), + e.extend( + "parseParenAndDistinguishExpression", + function(e) { + return function(t, r, n, s) { + if ( + ((t = t || this.state.start), + (r = r || this.state.startLoc), + n && + this.lookahead().type === + i.types.parenR) + ) { + this.expect(i.types.parenL), + this.expect(i.types.parenR) + var a = this.startNodeAt(t, r) + return ( + this.match(i.types.colon) && + (a.returnType = this.flowParseTypeAnnotation()), + this.expect(i.types.arrow), + this.parseArrowExpression( + a, + [], + s + ) + ) + } + var a = e.call( + this, + t, + r, + n, + s, + this.hasPlugin( + "trailingFunctionCommas" + ) + ) + if (!this.match(i.types.colon)) return a + var o = this.state.clone() + try { + return this.parseParenItem( + a, + t, + r, + !0 + ) + } catch (u) { + if (u instanceof SyntaxError) + return (this.state = o), a + throw u + } + } + } + ) + }), + (t.exports = r["default"]) + }, + { 17: 17, 25: 25, 5: 5 } + ], + 12: [ + function(e, t, r) { + "use strict" + function n(e) { + return "JSXIdentifier" === e.type + ? e.name + : "JSXNamespacedName" === e.type + ? e.namespace.name + ":" + e.name.name + : "JSXMemberExpression" === e.type + ? n(e.object) + "." + n(e.property) + : void 0 + } + var i = e(25)["default"] + r.__esModule = !0 + var s = e(13), + a = i(s), + o = e(17), + u = e(14), + l = e(5), + c = i(l), + p = e(18), + f = e(20), + h = /^[\da-fA-F]+$/, + d = /^\d+$/ + ;(u.types.j_oTag = new u.TokContext("...", + !0, + !0 + )), + (o.types.jsxName = new o.TokenType("jsxName")), + (o.types.jsxText = new o.TokenType("jsxText", { + beforeExpr: !0 + })), + (o.types.jsxTagStart = new o.TokenType("jsxTagStart")), + (o.types.jsxTagEnd = new o.TokenType("jsxTagEnd")), + (o.types.jsxTagStart.updateContext = function() { + this.state.context.push(u.types.j_expr), + this.state.context.push(u.types.j_oTag), + (this.state.exprAllowed = !1) + }), + (o.types.jsxTagEnd.updateContext = function(e) { + var t = this.state.context.pop() + ;(t === u.types.j_oTag && e === o.types.slash) || + t === u.types.j_cTag + ? (this.state.context.pop(), + (this.state.exprAllowed = + this.curContext() === u.types.j_expr)) + : (this.state.exprAllowed = !0) + }) + var m = c["default"].prototype + ;(m.jsxReadToken = function() { + for (var e = "", t = this.state.pos; ; ) { + this.state.pos >= this.input.length && + this.raise( + this.state.start, + "Unterminated JSX contents" + ) + var r = this.input.charCodeAt(this.state.pos) + switch (r) { + case 60: + case 123: + return this.state.pos === this.state.start + ? 60 === r && this.state.exprAllowed + ? (++this.state.pos, + this.finishToken(o.types.jsxTagStart)) + : this.getTokenFromCode(r) + : ((e += this.input.slice( + t, + this.state.pos + )), + this.finishToken(o.types.jsxText, e)) + case 38: + ;(e += this.input.slice(t, this.state.pos)), + (e += this.jsxReadEntity()), + (t = this.state.pos) + break + default: + f.isNewLine(r) + ? ((e += this.input.slice( + t, + this.state.pos + )), + (e += this.jsxReadNewLine(!0)), + (t = this.state.pos)) + : ++this.state.pos + } + } + }), + (m.jsxReadNewLine = function(e) { + var t = this.input.charCodeAt(this.state.pos), + r = void 0 + return ( + ++this.state.pos, + 13 === t && + 10 === this.input.charCodeAt(this.state.pos) + ? (++this.state.pos, (r = e ? "\n" : "\r\n")) + : (r = String.fromCharCode(t)), + ++this.state.curLine, + (this.state.lineStart = this.state.pos), + r + ) + }), + (m.jsxReadString = function(e) { + for (var t = "", r = ++this.state.pos; ; ) { + this.state.pos >= this.input.length && + this.raise( + this.state.start, + "Unterminated string constant" + ) + var n = this.input.charCodeAt(this.state.pos) + if (n === e) break + 38 === n + ? ((t += this.input.slice(r, this.state.pos)), + (t += this.jsxReadEntity()), + (r = this.state.pos)) + : f.isNewLine(n) + ? ((t += this.input.slice(r, this.state.pos)), + (t += this.jsxReadNewLine(!1)), + (r = this.state.pos)) + : ++this.state.pos + } + return ( + (t += this.input.slice(r, this.state.pos++)), + this.finishToken(o.types.string, t) + ) + }), + (m.jsxReadEntity = function() { + for ( + var e = "", + t = 0, + r = void 0, + n = this.input[this.state.pos], + i = ++this.state.pos; + this.state.pos < this.input.length && t++ < 10; + + ) { + if ( + ((n = this.input[this.state.pos++]), ";" === n) + ) { + "#" === e[0] + ? "x" === e[1] + ? ((e = e.substr(2)), + h.test(e) && + (r = String.fromCharCode( + parseInt(e, 16) + ))) + : ((e = e.substr(1)), + d.test(e) && + (r = String.fromCharCode( + parseInt(e, 10) + ))) + : (r = a["default"][e]) + break + } + e += n + } + return r ? r : ((this.state.pos = i), "&") + }), + (m.jsxReadWord = function() { + var e = void 0, + t = this.state.pos + do e = this.input.charCodeAt(++this.state.pos) + while (p.isIdentifierChar(e) || 45 === e) + return this.finishToken( + o.types.jsxName, + this.input.slice(t, this.state.pos) + ) + }), + (m.jsxParseIdentifier = function() { + var e = this.startNode() + return ( + this.match(o.types.jsxName) + ? (e.name = this.state.value) + : this.state.type.keyword + ? (e.name = this.state.type.keyword) + : this.unexpected(), + this.next(), + this.finishNode(e, "JSXIdentifier") + ) + }), + (m.jsxParseNamespacedName = function() { + var e = this.state.start, + t = this.state.startLoc, + r = this.jsxParseIdentifier() + if (!this.eat(o.types.colon)) return r + var n = this.startNodeAt(e, t) + return ( + (n.namespace = r), + (n.name = this.jsxParseIdentifier()), + this.finishNode(n, "JSXNamespacedName") + ) + }), + (m.jsxParseElementName = function() { + for ( + var e = this.state.start, + t = this.state.startLoc, + r = this.jsxParseNamespacedName(); + this.eat(o.types.dot); + + ) { + var n = this.startNodeAt(e, t) + ;(n.object = r), + (n.property = this.jsxParseIdentifier()), + (r = this.finishNode(n, "JSXMemberExpression")) + } + return r + }), + (m.jsxParseAttributeValue = function() { + var e = void 0 + switch (this.state.type) { + case o.types.braceL: + if ( + ((e = this.jsxParseExpressionContainer()), + "JSXEmptyExpression" !== e.expression.type) + ) + return e + this.raise( + e.start, + "JSX attributes must only be assigned a non-empty expression" + ) + case o.types.jsxTagStart: + case o.types.string: + return ( + (e = this.parseExprAtom()), + (e.extra = null), + e + ) + default: + this.raise( + this.state.start, + "JSX value should be either an expression or a quoted JSX text" + ) + } + }), + (m.jsxParseEmptyExpression = function() { + var e = this.startNodeAt( + this.lastTokEnd, + this.lastTokEndLoc + ) + return this.finishNodeAt( + e, + "JSXEmptyExpression", + this.start, + this.startLoc + ) + }), + (m.jsxParseExpressionContainer = function() { + var e = this.startNode() + return ( + this.next(), + this.match(o.types.braceR) + ? (e.expression = this.jsxParseEmptyExpression()) + : (e.expression = this.parseExpression()), + this.expect(o.types.braceR), + this.finishNode(e, "JSXExpressionContainer") + ) + }), + (m.jsxParseAttribute = function() { + var e = this.startNode() + return this.eat(o.types.braceL) + ? (this.expect(o.types.ellipsis), + (e.argument = this.parseMaybeAssign()), + this.expect(o.types.braceR), + this.finishNode(e, "JSXSpreadAttribute")) + : ((e.name = this.jsxParseNamespacedName()), + (e.value = this.eat(o.types.eq) + ? this.jsxParseAttributeValue() + : null), + this.finishNode(e, "JSXAttribute")) + }), + (m.jsxParseOpeningElementAt = function(e, t) { + var r = this.startNodeAt(e, t) + for ( + r.attributes = [], + r.name = this.jsxParseElementName(); + !this.match(o.types.slash) && + !this.match(o.types.jsxTagEnd); + + ) + r.attributes.push(this.jsxParseAttribute()) + return ( + (r.selfClosing = this.eat(o.types.slash)), + this.expect(o.types.jsxTagEnd), + this.finishNode(r, "JSXOpeningElement") + ) + }), + (m.jsxParseClosingElementAt = function(e, t) { + var r = this.startNodeAt(e, t) + return ( + (r.name = this.jsxParseElementName()), + this.expect(o.types.jsxTagEnd), + this.finishNode(r, "JSXClosingElement") + ) + }), + (m.jsxParseElementAt = function(e, t) { + var r = this.startNodeAt(e, t), + i = [], + s = this.jsxParseOpeningElementAt(e, t), + a = null + if (!s.selfClosing) { + e: for (;;) + switch (this.state.type) { + case o.types.jsxTagStart: + if ( + ((e = this.state.start), + (t = this.state.startLoc), + this.next(), + this.eat(o.types.slash)) + ) { + a = this.jsxParseClosingElementAt( + e, + t + ) + break e + } + i.push(this.jsxParseElementAt(e, t)) + break + case o.types.jsxText: + i.push(this.parseExprAtom()) + break + case o.types.braceL: + i.push( + this.jsxParseExpressionContainer() + ) + break + default: + this.unexpected() + } + n(a.name) !== n(s.name) && + this.raise( + a.start, + "Expected corresponding JSX closing tag for <" + + n(s.name) + + ">" + ) + } + return ( + (r.openingElement = s), + (r.closingElement = a), + (r.children = i), + this.match(o.types.relational) && + "<" === this.state.value && + this.raise( + this.state.start, + "Adjacent JSX elements must be wrapped in an enclosing tag" + ), + this.finishNode(r, "JSXElement") + ) + }), + (m.jsxParseElement = function() { + var e = this.state.start, + t = this.state.startLoc + return this.next(), this.jsxParseElementAt(e, t) + }), + (r["default"] = function(e) { + e.extend("parseExprAtom", function(e) { + return function(t) { + if (this.match(o.types.jsxText)) { + var r = this.parseLiteral( + this.state.value, + "JSXText" + ) + return (r.extra = null), r + } + return this.match(o.types.jsxTagStart) + ? this.jsxParseElement() + : e.call(this, t) + } + }), + e.extend("readToken", function(e) { + return function(t) { + var r = this.curContext() + if (r === u.types.j_expr) + return this.jsxReadToken() + if ( + r === u.types.j_oTag || + r === u.types.j_cTag + ) { + if (p.isIdentifierStart(t)) + return this.jsxReadWord() + if (62 === t) + return ( + ++this.state.pos, + this.finishToken( + o.types.jsxTagEnd + ) + ) + if ( + (34 === t || 39 === t) && + r === u.types.j_oTag + ) + return this.jsxReadString(t) + } + return 60 === t && this.state.exprAllowed + ? (++this.state.pos, + this.finishToken(o.types.jsxTagStart)) + : e.call(this, t) + } + }), + e.extend("updateContext", function(e) { + return function(t) { + if (this.match(o.types.braceL)) { + var r = this.curContext() + r === u.types.j_oTag + ? this.state.context.push( + u.types.b_expr + ) + : r === u.types.j_expr + ? this.state.context.push( + u.types.b_tmpl + ) + : e.call(this, t), + (this.state.exprAllowed = !0) + } else { + if ( + !this.match(o.types.slash) || + t !== o.types.jsxTagStart + ) + return e.call(this, t) + ;(this.state.context.length -= 2), + this.state.context.push( + u.types.j_cTag + ), + (this.state.exprAllowed = !1) + } + } + }) + }), + (t.exports = r["default"]) + }, + { 13: 13, 14: 14, 17: 17, 18: 18, 20: 20, 25: 25, 5: 5 } + ], + 13: [ + function(e, t, r) { + "use strict" + ;(r.__esModule = !0), + (r["default"] = { + quot: '"', + amp: "&", + apos: "'", + lt: "<", + gt: ">", + nbsp: " ", + iexcl: "¡", + cent: "¢", + pound: "£", + curren: "¤", + yen: "¥", + brvbar: "¦", + sect: "§", + uml: "¨", + copy: "©", + ordf: "ª", + laquo: "«", + not: "¬", + shy: "­", + reg: "®", + macr: "¯", + deg: "°", + plusmn: "±", + sup2: "²", + sup3: "³", + acute: "´", + micro: "µ", + para: "¶", + middot: "·", + cedil: "¸", + sup1: "¹", + ordm: "º", + raquo: "»", + frac14: "¼", + frac12: "½", + frac34: "¾", + iquest: "¿", + Agrave: "À", + Aacute: "Á", + Acirc: "Â", + Atilde: "Ã", + Auml: "Ä", + Aring: "Å", + AElig: "Æ", + Ccedil: "Ç", + Egrave: "È", + Eacute: "É", + Ecirc: "Ê", + Euml: "Ë", + Igrave: "Ì", + Iacute: "Í", + Icirc: "Î", + Iuml: "Ï", + ETH: "Ð", + Ntilde: "Ñ", + Ograve: "Ò", + Oacute: "Ó", + Ocirc: "Ô", + Otilde: "Õ", + Ouml: "Ö", + times: "×", + Oslash: "Ø", + Ugrave: "Ù", + Uacute: "Ú", + Ucirc: "Û", + Uuml: "Ü", + Yacute: "Ý", + THORN: "Þ", + szlig: "ß", + agrave: "à", + aacute: "á", + acirc: "â", + atilde: "ã", + auml: "ä", + aring: "å", + aelig: "æ", + ccedil: "ç", + egrave: "è", + eacute: "é", + ecirc: "ê", + euml: "ë", + igrave: "ì", + iacute: "í", + icirc: "î", + iuml: "ï", + eth: "ð", + ntilde: "ñ", + ograve: "ò", + oacute: "ó", + ocirc: "ô", + otilde: "õ", + ouml: "ö", + divide: "÷", + oslash: "ø", + ugrave: "ù", + uacute: "ú", + ucirc: "û", + uuml: "ü", + yacute: "ý", + thorn: "þ", + yuml: "ÿ", + OElig: "Œ", + oelig: "œ", + Scaron: "Š", + scaron: "š", + Yuml: "Ÿ", + fnof: "ƒ", + circ: "ˆ", + tilde: "˜", + Alpha: "Α", + Beta: "Β", + Gamma: "Γ", + Delta: "Δ", + Epsilon: "Ε", + Zeta: "Ζ", + Eta: "Η", + Theta: "Θ", + Iota: "Ι", + Kappa: "Κ", + Lambda: "Λ", + Mu: "Μ", + Nu: "Ν", + Xi: "Ξ", + Omicron: "Ο", + Pi: "Π", + Rho: "Ρ", + Sigma: "Σ", + Tau: "Τ", + Upsilon: "Υ", + Phi: "Φ", + Chi: "Χ", + Psi: "Ψ", + Omega: "Ω", + alpha: "α", + beta: "β", + gamma: "γ", + delta: "δ", + epsilon: "ε", + zeta: "ζ", + eta: "η", + theta: "θ", + iota: "ι", + kappa: "κ", + lambda: "λ", + mu: "μ", + nu: "ν", + xi: "ξ", + omicron: "ο", + pi: "π", + rho: "ρ", + sigmaf: "ς", + sigma: "σ", + tau: "τ", + upsilon: "υ", + phi: "φ", + chi: "χ", + psi: "ψ", + omega: "ω", + thetasym: "ϑ", + upsih: "ϒ", + piv: "ϖ", + ensp: " ", + emsp: " ", + thinsp: " ", + zwnj: "‌", + zwj: "‍", + lrm: "‎", + rlm: "‏", + ndash: "–", + mdash: "—", + lsquo: "‘", + rsquo: "’", + sbquo: "‚", + ldquo: "“", + rdquo: "”", + bdquo: "„", + dagger: "†", + Dagger: "‡", + bull: "•", + hellip: "…", + permil: "‰", + prime: "′", + Prime: "″", + lsaquo: "‹", + rsaquo: "›", + oline: "‾", + frasl: "⁄", + euro: "€", + image: "ℑ", + weierp: "℘", + real: "ℜ", + trade: "™", + alefsym: "ℵ", + larr: "←", + uarr: "↑", + rarr: "→", + darr: "↓", + harr: "↔", + crarr: "↵", + lArr: "⇐", + uArr: "⇑", + rArr: "⇒", + dArr: "⇓", + hArr: "⇔", + forall: "∀", + part: "∂", + exist: "∃", + empty: "∅", + nabla: "∇", + isin: "∈", + notin: "∉", + ni: "∋", + prod: "∏", + sum: "∑", + minus: "−", + lowast: "∗", + radic: "√", + prop: "∝", + infin: "∞", + ang: "∠", + and: "∧", + or: "∨", + cap: "∩", + cup: "∪", + int: "∫", + there4: "∴", + sim: "∼", + cong: "≅", + asymp: "≈", + ne: "≠", + equiv: "≡", + le: "≤", + ge: "≥", + sub: "⊂", + sup: "⊃", + nsub: "⊄", + sube: "⊆", + supe: "⊇", + oplus: "⊕", + otimes: "⊗", + perp: "⊥", + sdot: "⋅", + lceil: "⌈", + rceil: "⌉", + lfloor: "⌊", + rfloor: "⌋", + lang: "〈", + rang: "〉", + loz: "◊", + spades: "♠", + clubs: "♣", + hearts: "♥", + diams: "♦" + }), + (t.exports = r["default"]) + }, + {} + ], + 14: [ + function(e, t, r) { + "use strict" + var n = e(23)["default"] + r.__esModule = !0 + var i = e(17), + s = e(20), + a = function u(e, t, r, i) { + n(this, u), + (this.token = e), + (this.isExpr = !!t), + (this.preserveSpace = !!r), + (this.override = i) + } + r.TokContext = a + var o = { + b_stat: new a("{", !1), + b_expr: new a("{", !0), + b_tmpl: new a("${", !0), + p_stat: new a("(", !1), + p_expr: new a("(", !0), + q_tmpl: new a("`", !0, !0, function(e) { + return e.readTmplToken() + }), + f_expr: new a("function", !0) + } + ;(r.types = o), + (i.types.parenR.updateContext = i.types.braceR.updateContext = function() { + if (1 === this.state.context.length) + return void (this.state.exprAllowed = !0) + var e = this.state.context.pop() + e === o.b_stat && this.curContext() === o.f_expr + ? (this.state.context.pop(), + (this.state.exprAllowed = !1)) + : e === o.b_tmpl + ? (this.state.exprAllowed = !0) + : (this.state.exprAllowed = !e.isExpr) + }), + (i.types.name.updateContext = function(e) { + ;(this.state.exprAllowed = !1), + (e !== i.types._let && + e !== i.types._const && + e !== i.types._var) || + (s.lineBreak.test( + this.input.slice(this.state.end) + ) && + (this.state.exprAllowed = !0)) + }), + (i.types.braceL.updateContext = function(e) { + this.state.context.push( + this.braceIsBlock(e) ? o.b_stat : o.b_expr + ), + (this.state.exprAllowed = !0) + }), + (i.types.dollarBraceL.updateContext = function() { + this.state.context.push(o.b_tmpl), + (this.state.exprAllowed = !0) + }), + (i.types.parenL.updateContext = function(e) { + var t = + e === i.types._if || + e === i.types._for || + e === i.types._with || + e === i.types._while + this.state.context.push(t ? o.p_stat : o.p_expr), + (this.state.exprAllowed = !0) + }), + (i.types.incDec.updateContext = function() {}), + (i.types._function.updateContext = function() { + this.curContext() !== o.b_stat && + this.state.context.push(o.f_expr), + (this.state.exprAllowed = !1) + }), + (i.types.backQuote.updateContext = function() { + this.curContext() === o.q_tmpl + ? this.state.context.pop() + : this.state.context.push(o.q_tmpl), + (this.state.exprAllowed = !1) + }) + }, + { 17: 17, 20: 20, 23: 23 } + ], + 15: [ + function(e, t, r) { + "use strict" + function n(e) { + return 65535 >= e + ? String.fromCharCode(e) + : String.fromCharCode( + ((e - 65536) >> 10) + 55296, + ((e - 65536) & 1023) + 56320 + ) + } + var i = e(23)["default"], + s = e(25)["default"] + r.__esModule = !0 + var a = e(18), + o = e(17), + u = e(14), + l = e(19), + c = e(20), + p = e(16), + f = s(p), + h = function m(e) { + i(this, m), + (this.type = e.type), + (this.value = e.value), + (this.start = e.start), + (this.end = e.end), + (this.loc = new l.SourceLocation( + e.startLoc, + e.endLoc + )) + } + r.Token = h + var d = (function() { + function e(t, r) { + i(this, e), + (this.state = new f["default"]()), + this.state.init(t, r) + } + return ( + (e.prototype.next = function() { + this.isLookahead || + this.state.tokens.push(new h(this.state)), + (this.state.lastTokEnd = this.state.end), + (this.state.lastTokStart = this.state.start), + (this.state.lastTokEndLoc = this.state.endLoc), + (this.state.lastTokStartLoc = this.state.startLoc), + this.nextToken() + }), + (e.prototype.eat = function(e) { + return this.match(e) ? (this.next(), !0) : !1 + }), + (e.prototype.match = function(e) { + return this.state.type === e + }), + (e.prototype.isKeyword = function(e) { + return a.isKeyword(e) + }), + (e.prototype.lookahead = function() { + var e = this.state + ;(this.state = e.clone(!0)), + (this.isLookahead = !0), + this.next(), + (this.isLookahead = !1) + var t = this.state.clone(!0) + return (this.state = e), t + }), + (e.prototype.setStrict = function(e) { + if ( + ((this.state.strict = e), + this.match(o.types.num) || + this.match(o.types.string)) + ) { + for ( + this.state.pos = this.state.start; + this.state.pos < this.state.lineStart; + + ) + (this.state.lineStart = + this.input.lastIndexOf( + "\n", + this.state.lineStart - 2 + ) + 1), + --this.state.curLine + this.nextToken() + } + }), + (e.prototype.curContext = function() { + return this.state.context[ + this.state.context.length - 1 + ] + }), + (e.prototype.nextToken = function() { + var e = this.curContext() + return ( + (e && e.preserveSpace) || this.skipSpace(), + (this.state.containsOctal = !1), + (this.state.octalPosition = null), + (this.state.start = this.state.pos), + (this.state.startLoc = this.state.curPosition()), + this.state.pos >= this.input.length + ? this.finishToken(o.types.eof) + : e.override + ? e.override(this) + : this.readToken(this.fullCharCodeAtPos()) + ) + }), + (e.prototype.readToken = function(e) { + return a.isIdentifierStart(e) || 92 === e + ? this.readWord() + : this.getTokenFromCode(e) + }), + (e.prototype.fullCharCodeAtPos = function() { + var e = this.input.charCodeAt(this.state.pos) + if (55295 >= e || e >= 57344) return e + var t = this.input.charCodeAt(this.state.pos + 1) + return (e << 10) + t - 56613888 + }), + (e.prototype.pushComment = function(e, t, r, n, i, s) { + var a = { + type: e ? "CommentBlock" : "CommentLine", + value: t, + start: r, + end: n, + loc: new l.SourceLocation(i, s) + } + this.isLookahead || + (this.state.tokens.push(a), + this.state.comments.push(a)), + this.addComment(a) + }), + (e.prototype.skipBlockComment = function() { + var e = this.state.curPosition(), + t = this.state.pos, + r = this.input.indexOf( + "*/", + (this.state.pos += 2) + ) + ;-1 === r && + this.raise( + this.state.pos - 2, + "Unterminated comment" + ), + (this.state.pos = r + 2), + (c.lineBreakG.lastIndex = t) + for ( + var n = void 0; + (n = c.lineBreakG.exec(this.input)) && + n.index < this.state.pos; + + ) + ++this.state.curLine, + (this.state.lineStart = + n.index + n[0].length) + this.pushComment( + !0, + this.input.slice(t + 2, r), + t, + this.state.pos, + e, + this.state.curPosition() + ) + }), + (e.prototype.skipLineComment = function(e) { + for ( + var t = this.state.pos, + r = this.state.curPosition(), + n = this.input.charCodeAt( + (this.state.pos += e) + ); + this.state.pos < this.input.length && + 10 !== n && + 13 !== n && + 8232 !== n && + 8233 !== n; + + ) + ++this.state.pos, + (n = this.input.charCodeAt(this.state.pos)) + this.pushComment( + !1, + this.input.slice(t + e, this.state.pos), + t, + this.state.pos, + r, + this.state.curPosition() + ) + }), + (e.prototype.skipSpace = function() { + e: for (; this.state.pos < this.input.length; ) { + var e = this.input.charCodeAt(this.state.pos) + switch (e) { + case 32: + case 160: + ++this.state.pos + break + case 13: + 10 === + this.input.charCodeAt( + this.state.pos + 1 + ) && ++this.state.pos + case 10: + case 8232: + case 8233: + ++this.state.pos, + ++this.state.curLine, + (this.state.lineStart = this.state.pos) + break + case 47: + switch ( + this.input.charCodeAt( + this.state.pos + 1 + ) + ) { + case 42: + this.skipBlockComment() + break + case 47: + this.skipLineComment(2) + break + default: + break e + } + break + default: + if ( + !( + (e > 8 && 14 > e) || + (e >= 5760 && + c.nonASCIIwhitespace.test( + String.fromCharCode(e) + )) + ) + ) + break e + ++this.state.pos + } + } + }), + (e.prototype.finishToken = function(e, t) { + ;(this.state.end = this.state.pos), + (this.state.endLoc = this.state.curPosition()) + var r = this.state.type + ;(this.state.type = e), + (this.state.value = t), + this.updateContext(r) + }), + (e.prototype.readToken_dot = function() { + var e = this.input.charCodeAt(this.state.pos + 1) + if (e >= 48 && 57 >= e) return this.readNumber(!0) + var t = this.input.charCodeAt(this.state.pos + 2) + return 46 === e && 46 === t + ? ((this.state.pos += 3), + this.finishToken(o.types.ellipsis)) + : (++this.state.pos, + this.finishToken(o.types.dot)) + }), + (e.prototype.readToken_slash = function() { + if (this.state.exprAllowed) + return ++this.state.pos, this.readRegexp() + var e = this.input.charCodeAt(this.state.pos + 1) + return 61 === e + ? this.finishOp(o.types.assign, 2) + : this.finishOp(o.types.slash, 1) + }), + (e.prototype.readToken_mult_modulo = function(e) { + var t = 42 === e ? o.types.star : o.types.modulo, + r = 1, + n = this.input.charCodeAt(this.state.pos + 1) + return ( + 42 === n && + this.hasPlugin("exponentiationOperator") && + (r++, + (n = this.input.charCodeAt( + this.state.pos + 2 + )), + (t = o.types.exponent)), + 61 === n && (r++, (t = o.types.assign)), + this.finishOp(t, r) + ) + }), + (e.prototype.readToken_pipe_amp = function(e) { + var t = this.input.charCodeAt(this.state.pos + 1) + return t === e + ? this.finishOp( + 124 === e + ? o.types.logicalOR + : o.types.logicalAND, + 2 + ) + : 61 === t + ? this.finishOp(o.types.assign, 2) + : this.finishOp( + 124 === e + ? o.types.bitwiseOR + : o.types.bitwiseAND, + 1 + ) + }), + (e.prototype.readToken_caret = function() { + var e = this.input.charCodeAt(this.state.pos + 1) + return 61 === e + ? this.finishOp(o.types.assign, 2) + : this.finishOp(o.types.bitwiseXOR, 1) + }), + (e.prototype.readToken_plus_min = function(e) { + var t = this.input.charCodeAt(this.state.pos + 1) + return t === e + ? 45 === t && + 62 === + this.input.charCodeAt( + this.state.pos + 2 + ) && + c.lineBreak.test( + this.input.slice( + this.state.lastTokEnd, + this.state.pos + ) + ) + ? (this.skipLineComment(3), + this.skipSpace(), + this.nextToken()) + : this.finishOp(o.types.incDec, 2) + : 61 === t + ? this.finishOp(o.types.assign, 2) + : this.finishOp(o.types.plusMin, 1) + }), + (e.prototype.readToken_lt_gt = function(e) { + var t = this.input.charCodeAt(this.state.pos + 1), + r = 1 + return t === e + ? ((r = + 62 === e && + 62 === + this.input.charCodeAt( + this.state.pos + 2 + ) + ? 3 + : 2), + 61 === + this.input.charCodeAt(this.state.pos + r) + ? this.finishOp(o.types.assign, r + 1) + : this.finishOp(o.types.bitShift, r)) + : 33 === t && + 60 === e && + 45 === + this.input.charCodeAt( + this.state.pos + 2 + ) && + 45 === + this.input.charCodeAt(this.state.pos + 3) + ? (this.inModule && this.unexpected(), + this.skipLineComment(4), + this.skipSpace(), + this.nextToken()) + : (61 === t && (r = 2), + this.finishOp(o.types.relational, r)) + }), + (e.prototype.readToken_eq_excl = function(e) { + var t = this.input.charCodeAt(this.state.pos + 1) + return 61 === t + ? this.finishOp( + o.types.equality, + 61 === + this.input.charCodeAt( + this.state.pos + 2 + ) + ? 3 + : 2 + ) + : 61 === e && 62 === t + ? ((this.state.pos += 2), + this.finishToken(o.types.arrow)) + : this.finishOp( + 61 === e ? o.types.eq : o.types.prefix, + 1 + ) + }), + (e.prototype.getTokenFromCode = function(e) { + switch (e) { + case 46: + return this.readToken_dot() + case 40: + return ( + ++this.state.pos, + this.finishToken(o.types.parenL) + ) + case 41: + return ( + ++this.state.pos, + this.finishToken(o.types.parenR) + ) + case 59: + return ( + ++this.state.pos, + this.finishToken(o.types.semi) + ) + case 44: + return ( + ++this.state.pos, + this.finishToken(o.types.comma) + ) + case 91: + return ( + ++this.state.pos, + this.finishToken(o.types.bracketL) + ) + case 93: + return ( + ++this.state.pos, + this.finishToken(o.types.bracketR) + ) + case 123: + return ( + ++this.state.pos, + this.finishToken(o.types.braceL) + ) + case 125: + return ( + ++this.state.pos, + this.finishToken(o.types.braceR) + ) + case 58: + return this.hasPlugin("functionBind") && + 58 === + this.input.charCodeAt( + this.state.pos + 1 + ) + ? this.finishOp(o.types.doubleColon, 2) + : (++this.state.pos, + this.finishToken(o.types.colon)) + case 63: + return ( + ++this.state.pos, + this.finishToken(o.types.question) + ) + case 64: + return ( + ++this.state.pos, + this.finishToken(o.types.at) + ) + case 96: + return ( + ++this.state.pos, + this.finishToken(o.types.backQuote) + ) + case 48: + var t = this.input.charCodeAt( + this.state.pos + 1 + ) + if (120 === t || 88 === t) + return this.readRadixNumber(16) + if (111 === t || 79 === t) + return this.readRadixNumber(8) + if (98 === t || 66 === t) + return this.readRadixNumber(2) + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + return this.readNumber(!1) + case 34: + case 39: + return this.readString(e) + case 47: + return this.readToken_slash() + case 37: + case 42: + return this.readToken_mult_modulo(e) + case 124: + case 38: + return this.readToken_pipe_amp(e) + case 94: + return this.readToken_caret() + case 43: + case 45: + return this.readToken_plus_min(e) + case 60: + case 62: + return this.readToken_lt_gt(e) + case 61: + case 33: + return this.readToken_eq_excl(e) + case 126: + return this.finishOp(o.types.prefix, 1) + } + this.raise( + this.state.pos, + "Unexpected character '" + n(e) + "'" + ) + }), + (e.prototype.finishOp = function(e, t) { + var r = this.input.slice( + this.state.pos, + this.state.pos + t + ) + return (this.state.pos += t), this.finishToken(e, r) + }), + (e.prototype.readRegexp = function() { + for ( + var e = void 0, t = void 0, r = this.state.pos; + ; + + ) { + this.state.pos >= this.input.length && + this.raise( + r, + "Unterminated regular expression" + ) + var n = this.input.charAt(this.state.pos) + if ( + (c.lineBreak.test(n) && + this.raise( + r, + "Unterminated regular expression" + ), + e) + ) + e = !1 + else { + if ("[" === n) t = !0 + else if ("]" === n && t) t = !1 + else if ("/" === n && !t) break + e = "\\" === n + } + ++this.state.pos + } + var i = this.input.slice(r, this.state.pos) + ++this.state.pos + var s = this.readWord1() + if (s) { + var a = /^[gmsiyu]*$/ + a.test(s) || + this.raise( + r, + "Invalid regular expression flag" + ) + } + return this.finishToken(o.types.regexp, { + pattern: i, + flags: s + }) + }), + (e.prototype.readInt = function(e, t) { + for ( + var r = this.state.pos, + n = 0, + i = 0, + s = null == t ? 1 / 0 : t; + s > i; + ++i + ) { + var a = this.input.charCodeAt(this.state.pos), + o = void 0 + if ( + ((o = + a >= 97 + ? a - 97 + 10 + : a >= 65 + ? a - 65 + 10 + : a >= 48 && 57 >= a + ? a - 48 + : 1 / 0), + o >= e) + ) + break + ++this.state.pos, (n = n * e + o) + } + return this.state.pos === r || + (null != t && this.state.pos - r !== t) + ? null + : n + }), + (e.prototype.readRadixNumber = function(e) { + this.state.pos += 2 + var t = this.readInt(e) + return ( + null == t && + this.raise( + this.state.start + 2, + "Expected number in radix " + e + ), + a.isIdentifierStart(this.fullCharCodeAtPos()) && + this.raise( + this.state.pos, + "Identifier directly after number" + ), + this.finishToken(o.types.num, t) + ) + }), + (e.prototype.readNumber = function(e) { + var t = this.state.pos, + r = !1, + n = 48 === this.input.charCodeAt(this.state.pos) + e || + null !== this.readInt(10) || + this.raise(t, "Invalid number") + var i = this.input.charCodeAt(this.state.pos) + 46 === i && + (++this.state.pos, + this.readInt(10), + (r = !0), + (i = this.input.charCodeAt(this.state.pos))), + (69 !== i && 101 !== i) || + ((i = this.input.charCodeAt( + ++this.state.pos + )), + (43 !== i && 45 !== i) || ++this.state.pos, + null === this.readInt(10) && + this.raise(t, "Invalid number"), + (r = !0)), + a.isIdentifierStart(this.fullCharCodeAtPos()) && + this.raise( + this.state.pos, + "Identifier directly after number" + ) + var s = this.input.slice(t, this.state.pos), + u = void 0 + return ( + r + ? (u = parseFloat(s)) + : n && 1 !== s.length + ? /[89]/.test(s) || this.state.strict + ? this.raise(t, "Invalid number") + : (u = parseInt(s, 8)) + : (u = parseInt(s, 10)), + this.finishToken(o.types.num, u) + ) + }), + (e.prototype.readCodePoint = function() { + var e = this.input.charCodeAt(this.state.pos), + t = void 0 + if (123 === e) { + var r = ++this.state.pos + ;(t = this.readHexChar( + this.input.indexOf("}", this.state.pos) - + this.state.pos + )), + ++this.state.pos, + t > 1114111 && + this.raise( + r, + "Code point out of bounds" + ) + } else t = this.readHexChar(4) + return t + }), + (e.prototype.readString = function(e) { + for (var t = "", r = ++this.state.pos; ; ) { + this.state.pos >= this.input.length && + this.raise( + this.state.start, + "Unterminated string constant" + ) + var n = this.input.charCodeAt(this.state.pos) + if (n === e) break + 92 === n + ? ((t += this.input.slice( + r, + this.state.pos + )), + (t += this.readEscapedChar(!1)), + (r = this.state.pos)) + : (c.isNewLine(n) && + this.raise( + this.state.start, + "Unterminated string constant" + ), + ++this.state.pos) + } + return ( + (t += this.input.slice(r, this.state.pos++)), + this.finishToken(o.types.string, t) + ) + }), + (e.prototype.readTmplToken = function() { + for (var e = "", t = this.state.pos; ; ) { + this.state.pos >= this.input.length && + this.raise( + this.state.start, + "Unterminated template" + ) + var r = this.input.charCodeAt(this.state.pos) + if ( + 96 === r || + (36 === r && + 123 === + this.input.charCodeAt( + this.state.pos + 1 + )) + ) + return this.state.pos === + this.state.start && + this.match(o.types.template) + ? 36 === r + ? ((this.state.pos += 2), + this.finishToken( + o.types.dollarBraceL + )) + : (++this.state.pos, + this.finishToken( + o.types.backQuote + )) + : ((e += this.input.slice( + t, + this.state.pos + )), + this.finishToken(o.types.template, e)) + if (92 === r) + (e += this.input.slice(t, this.state.pos)), + (e += this.readEscapedChar(!0)), + (t = this.state.pos) + else if (c.isNewLine(r)) { + switch ( + ((e += this.input.slice( + t, + this.state.pos + )), + ++this.state.pos, + r) + ) { + case 13: + 10 === + this.input.charCodeAt( + this.state.pos + ) && ++this.state.pos + case 10: + e += "\n" + break + default: + e += String.fromCharCode(r) + } + ++this.state.curLine, + (this.state.lineStart = this.state.pos), + (t = this.state.pos) + } else ++this.state.pos + } + }), + (e.prototype.readEscapedChar = function(e) { + var t = this.input.charCodeAt(++this.state.pos) + switch ((++this.state.pos, t)) { + case 110: + return "\n" + case 114: + return "\r" + case 120: + return String.fromCharCode( + this.readHexChar(2) + ) + case 117: + return n(this.readCodePoint()) + case 116: + return " " + case 98: + return "\b" + case 118: + return "\x0B" + case 102: + return "\f" + case 13: + 10 === + this.input.charCodeAt(this.state.pos) && + ++this.state.pos + case 10: + return ( + (this.state.lineStart = this.state.pos), + ++this.state.curLine, + "" + ) + default: + if (t >= 48 && 55 >= t) { + var r = this.input + .substr(this.state.pos - 1, 3) + .match(/^[0-7]+/)[0], + i = parseInt(r, 8) + return ( + i > 255 && + ((r = r.slice(0, -1)), + (i = parseInt(r, 8))), + i > 0 && + (this.state.containsOctal || + ((this.state.containsOctal = !0), + (this.state.octalPosition = + this.state.pos - 2)), + (this.state.strict || e) && + this.raise( + this.state.pos - 2, + "Octal literal in strict mode" + )), + (this.state.pos += r.length - 1), + String.fromCharCode(i) + ) + } + return String.fromCharCode(t) + } + }), + (e.prototype.readHexChar = function(e) { + var t = this.state.pos, + r = this.readInt(16, e) + return ( + null === r && + this.raise( + t, + "Bad character escape sequence" + ), + r + ) + }), + (e.prototype.readWord1 = function() { + this.state.containsEsc = !1 + for ( + var e = "", t = !0, r = this.state.pos; + this.state.pos < this.input.length; + + ) { + var i = this.fullCharCodeAtPos() + if (a.isIdentifierChar(i)) + this.state.pos += 65535 >= i ? 1 : 2 + else { + if (92 !== i) break + ;(this.state.containsEsc = !0), + (e += this.input.slice( + r, + this.state.pos + )) + var s = this.state.pos + 117 !== + this.input.charCodeAt( + ++this.state.pos + ) && + this.raise( + this.state.pos, + "Expecting Unicode escape sequence \\uXXXX" + ), + ++this.state.pos + var o = this.readCodePoint() + ;(t + ? a.isIdentifierStart + : a.isIdentifierChar)(o, !0) || + this.raise(s, "Invalid Unicode escape"), + (e += n(o)), + (r = this.state.pos) + } + t = !1 + } + return e + this.input.slice(r, this.state.pos) + }), + (e.prototype.readWord = function() { + var e = this.readWord1(), + t = o.types.name + return ( + !this.state.containsEsc && + this.isKeyword(e) && + (t = o.keywords[e]), + this.finishToken(t, e) + ) + }), + (e.prototype.braceIsBlock = function(e) { + if (e === o.types.colon) { + var t = this.curContext() + if ( + t === u.types.b_stat || + t === u.types.b_expr + ) + return !t.isExpr + } + return e === o.types._return + ? c.lineBreak.test( + this.input.slice( + this.state.lastTokEnd, + this.state.start + ) + ) + : e === o.types._else || + e === o.types.semi || + e === o.types.eof || + e === o.types.parenR + ? !0 + : e === o.types.braceL + ? this.curContext() === u.types.b_stat + : !this.state.exprAllowed + }), + (e.prototype.updateContext = function(e) { + var t = void 0, + r = this.state.type + r.keyword && e === o.types.dot + ? (this.state.exprAllowed = !1) + : (t = r.updateContext) + ? t.call(this, e) + : (this.state.exprAllowed = r.beforeExpr) + }), + e + ) + })() + r["default"] = d + }, + { 14: 14, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 23: 23, 25: 25 } + ], + 16: [ + function(e, t, r) { + "use strict" + var n = e(23)["default"] + r.__esModule = !0 + var i = e(19), + s = e(14), + a = e(17), + o = (function() { + function e() { + n(this, e) + } + return ( + (e.prototype.init = function(e, t) { + return ( + (this.strict = + e.strictMode === !1 + ? !1 + : "module" === e.sourceType), + (this.input = t), + (this.potentialArrowAt = -1), + (this.inMethod = this.inFunction = this.inGenerator = this.inAsync = !1), + (this.labels = []), + (this.decorators = []), + (this.tokens = []), + (this.comments = []), + (this.trailingComments = []), + (this.leadingComments = []), + (this.commentStack = []), + (this.pos = this.lineStart = 0), + (this.curLine = 1), + (this.type = a.types.eof), + (this.value = null), + (this.start = this.end = this.pos), + (this.startLoc = this.endLoc = this.curPosition()), + (this.lastTokEndLoc = this.lastTokStartLoc = null), + (this.lastTokStart = this.lastTokEnd = this.pos), + (this.context = [s.types.b_stat]), + (this.exprAllowed = !0), + (this.containsEsc = this.containsOctal = !1), + (this.octalPosition = null), + this + ) + }), + (e.prototype.curPosition = function() { + return new i.Position( + this.curLine, + this.pos - this.lineStart + ) + }), + (e.prototype.clone = function(t) { + var r = new e() + for (var n in this) { + var i = this[n] + ;(t && "context" !== n) || + !Array.isArray(i) || + (i = i.slice()), + (r[n] = i) + } + return r + }), + e + ) + })() + ;(r["default"] = o), (t.exports = r["default"]) + }, + { 14: 14, 17: 17, 19: 19, 23: 23 } + ], + 17: [ + function(e, t, r) { + "use strict" + function n(e, t) { + return new a(e, { beforeExpr: !0, binop: t }) + } + function i(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? {} + : arguments[1] + ;(t.keyword = e), (c[e] = l["_" + e] = new a(e, t)) + } + var s = e(23)["default"] + r.__esModule = !0 + var a = function p(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? {} + : arguments[1] + s(this, p), + (this.label = e), + (this.keyword = t.keyword), + (this.beforeExpr = !!t.beforeExpr), + (this.startsExpr = !!t.startsExpr), + (this.rightAssociative = !!t.rightAssociative), + (this.isLoop = !!t.isLoop), + (this.isAssign = !!t.isAssign), + (this.prefix = !!t.prefix), + (this.postfix = !!t.postfix), + (this.binop = t.binop || null), + (this.updateContext = null) + } + r.TokenType = a + var o = { beforeExpr: !0 }, + u = { startsExpr: !0 }, + l = { + num: new a("num", u), + regexp: new a("regexp", u), + string: new a("string", u), + name: new a("name", u), + eof: new a("eof"), + bracketL: new a("[", { + beforeExpr: !0, + startsExpr: !0 + }), + bracketR: new a("]"), + braceL: new a("{", { beforeExpr: !0, startsExpr: !0 }), + braceR: new a("}"), + parenL: new a("(", { beforeExpr: !0, startsExpr: !0 }), + parenR: new a(")"), + comma: new a(",", o), + semi: new a(";", o), + colon: new a(":", o), + doubleColon: new a("::", o), + dot: new a("."), + question: new a("?", o), + arrow: new a("=>", o), + template: new a("template"), + ellipsis: new a("...", o), + backQuote: new a("`", u), + dollarBraceL: new a("${", { + beforeExpr: !0, + startsExpr: !0 + }), + at: new a("@"), + eq: new a("=", { beforeExpr: !0, isAssign: !0 }), + assign: new a("_=", { beforeExpr: !0, isAssign: !0 }), + incDec: new a("++/--", { + prefix: !0, + postfix: !0, + startsExpr: !0 + }), + prefix: new a("prefix", { + beforeExpr: !0, + prefix: !0, + startsExpr: !0 + }), + logicalOR: n("||", 1), + logicalAND: n("&&", 2), + bitwiseOR: n("|", 3), + bitwiseXOR: n("^", 4), + bitwiseAND: n("&", 5), + equality: n("==/!=", 6), + relational: n("", 7), + bitShift: n("<>", 8), + plusMin: new a("+/-", { + beforeExpr: !0, + binop: 9, + prefix: !0, + startsExpr: !0 + }), + modulo: n("%", 10), + star: n("*", 10), + slash: n("/", 10), + exponent: new a("**", { + beforeExpr: !0, + binop: 11, + rightAssociative: !0 + }) + } + r.types = l + var c = {} + ;(r.keywords = c), + i("break"), + i("case", o), + i("catch"), + i("continue"), + i("debugger"), + i("default", o), + i("do", { isLoop: !0, beforeExpr: !0 }), + i("else", o), + i("finally"), + i("for", { isLoop: !0 }), + i("function", u), + i("if"), + i("return", o), + i("switch"), + i("throw", o), + i("try"), + i("var"), + i("let"), + i("const"), + i("while", { isLoop: !0 }), + i("with"), + i("new", { beforeExpr: !0, startsExpr: !0 }), + i("this", u), + i("super", u), + i("class"), + i("extends", o), + i("export"), + i("import"), + i("yield", { beforeExpr: !0, startsExpr: !0 }), + i("null", u), + i("true", u), + i("false", u), + i("in", { beforeExpr: !0, binop: 7 }), + i("instanceof", { beforeExpr: !0, binop: 7 }), + i("typeof", { beforeExpr: !0, prefix: !0, startsExpr: !0 }), + i("void", { beforeExpr: !0, prefix: !0, startsExpr: !0 }), + i("delete", { beforeExpr: !0, prefix: !0, startsExpr: !0 }) + }, + { 23: 23 } + ], + 18: [ + function(e, t, r) { + "use strict" + function n(e) { + return ( + (e = e.split(" ")), + function(t) { + return e.indexOf(t) >= 0 + } + ) + } + function i(e, t) { + for (var r = 65536, n = 0; n < t.length; n += 2) { + if (((r += t[n]), r > e)) return !1 + if (((r += t[n + 1]), r >= e)) return !0 + } + } + function s(e) { + return 65 > e + ? 36 === e + : 91 > e + ? !0 + : 97 > e + ? 95 === e + : 123 > e + ? !0 + : 65535 >= e + ? e >= 170 && p.test(String.fromCharCode(e)) + : i(e, h) + } + function a(e) { + return 48 > e + ? 36 === e + : 58 > e + ? !0 + : 65 > e + ? !1 + : 91 > e + ? !0 + : 97 > e + ? 95 === e + : 123 > e + ? !0 + : 65535 >= e + ? e >= 170 && f.test(String.fromCharCode(e)) + : i(e, h) || i(e, d) + } + ;(r.__esModule = !0), + (r.isIdentifierStart = s), + (r.isIdentifierChar = a) + var o = { + 6: n("enum await"), + strict: n( + "implements interface let package private protected public static yield" + ), + strictBind: n("eval arguments") + } + r.reservedWords = o + var u = n( + "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super" + ) + r.isKeyword = u + var l = + "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠ-ࢲऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞭꞰꞱꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭟꭤꭥꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ", + c = + "‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࣤ-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఃా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഁ-ഃാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ູົຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏ᦰ-ᧀᧈᧉ᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭ᳲ-᳴᳸᳹᷀-᷵᷼-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-꣄꣐-꣙꣠-꣱꤀-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︭︳︴﹍-﹏0-9_", + p = new RegExp("[" + l + "]"), + f = new RegExp("[" + l + c + "]") + l = c = null + var h = [ + 0, + 11, + 2, + 25, + 2, + 18, + 2, + 1, + 2, + 14, + 3, + 13, + 35, + 122, + 70, + 52, + 268, + 28, + 4, + 48, + 48, + 31, + 17, + 26, + 6, + 37, + 11, + 29, + 3, + 35, + 5, + 7, + 2, + 4, + 43, + 157, + 99, + 39, + 9, + 51, + 157, + 310, + 10, + 21, + 11, + 7, + 153, + 5, + 3, + 0, + 2, + 43, + 2, + 1, + 4, + 0, + 3, + 22, + 11, + 22, + 10, + 30, + 98, + 21, + 11, + 25, + 71, + 55, + 7, + 1, + 65, + 0, + 16, + 3, + 2, + 2, + 2, + 26, + 45, + 28, + 4, + 28, + 36, + 7, + 2, + 27, + 28, + 53, + 11, + 21, + 11, + 18, + 14, + 17, + 111, + 72, + 955, + 52, + 76, + 44, + 33, + 24, + 27, + 35, + 42, + 34, + 4, + 0, + 13, + 47, + 15, + 3, + 22, + 0, + 38, + 17, + 2, + 24, + 133, + 46, + 39, + 7, + 3, + 1, + 3, + 21, + 2, + 6, + 2, + 1, + 2, + 4, + 4, + 0, + 32, + 4, + 287, + 47, + 21, + 1, + 2, + 0, + 185, + 46, + 82, + 47, + 21, + 0, + 60, + 42, + 502, + 63, + 32, + 0, + 449, + 56, + 1288, + 920, + 104, + 110, + 2962, + 1070, + 13266, + 568, + 8, + 30, + 114, + 29, + 19, + 47, + 17, + 3, + 32, + 20, + 6, + 18, + 881, + 68, + 12, + 0, + 67, + 12, + 16481, + 1, + 3071, + 106, + 6, + 12, + 4, + 8, + 8, + 9, + 5991, + 84, + 2, + 70, + 2, + 1, + 3, + 0, + 3, + 1, + 3, + 3, + 2, + 11, + 2, + 0, + 2, + 6, + 2, + 64, + 2, + 3, + 3, + 7, + 2, + 6, + 2, + 27, + 2, + 3, + 2, + 4, + 2, + 0, + 4, + 6, + 2, + 339, + 3, + 24, + 2, + 24, + 2, + 30, + 2, + 24, + 2, + 30, + 2, + 24, + 2, + 30, + 2, + 24, + 2, + 30, + 2, + 24, + 2, + 7, + 4149, + 196, + 1340, + 3, + 2, + 26, + 2, + 1, + 2, + 0, + 3, + 0, + 2, + 9, + 2, + 3, + 2, + 0, + 2, + 0, + 7, + 0, + 5, + 0, + 2, + 0, + 2, + 0, + 2, + 2, + 2, + 1, + 2, + 0, + 3, + 0, + 2, + 0, + 2, + 0, + 2, + 0, + 2, + 0, + 2, + 1, + 2, + 0, + 3, + 3, + 2, + 6, + 2, + 3, + 2, + 3, + 2, + 0, + 2, + 9, + 2, + 16, + 6, + 2, + 2, + 4, + 2, + 16, + 4421, + 42710, + 42, + 4148, + 12, + 221, + 16355, + 541 + ], + d = [ + 509, + 0, + 227, + 0, + 150, + 4, + 294, + 9, + 1368, + 2, + 2, + 1, + 6, + 3, + 41, + 2, + 5, + 0, + 166, + 1, + 1306, + 2, + 54, + 14, + 32, + 9, + 16, + 3, + 46, + 10, + 54, + 9, + 7, + 2, + 37, + 13, + 2, + 9, + 52, + 0, + 13, + 2, + 49, + 13, + 16, + 9, + 83, + 11, + 168, + 11, + 6, + 9, + 8, + 2, + 57, + 0, + 2, + 6, + 3, + 1, + 3, + 2, + 10, + 0, + 11, + 1, + 3, + 6, + 4, + 4, + 316, + 19, + 13, + 9, + 214, + 6, + 3, + 8, + 112, + 16, + 16, + 9, + 82, + 12, + 9, + 9, + 535, + 9, + 20855, + 9, + 135, + 4, + 60, + 6, + 26, + 9, + 1016, + 45, + 17, + 3, + 19723, + 1, + 5319, + 4, + 4, + 5, + 9, + 7, + 3, + 6, + 31, + 3, + 149, + 2, + 1418, + 49, + 4305, + 6, + 792618, + 239 + ] + }, + {} + ], + 19: [ + function(e, t, r) { + "use strict" + function n(e, t) { + for (var r = 1, n = 0; ; ) { + s.lineBreakG.lastIndex = n + var i = s.lineBreakG.exec(e) + if (!(i && i.index < t)) return new a(r, t - n) + ++r, (n = i.index + i[0].length) + } + } + var i = e(23)["default"] + ;(r.__esModule = !0), (r.getLineInfo = n) + var s = e(20), + a = function u(e, t) { + i(this, u), (this.line = e), (this.column = t) + } + r.Position = a + var o = function l(e, t) { + i(this, l), (this.start = e), (this.end = t) + } + r.SourceLocation = o + }, + { 20: 20, 23: 23 } + ], + 20: [ + function(e, t, r) { + "use strict" + function n(e) { + return 10 === e || 13 === e || 8232 === e || 8233 === e + } + ;(r.__esModule = !0), (r.isNewLine = n) + var i = /\r\n?|\n|\u2028|\u2029/ + r.lineBreak = i + var s = new RegExp(i.source, "g") + r.lineBreakG = s + var a = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/ + r.nonASCIIwhitespace = a + }, + {} + ], + 21: [ + function(e, t, r) { + t.exports = { default: e(26), __esModule: !0 } + }, + { 26: 26 } + ], + 22: [ + function(e, t, r) { + t.exports = { default: e(27), __esModule: !0 } + }, + { 27: 27 } + ], + 23: [ + function(e, t, r) { + "use strict" + ;(r["default"] = function(e, t) { + if (!(e instanceof t)) + throw new TypeError("Cannot call a class as a function") + }), + (r.__esModule = !0) + }, + {} + ], + 24: [ + function(e, t, r) { + "use strict" + var n = e(21)["default"], + i = e(22)["default"] + ;(r["default"] = function(e, t) { + if ("function" != typeof t && null !== t) + throw new TypeError( + "Super expression must either be null or a function, not " + + typeof t + ) + ;(e.prototype = n(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })), + t && (i ? i(e, t) : (e.__proto__ = t)) + }), + (r.__esModule = !0) + }, + { 21: 21, 22: 22 } + ], + 25: [ + function(e, t, r) { + "use strict" + ;(r["default"] = function(e) { + return e && e.__esModule ? e : { default: e } + }), + (r.__esModule = !0) + }, + {} + ], + 26: [ + function(e, t, r) { + var n = e(35) + t.exports = function(e, t) { + return n.create(e, t) + } + }, + { 35: 35 } + ], + 27: [ + function(e, t, r) { + e(37), (t.exports = e(30).Object.setPrototypeOf) + }, + { 30: 30, 37: 37 } + ], + 28: [ + function(e, t, r) { + t.exports = function(e) { + if ("function" != typeof e) + throw TypeError(e + " is not a function!") + return e + } + }, + {} + ], + 29: [ + function(e, t, r) { + var n = e(34) + t.exports = function(e) { + if (!n(e)) throw TypeError(e + " is not an object!") + return e + } + }, + { 34: 34 } + ], + 30: [ + function(e, t, r) { + var n = (t.exports = { version: "1.2.6" }) + "number" == typeof __e && (__e = n) + }, + {} + ], + 31: [ + function(e, t, r) { + var n = e(28) + t.exports = function(e, t, r) { + if ((n(e), void 0 === t)) return e + switch (r) { + case 1: + return function(r) { + return e.call(t, r) + } + case 2: + return function(r, n) { + return e.call(t, r, n) + } + case 3: + return function(r, n, i) { + return e.call(t, r, n, i) + } + } + return function() { + return e.apply(t, arguments) + } + } + }, + { 28: 28 } + ], + 32: [ + function(e, t, r) { + var n = e(33), + i = e(30), + s = e(31), + a = "prototype", + o = function(e, t, r) { + var u, + l, + c, + p = e & o.F, + f = e & o.G, + h = e & o.S, + d = e & o.P, + m = e & o.B, + y = e & o.W, + v = f ? i : i[t] || (i[t] = {}), + g = f ? n : h ? n[t] : (n[t] || {})[a] + f && (r = t) + for (u in r) + (l = !p && g && u in g), + (l && u in v) || + ((c = l ? g[u] : r[u]), + (v[u] = + f && "function" != typeof g[u] + ? r[u] + : m && l + ? s(c, n) + : y && g[u] == c + ? (function(e) { + var t = function(t) { + return this instanceof e + ? new e(t) + : e(t) + } + return (t[a] = e[a]), t + })(c) + : d && "function" == typeof c + ? s(Function.call, c) + : c), + d && ((v[a] || (v[a] = {}))[u] = c)) + } + ;(o.F = 1), + (o.G = 2), + (o.S = 4), + (o.P = 8), + (o.B = 16), + (o.W = 32), + (t.exports = o) + }, + { 30: 30, 31: 31, 33: 33 } + ], + 33: [ + function(e, t, r) { + var n = (t.exports = + "undefined" != typeof window && window.Math == Math + ? window + : "undefined" != typeof self && self.Math == Math + ? self + : Function("return this")()) + "number" == typeof __g && (__g = n) + }, + {} + ], + 34: [ + function(e, t, r) { + t.exports = function(e) { + return "object" == typeof e + ? null !== e + : "function" == typeof e + } + }, + {} + ], + 35: [ + function(e, t, r) { + var n = Object + t.exports = { + create: n.create, + getProto: n.getPrototypeOf, + isEnum: {}.propertyIsEnumerable, + getDesc: n.getOwnPropertyDescriptor, + setDesc: n.defineProperty, + setDescs: n.defineProperties, + getKeys: n.keys, + getNames: n.getOwnPropertyNames, + getSymbols: n.getOwnPropertySymbols, + each: [].forEach + } + }, + {} + ], + 36: [ + function(e, t, r) { + var n = e(35).getDesc, + i = e(34), + s = e(29), + a = function(e, t) { + if ((s(e), !i(t) && null !== t)) + throw TypeError(t + ": can't set as prototype!") + } + t.exports = { + set: + Object.setPrototypeOf || + ("__proto__" in {} + ? (function(t, r, i) { + try { + ;(i = e(31)( + Function.call, + n(Object.prototype, "__proto__").set, + 2 + )), + i(t, []), + (r = !(t instanceof Array)) + } catch (s) { + r = !0 + } + return function(e, t) { + return ( + a(e, t), + r ? (e.__proto__ = t) : i(e, t), + e + ) + } + })({}, !1) + : void 0), + check: a + } + }, + { 29: 29, 31: 31, 34: 34, 35: 35 } + ], + 37: [ + function(e, t, r) { + var n = e(32) + n(n.S, "Object", { setPrototypeOf: e(36).set }) + }, + { 32: 32, 36: 36 } + ] + }, + {}, + [1] + )(1) + }) + }, + [7434, 2653], + function(e, t) { + function r(e, t) { + for (var r = -1, n = e.length; ++r < n && t(e[r], r, e) !== !1; ); + return e + } + e.exports = r + }, + [7440, 2665, 2666, 470, 1420, 2701], + [7446, 181], + function(e, t) { + function r(e) { + return null == e ? "" : e + "" + } + e.exports = r + }, + [7466, 1409], + [7472, 94, 181], + [7476, 815, 94], + [7486, 148], + [7487, 180, 148], + [7492, 472, 94, 563, 180, 99], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("flow") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("jsx") + } + } + }), + (e.exports = t["default"]) + }, + [7470, 2738, 474], + 148, + [7475, 377], + [7479, 824, 825], + [7491, 1439, 824, 377, 2744], + [ + 7412, + 2897, + 311, + 841, + 186, + 1469, + 840, + 48, + 29, + 831, + 1453, + 2769, + 378, + 2820, + 830, + 1443, + 2793, + 33 + ], + [7330, 29], + [7436, 2803, 1449, 570, 834, 475, 2819, 2822], + [7470, 1449, 475], + 563, + [7471, 832, 833, 379], + [7416, 2896], + [7455, 1468], + [7470, 1462, 380], + 563, + [7479, 837, 183], + [7339, 2908], + [7341, 2910], + 799, + 557, + 558, + [7365, 95, 847, 1473], + [7372, 476, 157, 574], + 803, + [7375, 95, 844, 381], + [ + 7391, + 95, + 575, + 844, + 1473, + 476, + 1478, + 574, + 1479, + 848, + 1481, + 381, + 2920, + 1474, + 2915, + 2916, + 1472, + 477, + 847, + 1477 + ], + [7470, 2956, 478], + 148, + [7475, 383], + [7479, 850, 851], + [7491, 1485, 850, 383, 2962], + [ + 7412, + 1502, + 86, + 482, + 85, + 861, + 481, + 17, + 6, + 857, + 1499, + 2987, + 479, + 3038, + 856, + 1489, + 3011, + 11 + ], + [7330, 6], + [7436, 3021, 1495, 579, 860, 480, 3037, 3040], + [7470, 1495, 480], + 563, + [7471, 858, 859, 384], + [7334, 3054], + 799, + 557, + 558, + [7365, 96, 867, 1504], + [7372, 483, 158, 582], + 803, + [7375, 96, 864, 385], + [ + 7391, + 96, + 583, + 864, + 1504, + 483, + 1509, + 582, + 1510, + 868, + 1512, + 385, + 3071, + 1505, + 3066, + 3067, + 1503, + 484, + 867, + 1508 + ], + [7416, 3048], + [ + 7412, + 1502, + 86, + 482, + 85, + 861, + 481, + 17, + 6, + 873, + 1519, + 3113, + 485, + 3189, + 872, + 1517, + 3134, + 11 + ], + [7330, 6], + [7436, 1528, 874, 159, 587, 314, 1535, 3191], + [7466, 1530], + [7470, 874, 314], + 563, + [7479, 875, 188], + [7339, 3209], + 799, + 557, + 465, + 558, + [7365, 100, 885, 1544], + [7372, 589, 191, 881], + 803, + [7375, 100, 882, 387], + [ + 7391, + 100, + 590, + 882, + 1544, + 589, + 1548, + 881, + 1549, + 886, + 1550, + 387, + 3222, + 1545, + 3216, + 3218, + 1543, + 486, + 885, + 1547 + ], + [ + 7412, + 3199, + 315, + 588, + 190, + 1540, + 878, + 66, + 38, + 891, + 1557, + 3253, + 388, + 3342, + 889, + 1554, + 3276, + 54 + ], + [7330, 38], + [7416, 3198], + [7436, 1568, 893, 149, 594, 193, 1574, 3345], + [7446, 195], + [7466, 1570], + [7470, 893, 193], + [7472, 149, 195], + [7476, 3313, 149], + [7488, 3303, 1564, 3319], + 98, + 466, + [7365, 597, 1582, 3354], + [7339, 3391], + [7341, 3393], + 799, + 557, + 465, + 558, + [7365, 101, 909, 1588], + [7372, 598, 197, 905], + 803, + [7375, 101, 906, 390], + [ + 7391, + 101, + 599, + 906, + 1588, + 598, + 1592, + 905, + 1593, + 910, + 1594, + 390, + 3404, + 1589, + 3398, + 3400, + 1587, + 489, + 909, + 1591 + ], + [ + 7412, + 3381, + 317, + 902, + 196, + 1584, + 901, + 73, + 39, + 915, + 1601, + 3434, + 391, + 3523, + 913, + 1598, + 3457, + 55 + ], + [7330, 39], + [7416, 3380], + [7436, 1612, 917, 150, 603, 199, 1618, 3526], + [7446, 201], + [7466, 1614], + [7470, 917, 199], + [7472, 150, 201], + [7476, 3494, 150], + [7488, 3484, 1608, 3500], + 799, + 557, + 465, + 558, + [7365, 102, 928, 1626], + [7372, 607, 202, 924], + 803, + [7375, 102, 925, 393], + [ + 7391, + 102, + 608, + 925, + 1626, + 607, + 1630, + 924, + 1631, + 929, + 1632, + 393, + 3556, + 1627, + 3550, + 3552, + 1625, + 493, + 928, + 1629 + ], + [ + 7412, + 1624, + 87, + 492, + 83, + 605, + 491, + 18, + 7, + 933, + 1639, + 3587, + 494, + 3644, + 932, + 1636, + 3610, + 13 + ], + [7330, 7], + [7436, 3623, 1644, 320, 936, 394, 3643, 3647], + [7455, 3648], + [7470, 1644, 394], + [7471, 935, 610, 395], + [7475, 395], + [7479, 935, 611], + [7488, 3618, 1642, 3629], + [7416, 3533], + [ + 7412, + 1624, + 87, + 492, + 83, + 605, + 491, + 18, + 7, + 943, + 1652, + 3676, + 495, + 3752, + 942, + 1650, + 3697, + 13 + ], + [7330, 7], + [7436, 1661, 944, 160, 615, 322, 1668, 3754], + [7466, 1663], + [7470, 944, 322], + 563, + [7479, 945, 204], + [7334, 3768], + [7339, 3773], + 799, + 557, + 465, + 558, + [7365, 103, 956, 1676], + [7372, 620, 208, 952], + 803, + [7375, 103, 953, 397], + [ + 7391, + 103, + 621, + 953, + 1676, + 620, + 1680, + 952, + 1681, + 957, + 1682, + 397, + 3786, + 1677, + 3780, + 3782, + 1675, + 496, + 956, + 1679 + ], + [ + 7412, + 3763, + 207, + 619, + 206, + 948, + 949, + 67, + 31, + 962, + 1689, + 3818, + 323, + 3908, + 960, + 1686, + 3842, + 40 + ], + [7330, 31], + [7416, 3762], + [7436, 1699, 964, 151, 625, 210, 1705, 1707], + [7446, 212], + [7466, 1701], + [7470, 964, 210], + [7472, 151, 212], + [7476, 3879, 151], + 563, + 148, + [7479, 1712, 969], + [7497, 32, 23, 3939, 1725, 26], + [7334, 3953], + [7339, 3958], + [7358, 1719], + 799, + 557, + 465, + 558, + [7365, 97, 981, 1717], + [7372, 499, 162, 977], + 803, + [7375, 97, 978, 401], + [ + 7391, + 97, + 632, + 978, + 1717, + 499, + 1722, + 977, + 1723, + 982, + 1724, + 401, + 3970, + 1718, + 3965, + 3967, + 974, + 500, + 981, + 1721 + ], + [7470, 4003, 501], + 148, + [7475, 403], + [7479, 984, 985], + [7491, 1728, 984, 403, 4009], + [ + 7412, + 3947, + 152, + 498, + 161, + 972, + 973, + 32, + 23, + 990, + 1742, + 4034, + 325, + 4085, + 631, + 1732, + 4058, + 26 + ], + [7436, 4068, 1738, 636, 993, 502, 4084, 4087], + [7470, 1738, 502], + 563, + [7471, 991, 992, 404], + [7416, 3946], + [7455, 1757], + [7470, 1751, 405], + 563, + [7479, 996, 214], + 98, + 466, + [7365, 642, 1762, 4163], + [7470, 4203, 504], + 148, + [7475, 407], + [7479, 1002, 1003], + [7491, 1766, 1002, 407, 4209], + [ + 7412, + 1783, + 89, + 508, + 88, + 1013, + 507, + 19, + 8, + 1009, + 1780, + 4234, + 505, + 4285, + 1008, + 1770, + 4258, + 14 + ], + [7330, 8], + [7436, 4268, 1776, 648, 1012, 506, 4284, 4287], + [7470, 1776, 506], + 563, + [7471, 1010, 1011, 408], + [7334, 4299], + 799, + 557, + 465, + 558, + [7365, 104, 1020, 1785], + [7372, 651, 217, 1016], + 803, + [7375, 104, 1017, 409], + [ + 7391, + 104, + 652, + 1017, + 1785, + 651, + 1789, + 1016, + 1790, + 1021, + 1791, + 409, + 4317, + 1786, + 4311, + 4313, + 1784, + 509, + 1020, + 1788 + ], + [7416, 4294], + [ + 7412, + 1783, + 89, + 508, + 88, + 1013, + 507, + 19, + 8, + 1026, + 1798, + 4358, + 510, + 4434, + 1025, + 1796, + 4379, + 14 + ], + [7330, 8], + [7436, 1807, 1027, 163, 656, 329, 1814, 4436], + [7466, 1809], + [7470, 1027, 329], + 563, + [7479, 1028, 219], + [7334, 4450], + [7339, 4455], + [7341, 4457], + 799, + 557, + 465, + 558, + [7365, 105, 1040, 1822], + [7372, 658, 222, 1036], + 803, + [7375, 105, 1037, 411], + [ + 7391, + 105, + 659, + 1037, + 1822, + 658, + 1826, + 1036, + 1827, + 1041, + 1828, + 411, + 4468, + 1823, + 4462, + 4464, + 1821, + 511, + 1040, + 1825 + ], + [ + 7412, + 4445, + 330, + 1033, + 221, + 1031, + 1032, + 68, + 41, + 1046, + 1835, + 4499, + 412, + 4588, + 1044, + 1832, + 4522, + 56 + ], + [7330, 41], + [7416, 4444], + [7436, 1846, 1048, 153, 663, 224, 1852, 4591], + [7446, 226], + [7466, 1848], + [7470, 1048, 224], + [7472, 153, 226], + [7476, 4559, 153], + [7488, 4549, 1842, 4565], + function(e, t, r) { + "use strict" + var n = r(415)["default"], + i = r(84)["default"], + s = r(665)["default"], + a = r(414)["default"], + o = r(21)["default"], + u = r(9)["default"] + t.__esModule = !0 + var l = r(175), + c = r(4633), + p = o(c), + f = r(15), + h = u(f), + d = p["default"]("\n require($0);\n"), + m = p["default"]( + '\n Object.defineProperty(exports, "__esModule", {\n value: true\n });\n' + ), + y = p["default"]( + "\n Object.defineProperty(exports, $0, {\n enumerable: true,\n get: function () {\n return $1;\n }\n });\n" + ), + v = p["default"]("\n exports.__esModule = true;\n"), + g = p["default"]("\n exports.$0 = $1;\n"), + E = p["default"]( + '\n Object.keys(OBJECT).forEach(function (key) {\n if (key === "default") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return OBJECT[key];\n }\n });\n });\n' + ), + b = [ + "FunctionExpression", + "FunctionDeclaration", + "ClassProperty", + "ClassMethod", + "ObjectMethod" + ] + ;(t["default"] = function() { + var e = n(), + t = { + ReferencedIdentifier: function(e) { + var t = e.node.name, + r = this.remaps[t] + r && + this.scope.getBinding(t) === e.scope.getBinding(t) && + (e.parentPath.isCallExpression({ callee: e.node }) + ? e.replaceWith( + h.sequenceExpression([h.numericLiteral(0), r]) + ) + : e.replaceWith(r), + this.requeueInParent(e)) + }, + AssignmentExpression: function(t) { + var r = t.node + if (!r[e]) { + var n = t.get("left") + if (n.isIdentifier()) { + var s = n.node.name, + a = this.exports[s] + if ( + a && + this.scope.getBinding(s) === t.scope.getBinding(s) + ) { + r[e] = !0 + for ( + var o = a, + u = Array.isArray(o), + l = 0, + o = u ? o : i(o); + ; + + ) { + var c + if (u) { + if (l >= o.length) break + c = o[l++] + } else { + if (((l = o.next()), l.done)) break + c = l.value + } + var p = c + r = g(p, r).expression + } + t.replaceWith(r), this.requeueInParent(t) + } + } + } + }, + UpdateExpression: function(e) { + var t = e.get("argument") + if (t.isIdentifier()) { + var r = t.node.name, + n = this.exports[r] + if (n && this.scope.getBinding(r) === e.scope.getBinding(r)) { + var s = h.assignmentExpression( + e.node.operator[0] + "=", + t.node, + h.numericLiteral(1) + ) + if ( + (e.parentPath.isExpressionStatement() && + !e.isCompletionRecord()) || + e.node.prefix + ) + return e.replaceWith(s), void this.requeueInParent(e) + var a = [] + a.push(s) + var o = void 0 + ;(o = "--" === e.node.operator ? "+" : "-"), + a.push( + h.binaryExpression(o, t.node, h.numericLiteral(1)) + ) + for ( + var u = e.replaceWithMultiple(h.sequenceExpression(a)), + l = u, + c = Array.isArray(l), + p = 0, + l = c ? l : i(l); + ; + + ) { + var f + if (c) { + if (p >= l.length) break + f = l[p++] + } else { + if (((p = l.next()), p.done)) break + f = p.value + } + var d = f + this.requeueInParent(d) + } + } + } + } + } + return { + inherits: r(1328), + visitor: { + ThisExpression: function(e, t) { + this.ranCommonJS || + t.opts.allowTopLevelThis === !0 || + e.findParent(function(e) { + return !e.is("shadow") && b.indexOf(e.type) >= 0 + }) || + e.replaceWith(h.identifier("undefined")) + }, + Program: { + exit: function(e) { + function r(t, r) { + var n = S[t] + if (n) return n + var i = e.scope.generateUidIdentifier( + l.basename(t, l.extname(t)) + ), + s = h.variableDeclaration("var", [ + h.variableDeclarator( + i, + d(h.stringLiteral(t)).expression + ) + ]) + return ( + "number" == typeof r && r > 0 && (s._blockHoist = r), + D.push(s), + (S[t] = i) + ) + } + function n(e, t, r) { + var n = e[t] || [] + e[t] = n.concat(r) + } + this.ranCommonJS = !0 + var o = !!this.opts.strict, + u = e.scope + u.rename("module"), u.rename("exports"), u.rename("require") + for ( + var c = !1, + p = !1, + f = e.get("body"), + b = s(null), + x = s(null), + A = s(null), + D = [], + C = s(null), + S = s(null), + F = 0; + F < f.length; + F++ + ) { + var w = f[F] + if (w.isExportDeclaration()) { + c = !0 + for ( + var _ = [].concat( + w.get("declaration"), + w.get("specifiers") + ), + T = _, + P = Array.isArray(T), + B = 0, + T = P ? T : i(T); + ; + + ) { + var k + if (P) { + if (B >= T.length) break + k = T[B++] + } else { + if (((B = T.next()), B.done)) break + k = B.value + } + var I = k, + O = I.getBindingIdentifiers() + if (O.__esModule) + throw I.buildCodeFrameError( + 'Illegal export "__esModule"' + ) + } + } + if (w.isImportDeclaration()) { + var M + p = !0 + var R = w.node.source.value, + L = b[R] || { specifiers: [], maxBlockHoist: 0 } + ;(M = L.specifiers).push.apply(M, w.node.specifiers), + "number" == typeof w.node._blockHoist && + (L.maxBlockHoist = Math.max( + w.node._blockHoist, + L.maxBlockHoist + )), + (b[R] = L), + w.remove() + } else if (w.isExportDefaultDeclaration()) { + var N = w.get("declaration") + if (N.isFunctionDeclaration()) { + var j = N.node.id, + U = h.identifier("default") + j + ? (n(x, j.name, U), + D.push(g(U, j)), + w.replaceWith(N.node)) + : (D.push(g(U, h.toExpression(N.node))), + w.remove()) + } else if (N.isClassDeclaration()) { + var j = N.node.id, + U = h.identifier("default") + j + ? (n(x, j.name, U), + w.replaceWithMultiple([N.node, g(U, j)])) + : w.replaceWith(g(U, h.toExpression(N.node))) + } else + w.replaceWith(g(h.identifier("default"), N.node)), + w.parentPath.requeue(w.get("expression.left")) + } else if (w.isExportNamedDeclaration()) { + var N = w.get("declaration") + if (N.node) { + if (N.isFunctionDeclaration()) { + var j = N.node.id + n(x, j.name, j), + D.push(g(j, j)), + w.replaceWith(N.node) + } else if (N.isClassDeclaration()) { + var j = N.node.id + n(x, j.name, j), + w.replaceWithMultiple([N.node, g(j, j)]), + (A[j.name] = !0) + } else if (N.isVariableDeclaration()) { + for ( + var V = N.get("declarations"), + G = V, + W = Array.isArray(G), + q = 0, + G = W ? G : i(G); + ; + + ) { + var H + if (W) { + if (q >= G.length) break + H = G[q++] + } else { + if (((q = G.next()), q.done)) break + H = q.value + } + var Y = H, + j = Y.get("id"), + J = Y.get("init") + J.node || + J.replaceWith( + h.identifier("undefined") + ), + j.isIdentifier() && + (n(x, j.node.name, j.node), + J.replaceWith( + g(j.node, J.node).expression + ), + (A[j.node.name] = !0)) + } + w.replaceWith(N.node) + } + continue + } + var _ = w.get("specifiers") + if (_.length) { + var K = [], + X = w.node.source + if (X) + for ( + var z = r(X.value, w.node._blockHoist), + $ = _, + Q = Array.isArray($), + Z = 0, + $ = Q ? $ : i($); + ; + + ) { + var ee + if (Q) { + if (Z >= $.length) break + ee = $[Z++] + } else { + if (((Z = $.next()), Z.done)) break + ee = Z.value + } + var I = ee + I.isExportNamespaceSpecifier() || + I.isExportDefaultSpecifier() || + (I.isExportSpecifier() && + ("default" === I.node.local.name + ? D.push( + y( + h.stringLiteral( + I.node.exported + .name + ), + h.memberExpression( + h.callExpression( + this.addHelper( + "interopRequireDefault" + ), + [z] + ), + I.node.local + ) + ) + ) + : D.push( + y( + h.stringLiteral( + I.node.exported + .name + ), + h.memberExpression( + z, + I.node.local + ) + ) + ), + (A[I.node.exported.name] = !0))) + } + else + for ( + var te = _, + re = Array.isArray(te), + ne = 0, + te = re ? te : i(te); + ; + + ) { + var ie + if (re) { + if (ne >= te.length) break + ie = te[ne++] + } else { + if (((ne = te.next()), ne.done)) break + ie = ne.value + } + var I = ie + I.isExportSpecifier() && + (n( + x, + I.node.local.name, + I.node.exported + ), + (A[I.node.exported.name] = !0), + K.push( + g(I.node.exported, I.node.local) + )) + } + w.replaceWithMultiple(K) + } + } else + w.isExportAllDeclaration() && + (D.push( + E({ + OBJECT: r( + w.node.source.value, + w.node._blockHoist + ) + }) + ), + w.remove()) + } + for (var X in b) { + var se = b[X], + _ = se.specifiers, + ae = se.maxBlockHoist + if (_.length) { + for ( + var oe = r(X, ae), ue = void 0, le = 0; + le < _.length; + le++ + ) { + var I = _[le] + if (h.isImportNamespaceSpecifier(I)) { + if (o) C[I.local.name] = oe + else { + var ce = h.variableDeclaration("var", [ + h.variableDeclarator( + I.local, + h.callExpression( + this.addHelper( + "interopRequireWildcard" + ), + [oe] + ) + ) + ]) + ae > 0 && (ce._blockHoist = ae), D.push(ce) + } + ue = I.local + } else + h.isImportDefaultSpecifier(I) && + (_[le] = h.importSpecifier( + I.local, + h.identifier("default") + )) + } + for ( + var pe = _, + fe = Array.isArray(pe), + he = 0, + pe = fe ? pe : i(pe); + ; + + ) { + var de + if (fe) { + if (he >= pe.length) break + de = pe[he++] + } else { + if (((he = pe.next()), he.done)) break + de = he.value + } + var I = de + if (h.isImportSpecifier(I)) { + var me = oe + if ("default" === I.imported.name) + if (ue) me = ue + else { + me = ue = e.scope.generateUidIdentifier( + oe.name + ) + var ce = h.variableDeclaration("var", [ + h.variableDeclarator( + me, + h.callExpression( + this.addHelper( + "interopRequireDefault" + ), + [oe] + ) + ) + ]) + ae > 0 && (ce._blockHoist = ae), + D.push(ce) + } + C[I.local.name] = h.memberExpression( + me, + h.cloneWithoutLoc(I.imported) + ) + } + } + } else D.push(d(h.stringLiteral(X))) + } + if (p && a(A).length) { + var ye = h.identifier("undefined") + for (var ve in A) ye = g(h.identifier(ve), ye).expression + var ge = h.expressionStatement(ye) + ;(ge._blockHoist = 3), D.unshift(ge) + } + if (c && !o) { + var Ee = m + this.opts.loose && (Ee = v) + var be = Ee() + ;(be._blockHoist = 3), D.unshift(be) + } + e.unshiftContainer("body", D), + e.traverse(t, { + remaps: C, + scope: u, + exports: x, + requeueInParent: function(t) { + return e.requeue(t) + } + }) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 799, + 557, + 465, + 558, + [7365, 106, 1060, 1859], + [7372, 667, 227, 1056], + 803, + [7375, 106, 1057, 416], + [ + 7391, + 106, + 668, + 1057, + 1859, + 667, + 1863, + 1056, + 1864, + 1061, + 1865, + 416, + 4619, + 1860, + 4613, + 4615, + 1858, + 513, + 1060, + 1862 + ], + [ + 7412, + 1857, + 90, + 415, + 84, + 665, + 414, + 21, + 9, + 1065, + 1872, + 4650, + 514, + 4707, + 1064, + 1869, + 4673, + 15 + ], + [7330, 9], + [7436, 4686, 1877, 333, 1068, 417, 4706, 4710], + [7455, 4711], + [7470, 1877, 417], + [7471, 1067, 670, 418], + [7475, 418], + [7479, 1067, 671], + [7488, 4681, 1875, 4692], + [7416, 4596], + [ + 7412, + 1857, + 90, + 415, + 84, + 665, + 414, + 21, + 9, + 1075, + 1885, + 4739, + 515, + 4815, + 1074, + 1883, + 4760, + 15 + ], + [7330, 9], + [7436, 1894, 1076, 164, 675, 335, 1901, 4817], + [7466, 1896], + [7470, 1076, 335], + 563, + [7479, 1077, 229], + [7416, 1934], + [ + 7412, + 1935, + 91, + 422, + 82, + 517, + 421, + 10, + 2, + 1083, + 1911, + 4849, + 516, + 4925, + 1082, + 1909, + 4870, + 57 + ], + [7330, 2], + [7436, 1920, 1084, 165, 678, 337, 1927, 4927], + [7466, 1922], + [7470, 1084, 337], + 563, + [7479, 1085, 232], + 799, + 557, + 465, + 558, + [7365, 107, 1094, 1939], + [7372, 680, 234, 1090], + 803, + [7375, 107, 1091, 423], + [ + 7391, + 107, + 681, + 1091, + 1939, + 680, + 1943, + 1090, + 1944, + 1095, + 1945, + 423, + 4952, + 1940, + 4946, + 4948, + 1938, + 518, + 1094, + 1942 + ], + [ + 7412, + 1935, + 91, + 422, + 82, + 517, + 421, + 10, + 2, + 1100, + 1952, + 4983, + 424, + 5072, + 1098, + 1949, + 5006, + 58 + ], + [7330, 2], + [7416, 1934], + [7436, 1963, 1102, 154, 685, 236, 1969, 5075], + [7446, 238], + [7466, 1965], + [7470, 1102, 236], + [7472, 154, 238], + [7476, 5043, 154], + [7488, 5033, 1959, 5049], + [7339, 5093], + [7341, 5095], + 799, + 557, + 465, + 558, + [7365, 108, 1115, 1976], + [7372, 687, 240, 1111], + 803, + [7375, 108, 1112, 426], + [ + 7391, + 108, + 688, + 1112, + 1976, + 687, + 1980, + 1111, + 1981, + 1116, + 1982, + 426, + 5106, + 1977, + 5100, + 5102, + 1975, + 520, + 1115, + 1979 + ], + [ + 7412, + 5083, + 339, + 1108, + 239, + 1972, + 1107, + 69, + 42, + 1121, + 1989, + 5137, + 427, + 5226, + 1119, + 1986, + 5160, + 59 + ], + [7330, 42], + [7416, 5082], + [7436, 2e3, 1123, 155, 692, 242, 2006, 5229], + [7446, 244], + [7466, 2002], + [7470, 1123, 242], + [7472, 155, 244], + [7476, 5197, 155], + [7488, 5187, 1996, 5203], + [ + 7412, + 5376, + 250, + 701, + 249, + 2038, + 1138, + 70, + 34, + 1129, + 2022, + 5249, + 522, + 5300, + 695, + 2012, + 5273, + 49 + ], + [7436, 5283, 2018, 697, 1132, 523, 5299, 5302], + [7470, 2018, 523], + 563, + [7471, 1130, 1131, 429], + [7416, 5375], + [7455, 2037], + [7470, 2031, 430], + 563, + [7479, 1135, 246], + [7339, 5386], + 799, + 557, + 465, + 558, + [7365, 109, 1145, 2042], + [7372, 702, 251, 1141], + 803, + [7375, 109, 1142, 431], + [ + 7391, + 109, + 703, + 1142, + 2042, + 702, + 2046, + 1141, + 2047, + 1146, + 2048, + 431, + 5399, + 2043, + 5393, + 5395, + 2041, + 524, + 1145, + 2045 + ], + [7339, 5434], + [7341, 5436], + 799, + 557, + 465, + 558, + [7365, 110, 1156, 2053], + [7372, 706, 253, 1152], + 803, + [7375, 110, 1153, 432], + [ + 7391, + 110, + 707, + 1153, + 2053, + 706, + 2057, + 1152, + 2058, + 1157, + 2059, + 432, + 5447, + 2054, + 5441, + 5443, + 2052, + 525, + 1156, + 2056 + ], + [7470, 5478, 526], + 148, + [7475, 434], + [7479, 1159, 1160], + [7491, 2063, 1159, 434, 5484], + [ + 7412, + 5424, + 342, + 1149, + 252, + 2049, + 1148, + 50, + 24, + 1166, + 2077, + 5509, + 343, + 5560, + 1165, + 2067, + 5533, + 28 + ], + [7330, 24], + [7436, 5543, 2073, 711, 1169, 527, 5559, 5562], + [7470, 2073, 527], + 563, + [7471, 1167, 1168, 435], + [7416, 5423], + [7455, 2092], + [7470, 2086, 436], + 563, + [7479, 1172, 255], + [7339, 5646], + 799, + 557, + 465, + 558, + [7365, 111, 1182, 2098], + [7372, 716, 259, 1178], + 803, + [7375, 111, 1179, 437], + [ + 7391, + 111, + 717, + 1179, + 2098, + 716, + 2102, + 1178, + 2103, + 1183, + 2104, + 437, + 5659, + 2099, + 5653, + 5655, + 2097, + 528, + 1182, + 2101 + ], + [7416, 5635], + [ + 7412, + 5636, + 345, + 2095, + 258, + 2093, + 1175, + 77, + 43, + 1188, + 2111, + 5700, + 529, + 5776, + 1187, + 2109, + 5721, + 60 + ], + [7330, 43], + [7436, 2120, 1189, 166, 721, 347, 2127, 5778], + [7466, 2122], + [7470, 1189, 347], + 563, + [7479, 1190, 261], + [7339, 5800], + 799, + 557, + 465, + 558, + [7365, 112, 1200, 2136], + [7372, 724, 264, 1196], + 803, + [7375, 112, 1197, 439], + [ + 7391, + 112, + 725, + 1197, + 2136, + 724, + 2140, + 1196, + 2141, + 1201, + 2142, + 439, + 5813, + 2137, + 5807, + 5809, + 2135, + 530, + 1200, + 2139 + ], + [7416, 5789], + [ + 7412, + 5790, + 348, + 2133, + 263, + 2131, + 1193, + 74, + 35, + 1206, + 2149, + 5854, + 531, + 5930, + 1205, + 2147, + 5875, + 51 + ], + [7330, 35], + [7436, 2158, 1207, 167, 729, 350, 2165, 5932], + [7466, 2160], + [7470, 1207, 350], + 563, + [7479, 1208, 266], + [7378, 5945, 5940], + [7416, 6068], + [ + 7412, + 6069, + 353, + 2205, + 271, + 2203, + 1221, + 71, + 36, + 1215, + 2184, + 5982, + 532, + 6060, + 1214, + 2182, + 6003, + 61 + ], + [7330, 36], + [7436, 1216, 1217, 168, 736, 352, 2199, 6062], + [7447, 6048], + [7466, 2194], + [7470, 1217, 352], + 563, + [7479, 1218, 269], + [7339, 6079], + 799, + 557, + 465, + 558, + [7365, 113, 1228, 2208], + [7372, 737, 272, 1224], + 803, + [7375, 113, 1225, 443], + [ + 7391, + 113, + 738, + 1225, + 2208, + 737, + 2212, + 1224, + 2213, + 1229, + 2214, + 443, + 6092, + 2209, + 6086, + 6088, + 2207, + 533, + 1228, + 2211 + ], + [ + 7412, + 2252, + 93, + 538, + 92, + 1242, + 537, + 20, + 4, + 444, + 2222, + 6134, + 534, + 2246, + 1232, + 2219, + 6158, + 12 + ], + [7330, 4], + [7416, 6269], + [ + 7412, + 2252, + 93, + 538, + 92, + 1242, + 537, + 20, + 4, + 444, + 2229, + 6189, + 535, + 2246, + 1235, + 2227, + 6210, + 12 + ], + [7330, 4], + [7446, 276], + [7466, 2242], + [7470, 1237, 274], + [7472, 156, 276], + [7476, 6234, 156], + [7477, 2237, 536, 742], + [7334, 6274], + 799, + 557, + 465, + 558, + [7365, 114, 1249, 2254], + [7372, 746, 277, 1245], + 803, + [7375, 114, 1246, 446], + [ + 7391, + 114, + 747, + 1246, + 2254, + 746, + 2258, + 1245, + 2259, + 1250, + 2260, + 446, + 6292, + 2255, + 6286, + 6288, + 2253, + 539, + 1249, + 2257 + ], + [7416, 6421], + [ + 7412, + 6422, + 358, + 2290, + 281, + 2288, + 1260, + 72, + 37, + 1255, + 2268, + 6336, + 540, + 6412, + 1254, + 2266, + 6357, + 52 + ], + [7330, 37], + [7436, 2277, 1256, 169, 751, 357, 2284, 6414], + [7466, 2279], + [7470, 1256, 357], + 563, + [7479, 1257, 279], + [7339, 6432], + 799, + 557, + 465, + 558, + [7365, 115, 1267, 2293], + [7372, 752, 282, 1263], + 803, + [7375, 115, 1264, 448], + [ + 7391, + 115, + 753, + 1264, + 2293, + 752, + 2297, + 1263, + 2298, + 1268, + 2299, + 448, + 6445, + 2294, + 6439, + 6441, + 2292, + 541, + 1267, + 2296 + ], + [7416, 6590], + [ + 7412, + 6591, + 361, + 2332, + 286, + 2330, + 1279, + 75, + 44, + 1274, + 2311, + 6505, + 542, + 6582, + 1272, + 2309, + 6526, + 62 + ], + [7330, 44], + [7326, 6531, 2312, 6532], + [7436, 2319, 1275, 170, 757, 360, 2326, 6584], + [7466, 2321], + [7470, 1275, 360], + 563, + [7479, 1276, 284], + [7339, 6601], + 799, + 557, + 465, + 558, + [7365, 116, 1286, 2335], + [7372, 758, 287, 1282], + 803, + [7375, 116, 1283, 450], + [ + 7391, + 116, + 759, + 1283, + 2335, + 758, + 2339, + 1282, + 2340, + 1287, + 2341, + 450, + 6614, + 2336, + 6608, + 6610, + 2334, + 543, + 1286, + 2338 + ], + [7416, 6742], + [ + 7412, + 6743, + 364, + 2370, + 291, + 2368, + 1298, + 76, + 45, + 1293, + 2349, + 6657, + 544, + 6734, + 1291, + 2347, + 6678, + 63 + ], + [7330, 45], + [7326, 6683, 2350, 6684], + [7436, 2357, 1294, 171, 763, 363, 2364, 6736], + [7466, 2359], + [7470, 1294, 363], + 563, + [7479, 1295, 289], + [7339, 6753], + 799, + 557, + 465, + 558, + [7365, 117, 1305, 2373], + [7372, 764, 292, 1301], + 803, + [7375, 117, 1302, 452], + [ + 7391, + 117, + 765, + 1302, + 2373, + 764, + 2377, + 1301, + 2378, + 1306, + 2379, + 452, + 6766, + 2374, + 6760, + 6762, + 2372, + 545, + 1305, + 2376 + ], + 799, + 557, + 465, + 558, + [7365, 118, 1314, 2387], + [7372, 769, 294, 1310], + 803, + [7375, 118, 1311, 453], + [ + 7391, + 118, + 770, + 1311, + 2387, + 769, + 2391, + 1310, + 2392, + 1315, + 2393, + 453, + 6812, + 2388, + 6806, + 6808, + 2386, + 546, + 1314, + 2390 + ], + [ + 7412, + 6789, + 365, + 2384, + 293, + 2382, + 768, + 53, + 27, + 1319, + 2407, + 6842, + 547, + 6892, + 1318, + 2397, + 6865, + 30 + ], + [7330, 27], + [7436, 6875, 2403, 773, 1322, 548, 6891, 6894], + [7470, 2403, 548], + 563, + [7471, 1320, 1321, 454], + [7416, 6788], + [7455, 2422], + [7470, 2416, 455], + 563, + [7479, 1325, 296], + function(e, t, r) { + "use strict" + var n = r(46)["default"] + t.__esModule = !0 + var i = r(64), + s = n(i) + ;(t["default"] = function() { + return { + visitor: { + Program: function(e, t) { + if (t.opts.strict !== !1) { + for ( + var r = e.node, n = r.directives, i = 0; + i < n.length; + i++ + ) { + var a = n[i] + if ("use strict" === a.value.value) return + } + e.unshiftContainer( + "directives", + s.directive(s.directiveLiteral("use strict")) + ) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7339, 6985], + 799, + 557, + 465, + 558, + [7365, 119, 1336, 2429], + [7372, 777, 300, 1332], + 803, + [7375, 119, 1333, 456], + [ + 7391, + 119, + 778, + 1333, + 2429, + 777, + 2433, + 1332, + 2434, + 1337, + 2435, + 456, + 6998, + 2430, + 6992, + 6994, + 2428, + 549, + 1336, + 2432 + ], + [7416, 6974], + [ + 7412, + 6975, + 367, + 2426, + 299, + 2424, + 1329, + 78, + 46, + 1342, + 2442, + 7039, + 550, + 7115, + 1341, + 2440, + 7060, + 64 + ], + [7330, 46], + [7436, 2451, 1343, 172, 782, 369, 2458, 7117], + [7466, 2453], + [7470, 1343, 369], + 563, + [7479, 1344, 302], + [7334, 7136], + [7339, 7141], + 799, + 557, + 465, + 558, + [7365, 120, 1355, 2466], + [7372, 783, 304, 1351], + 803, + [7375, 120, 1352, 458], + [ + 7391, + 120, + 784, + 1352, + 2466, + 783, + 2470, + 1351, + 2471, + 1356, + 2472, + 458, + 7154, + 2467, + 7148, + 7150, + 2465, + 551, + 1355, + 2469 + ], + [7416, 7130], + [ + 7412, + 7131, + 370, + 2463, + 173, + 1347, + 1348, + 79, + 47, + 1361, + 2479, + 7195, + 552, + 7271, + 1360, + 2477, + 7216, + 65 + ], + [7330, 47], + [7436, 2488, 1362, 174, 788, 372, 2495, 7273], + [7466, 2490], + [7470, 1362, 372], + 563, + [7479, 1363, 306], + function(e, t, r) { + "use strict" + function n(e) { + throw new Error("The (" + e + ") Babel 5 plugin is being run with Babel 6.") + } + function i(e, t, r) { + c["default"](t) && ((r = t), (t = {})), + (t.filename = e), + f["default"].readFile(e, function(e, n) { + var i = void 0 + if (!e) + try { + i = k(n, t) + } catch (s) { + e = s + } + e ? r(e) : r(null, i) + }) + } + function s(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? {} : arguments[1] + return (t.filename = e), k(f["default"].readFileSync(e, "utf8"), t) + } + var a = r(5)["default"], + o = r(3)["default"], + u = r(798)["default"] + ;(t.__esModule = !0), + (t.Plugin = n), + (t.transformFile = i), + (t.transformFileSync = s) + var l = r(1415), + c = a(l), + p = r(373), + f = a(p), + h = r(795), + d = o(h), + m = r(176), + y = o(m), + v = r(16), + g = o(v), + E = r(147), + b = a(E), + x = r(461), + A = a(x), + D = r(2512), + C = a(D), + S = r(791) + t.File = u(S) + var F = r(460) + t.options = u(F) + var w = r(2507) + t.buildExternalHelpers = u(w) + var _ = r(807) + t.template = u(_) + var T = r(7279) + ;(t.version = T.version), + (t.util = d), + (t.messages = y), + (t.types = g), + (t.traverse = b["default"]), + (t.OptionManager = A["default"]), + (t.Pipeline = C["default"]) + var P = new C["default"](), + B = P.analyse.bind(P) + t.analyse = B + var k = P.transform.bind(P) + t.transform = k + var I = P.transformFromAst.bind(P) + t.transformFromAst = I + }, + function(e, t, r) { + function n(e) { + return r(i(e)) + } + function i(e) { + return ( + s[e] || + (function() { + throw new Error("Cannot find module '" + e + "'.") + })() + ) + } + var s = { + "./config": 460, + "./config.js": 460, + "./index": 792, + "./index.js": 792, + "./option-manager": 461, + "./option-manager.js": 461, + "./parsers": 793, + "./parsers.js": 793, + "./removed": 794, + "./removed.js": 794 + } + ;(n.keys = function() { + return Object.keys(s) + }), + (n.resolve = i), + (e.exports = n), + (n.id = 1367) + }, + [7317, 5, 2529, 2531, 2528, 2527, 2514], + [7320, 2516], + function(e, t) { + !(function() { + "use strict" + function t(e) { + return e >= 48 && 57 >= e + } + function r(e) { + return (e >= 48 && 57 >= e) || (e >= 97 && 102 >= e) || (e >= 65 && 70 >= e) + } + function n(e) { + return e >= 48 && 55 >= e + } + function i(e) { + return ( + 32 === e || + 9 === e || + 11 === e || + 12 === e || + 160 === e || + (e >= 5760 && h.indexOf(e) >= 0) + ) + } + function s(e) { + return 10 === e || 13 === e || 8232 === e || 8233 === e + } + function a(e) { + if (65535 >= e) return String.fromCharCode(e) + var t = String.fromCharCode(Math.floor((e - 65536) / 1024) + 55296), + r = String.fromCharCode(((e - 65536) % 1024) + 56320) + return t + r + } + function o(e) { + return 128 > e ? d[e] : f.NonAsciiIdentifierStart.test(a(e)) + } + function u(e) { + return 128 > e ? m[e] : f.NonAsciiIdentifierPart.test(a(e)) + } + function l(e) { + return 128 > e ? d[e] : p.NonAsciiIdentifierStart.test(a(e)) + } + function c(e) { + return 128 > e ? m[e] : p.NonAsciiIdentifierPart.test(a(e)) + } + var p, f, h, d, m, y + for ( + f = { + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, + NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ + }, + p = { + NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B2\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDE00-\uDE11\uDE13-\uDE2B\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDE00-\uDE2F\uDE44\uDE80-\uDEAA]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]/, + NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B2\u08E4-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA69D\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA7AD\uA7B0\uA7B1\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB5F\uAB64\uAB65\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2D\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDD0-\uDDDA\uDE00-\uDE11\uDE13-\uDE37\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF01-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF98]|\uD809[\uDC00-\uDC6E]|[\uD80C\uD840-\uD868\uD86A-\uD86C][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ + }, + h = [ + 5760, + 6158, + 8192, + 8193, + 8194, + 8195, + 8196, + 8197, + 8198, + 8199, + 8200, + 8201, + 8202, + 8239, + 8287, + 12288, + 65279 + ], + d = new Array(128), + y = 0; + 128 > y; + ++y + ) + d[y] = (y >= 97 && 122 >= y) || (y >= 65 && 90 >= y) || 36 === y || 95 === y + for (m = new Array(128), y = 0; 128 > y; ++y) + m[y] = + (y >= 97 && 122 >= y) || + (y >= 65 && 90 >= y) || + (y >= 48 && 57 >= y) || + 36 === y || + 95 === y + e.exports = { + isDecimalDigit: t, + isHexDigit: r, + isOctalDigit: n, + isWhiteSpace: i, + isLineTerminator: s, + isIdentifierStartES5: o, + isIdentifierPartES5: u, + isIdentifierStartES6: l, + isIdentifierPartES6: c + } + })() + }, + function(e, t, r) { + "use strict" + function n(e) { + this.push(e.name) + } + function i(e) { + this.push("..."), this.print(e.argument, e) + } + function s(e) { + var t = e.properties + this.push("{"), + this.printInnerComments(e), + t.length && + (this.space(), this.printList(t, e, { indent: !0 }), this.space()), + this.push("}") + } + function a(e) { + this.printJoin(e.decorators, e, { separator: "" }), this._method(e) + } + function o(e) { + if ((this.printJoin(e.decorators, e, { separator: "" }), e.computed)) + this.push("["), this.print(e.key, e), this.push("]") + else { + if ( + v.isAssignmentPattern(e.value) && + v.isIdentifier(e.key) && + e.key.name === e.value.left.name + ) + return void this.print(e.value, e) + if ( + (this.print(e.key, e), + e.shorthand && + v.isIdentifier(e.key) && + v.isIdentifier(e.value) && + e.key.name === e.value.name) + ) + return + } + this.push(":"), this.space(), this.print(e.value, e) + } + function u(e) { + var t = e.elements, + r = t.length + this.push("["), this.printInnerComments(e) + for (var n = 0; n < t.length; n++) { + var i = t[n] + i + ? (n > 0 && this.space(), this.print(i, e), r - 1 > n && this.push(",")) + : this.push(",") + } + this.push("]") + } + function l(e) { + this.push("/" + e.pattern + "/" + e.flags) + } + function c(e) { + this.push(e.value ? "true" : "false") + } + function p() { + this.push("null") + } + function f(e) { + this.push(e.value + "") + } + function h(e, t) { + this.push(this._stringLiteral(e.value, t)) + } + function d(e, t) { + return ( + (e = JSON.stringify(e)), + (e = e.replace(/[\u000A\u000D\u2028\u2029]/g, function(e) { + return "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4) + })), + "single" !== this.format.quotes || + v.isJSX(t) || + ((e = e.slice(1, -1)), + (e = e.replace(/\\"/g, '"')), + (e = e.replace(/'/g, "\\'")), + (e = "'" + e + "'")), + e + ) + } + var m = r(3)["default"] + ;(t.__esModule = !0), + (t.Identifier = n), + (t.RestElement = i), + (t.ObjectExpression = s), + (t.ObjectMethod = a), + (t.ObjectProperty = o), + (t.ArrayExpression = u), + (t.RegExpLiteral = l), + (t.BooleanLiteral = c), + (t.NullLiteral = p), + (t.NumericLiteral = f), + (t.StringLiteral = h), + (t._stringLiteral = d) + var y = r(16), + v = m(y) + ;(t.SpreadElement = i), + (t.SpreadProperty = i), + (t.RestProperty = i), + (t.ObjectPattern = s), + (t.ArrayPattern = u) + }, + function(e, t, r) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(5)["default"], + a = r(3)["default"] + t.__esModule = !0 + var o = r(2550), + u = s(o), + l = r(2549), + c = s(l), + p = r(2548), + f = s(p), + h = r(2546), + d = s(h), + m = r(176), + y = a(m), + v = r(2547), + g = s(v), + E = (function(e) { + function t(r, n, s) { + i(this, t), (n = n || {}) + var a = r.comments || [], + o = r.tokens || [], + u = t.normalizeOptions(s, n, o), + l = new d["default"]() + e.call(this, l, u), + (this.comments = a), + (this.position = l), + (this.tokens = o), + (this.format = u), + (this.opts = n), + (this.ast = r), + (this._inForStatementInitCounter = 0), + (this.whitespace = new c["default"](o)), + (this.map = new f["default"](l, n, s)) + } + return ( + n(t, e), + (t.normalizeOptions = function(e, r, n) { + var i = " " + if (e) { + var s = u["default"](e).indent + s && " " !== s && (i = s) + } + var a = { + auxiliaryCommentBefore: r.auxiliaryCommentBefore, + auxiliaryCommentAfter: r.auxiliaryCommentAfter, + shouldPrintComment: r.shouldPrintComment, + retainLines: r.retainLines, + comments: null == r.comments || r.comments, + compact: r.compact, + minified: r.minified, + concise: r.concise, + quotes: r.quotes || t.findCommonStringDelimiter(e, n), + indent: { adjustMultilineComment: !0, style: i, base: 0 } + } + return ( + a.minified && (a.compact = !0), + "auto" === a.compact && + ((a.compact = e.length > 1e5), + a.compact && + console.error( + "[BABEL] " + + y.get("codeGeneratorDeopt", r.filename, "100KB") + )), + a.compact && (a.indent.adjustMultilineComment = !1), + a + ) + }), + (t.findCommonStringDelimiter = function(e, t) { + for ( + var r = { single: 0, double: 0 }, n = 0, i = 0; + i < t.length; + i++ + ) { + var s = t[i] + if ("string" === s.type.label) { + var a = e.slice(s.start, s.end) + if ( + ("'" === a[0] ? r.single++ : r["double"]++, n++, n >= 3) + ) + break + } + } + return r.single > r["double"] ? "single" : "double" + }), + (t.prototype.generate = function() { + return ( + this.print(this.ast), + this.printAuxAfterComment(), + { map: this.map.get(), code: this.get() } + ) + }), + t + ) + })(g["default"]) + ;(t.CodeGenerator = E), + (t["default"] = function(e, t, r) { + var n = new E(e, t, r) + return n.generate() + }) + }, + function(e, t, r) { + "use strict" + function n(e, t, r, n) { + if (e) { + for (var i = void 0, s = c(e), a = 0; a < s.length; a++) { + var o = s[a] + if (g.is(o, t)) { + var u = e[o] + if (((i = u(t, r, n)), null != i)) break + } + } + return i + } + } + function i(e) { + return g.isCallExpression(e) + ? !0 + : g.isMemberExpression(e) + ? i(e.object) || (!e.computed && i(e.property)) + : !1 + } + function s(e) { + return g.isUserWhitespacable(e) + } + function a(e, t, r) { + if (!e) return 0 + g.isExpressionStatement(e) && (e = e.expression) + var i = n(d["default"].nodes, e, t) + if (!i) { + var s = n(d["default"].list, e, t) + if (s) for (var o = 0; o < s.length && !(i = a(s[o], e, r)); o++); + } + return (i && i[r]) || 0 + } + function o(e, t) { + return a(e, t, "before") + } + function u(e, t) { + return a(e, t, "after") + } + function l(e, t, r) { + return t + ? g.isNewExpression(t) && t.callee === e && i(e) + ? !0 + : n(y, e, t, r) + : !1 + } + var c = r(462)["default"], + p = r(5)["default"], + f = r(3)["default"] + ;(t.__esModule = !0), + (t.isUserWhitespacable = s), + (t.needsWhitespace = a), + (t.needsWhitespaceBefore = o), + (t.needsWhitespaceAfter = u), + (t.needsParens = l) + var h = r(2545), + d = p(h), + m = r(2544), + y = f(m), + v = r(16), + g = f(v) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = o["default"][e] + if (!t) throw new ReferenceError("Unknown helper " + e) + return t().expression + } + var i = r(462)["default"], + s = r(5)["default"] + ;(t.__esModule = !0), (t.get = n) + var a = r(2557), + o = s(a), + u = i(o["default"]) + .map(function(e) { + return "_" === e[0] ? e.slice(1) : e + }) + .filter(function(e) { + return "__esModule" !== e + }) + ;(t.list = u), (t["default"] = n) + }, + [7335, 2573], + [7359, 799, 178], + [7364, 469, 81], + [7366, 799], + function(e, t) { + e.exports = function(e, t) { + return { value: t, done: !!e } + } + }, + function(e, t) { + e.exports = !0 + }, + function(e, t, r) { + var n = r(804) + e.exports = function(e, t) { + for (var r in t) n(e, r, t[r]) + return e + } + }, + [7376, 466], + function(e, t) { + e.exports = function(e, t, r) { + if (!(e instanceof t)) throw TypeError(r + ": use the 'new' operator!") + return e + } + }, + function(e, t) { + var r = Math.ceil, + n = Math.floor + e.exports = function(e) { + return isNaN((e = +e)) ? 0 : (e > 0 ? n : r)(e) + } + }, + [7379, 557], + [7381, 1376, 178, 468, 98], + 373, + [7390, 2595, 801], + [7392, 2598, 468], + [7395, 80], + function(e, t) { + "use strict" + t.__esModule = !0 + var r = "_paths" + t.PATH_CACHE_KEY = r + }, + [7407, 3, 16], + [7411, 80], + [7429, 555, 3, 16], + 1370, + [7432, 2648], + function(e, t) { + function r(e) { + var t = e ? e.length : 0 + return t ? e[t - 1] : void 0 + } + e.exports = r + }, + function(e, t) { + function r(e, t) { + if ("function" != typeof e) throw new TypeError(n) + return ( + (t = i(void 0 === t ? e.length - 1 : +t || 0, 0)), + function() { + for ( + var r = arguments, n = -1, s = i(r.length - t, 0), a = Array(s); + ++n < s; + + ) + a[n] = r[t + n] + switch (t) { + case 0: + return e.call(this, a) + case 1: + return e.call(this, r[0], a) + case 2: + return e.call(this, r[0], r[1], a) + } + var o = Array(t + 1) + for (n = -1; ++n < t; ) o[n] = r[n] + return (o[t] = a), e.apply(this, o) + } + ) + } + var n = "Expected a function", + i = Math.max + e.exports = r + }, + function(e, t) { + function r(e, t) { + var r = -1, + n = e.length + for (t || (t = Array(n)); ++r < n; ) t[r] = e[r] + return t + } + e.exports = r + }, + [7439, 1402, 309], + [7441, 1399, 812, 1400, 1405, 2688, 2689, 2690, 94, 99], + function(e, t) { + function r(e, t, r) { + r || (r = {}) + for (var n = -1, i = t.length; ++n < i; ) { + var s = t[n] + r[s] = e[s] + } + return r + } + e.exports = r + }, + [7442, 1405, 2677], + [7443, 2678], + [7445, 1404, 309], + [7447, 2687], + [7448, 2663, 99, 148], + function(e, t, r) { + function n(e, t) { + var r = -1, + n = s(e) ? Array(e.length) : [] + return ( + i(e, function(e, i, s) { + n[++r] = t(e, i, s) + }), + n + ) + } + var i = r(1403), + s = r(375) + e.exports = n + }, + function(e, t) { + function r(e) { + return function(t) { + return null == t ? void 0 : t[e] + } + } + e.exports = r + }, + function(e, t) { + function r(e, t, r) { + var n = -1, + i = e.length + ;(t = null == t ? 0 : +t || 0), + 0 > t && (t = -t > i ? 0 : i + t), + (r = void 0 === r || r > i ? i : +r || 0), + 0 > r && (r += i), + (i = t > r ? 0 : (r - t) >>> 0), + (t >>>= 0) + for (var s = Array(i); ++n < i; ) s[n] = e[n + t] + return s + } + e.exports = r + }, + [7458, 470, 471, 1398], + [7473, 99], + [7478, 1401, 470], + function(e, t, r) { + function n(e) { + return e === !0 || e === !1 || (i(e) && o.call(e) == s) + } + var i = r(148), + s = "[object Boolean]", + a = Object.prototype, + o = a.toString + e.exports = n + }, + [7481, 99], + [7483, 148], + [7484, 2662, 472, 148], + [7485, 99], + [7489, 565, 2659, 2680], + function(e, t) { + function r(e) { + return e + } + e.exports = r + }, + function(e, t) { + "use strict" + e.exports = function(e) { + var t = /^\\\\\?\\/.test(e), + r = /[^\x00-\x80]+/.test(e) + return t || r ? e : e.replace(/\\/g, "/") + } + }, + function(e, t, r) { + function n() { + ;(this._array = []), (this._set = {}) + } + var i = r(473) + ;(n.fromArray = function(e, t) { + for (var r = new n(), i = 0, s = e.length; s > i; i++) r.add(e[i], t) + return r + }), + (n.prototype.size = function() { + return Object.getOwnPropertyNames(this._set).length + }), + (n.prototype.add = function(e, t) { + var r = i.toSetString(e), + n = this._set.hasOwnProperty(r), + s = this._array.length + ;(n && !t) || this._array.push(e), n || (this._set[r] = s) + }), + (n.prototype.has = function(e) { + var t = i.toSetString(e) + return this._set.hasOwnProperty(t) + }), + (n.prototype.indexOf = function(e) { + var t = i.toSetString(e) + if (this._set.hasOwnProperty(t)) return this._set[t] + throw new Error('"' + e + '" is not in the set.') + }), + (n.prototype.at = function(e) { + if (e >= 0 && e < this._array.length) return this._array[e] + throw new Error("No element indexed by " + e) + }), + (n.prototype.toArray = function() { + return this._array.slice() + }), + (t.ArraySet = n) + }, + function(e, t, r) { + function n(e) { + return 0 > e ? (-e << 1) + 1 : (e << 1) + 0 + } + function i(e) { + var t = 1 === (1 & e), + r = e >> 1 + return t ? -r : r + } + var s = r(2709), + a = 5, + o = 1 << a, + u = o - 1, + l = o + ;(t.encode = function(e) { + var t, + r = "", + i = n(e) + do (t = i & u), (i >>>= a), i > 0 && (t |= l), (r += s.encode(t)) + while (i > 0) + return r + }), + (t.decode = function(e, t, r) { + var n, + o, + c = e.length, + p = 0, + f = 0 + do { + if (t >= c) + throw new Error("Expected more digits in base 64 VLQ value.") + if (((o = s.decode(e.charCodeAt(t++))), -1 === o)) + throw new Error("Invalid base64 digit: " + e.charAt(t - 1)) + ;(n = !!(o & l)), (o &= u), (p += o << f), (f += a) + } while (n) + ;(r.value = i(p)), (r.rest = t) + }) + }, + function(e, t, r) { + function n(e) { + e || (e = {}), + (this._file = s.getArg(e, "file", null)), + (this._sourceRoot = s.getArg(e, "sourceRoot", null)), + (this._skipValidation = s.getArg(e, "skipValidation", !1)), + (this._sources = new a()), + (this._names = new a()), + (this._mappings = new o()), + (this._sourcesContents = null) + } + var i = r(1423), + s = r(473), + a = r(1422).ArraySet, + o = r(2711).MappingList + ;(n.prototype._version = 3), + (n.fromSourceMap = function(e) { + var t = e.sourceRoot, + r = new n({ file: e.file, sourceRoot: t }) + return ( + e.eachMapping(function(e) { + var n = { + generated: { line: e.generatedLine, column: e.generatedColumn } + } + null != e.source && + ((n.source = e.source), + null != t && (n.source = s.relative(t, n.source)), + (n.original = { + line: e.originalLine, + column: e.originalColumn + }), + null != e.name && (n.name = e.name)), + r.addMapping(n) + }), + e.sources.forEach(function(t) { + var n = e.sourceContentFor(t) + null != n && r.setSourceContent(t, n) + }), + r + ) + }), + (n.prototype.addMapping = function(e) { + var t = s.getArg(e, "generated"), + r = s.getArg(e, "original", null), + n = s.getArg(e, "source", null), + i = s.getArg(e, "name", null) + this._skipValidation || this._validateMapping(t, r, n, i), + null == n || this._sources.has(n) || this._sources.add(n), + null == i || this._names.has(i) || this._names.add(i), + this._mappings.add({ + generatedLine: t.line, + generatedColumn: t.column, + originalLine: null != r && r.line, + originalColumn: null != r && r.column, + source: n, + name: i + }) + }), + (n.prototype.setSourceContent = function(e, t) { + var r = e + null != this._sourceRoot && (r = s.relative(this._sourceRoot, r)), + null != t + ? (this._sourcesContents || (this._sourcesContents = {}), + (this._sourcesContents[s.toSetString(r)] = t)) + : this._sourcesContents && + (delete this._sourcesContents[s.toSetString(r)], + 0 === Object.keys(this._sourcesContents).length && + (this._sourcesContents = null)) + }), + (n.prototype.applySourceMap = function(e, t, r) { + var n = t + if (null == t) { + if (null == e.file) + throw new Error( + 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.' + ) + n = e.file + } + var i = this._sourceRoot + null != i && (n = s.relative(i, n)) + var o = new a(), + u = new a() + this._mappings.unsortedForEach(function(t) { + if (t.source === n && null != t.originalLine) { + var a = e.originalPositionFor({ + line: t.originalLine, + column: t.originalColumn + }) + null != a.source && + ((t.source = a.source), + null != r && (t.source = s.join(r, t.source)), + null != i && (t.source = s.relative(i, t.source)), + (t.originalLine = a.line), + (t.originalColumn = a.column), + null != a.name && (t.name = a.name)) + } + var l = t.source + null == l || o.has(l) || o.add(l) + var c = t.name + null == c || u.has(c) || u.add(c) + }, this), + (this._sources = o), + (this._names = u), + e.sources.forEach(function(t) { + var n = e.sourceContentFor(t) + null != n && + (null != r && (t = s.join(r, t)), + null != i && (t = s.relative(i, t)), + this.setSourceContent(t, n)) + }, this) + }), + (n.prototype._validateMapping = function(e, t, r, n) { + if ( + (!(e && "line" in e && "column" in e && e.line > 0 && e.column >= 0) || + t || + r || + n) && + !( + e && + "line" in e && + "column" in e && + t && + "line" in t && + "column" in t && + e.line > 0 && + e.column >= 0 && + t.line > 0 && + t.column >= 0 && + r + ) + ) + throw new Error( + "Invalid mapping: " + + JSON.stringify({ + generated: e, + source: r, + original: t, + name: n + }) + ) + }), + (n.prototype._serializeMappings = function() { + for ( + var e, + t, + r, + n = 0, + a = 1, + o = 0, + u = 0, + l = 0, + c = 0, + p = "", + f = this._mappings.toArray(), + h = 0, + d = f.length; + d > h; + h++ + ) { + if (((e = f[h]), e.generatedLine !== a)) + for (n = 0; e.generatedLine !== a; ) (p += ";"), a++ + else if (h > 0) { + if (!s.compareByGeneratedPositionsInflated(e, f[h - 1])) continue + p += "," + } + ;(p += i.encode(e.generatedColumn - n)), + (n = e.generatedColumn), + null != e.source && + ((r = this._sources.indexOf(e.source)), + (p += i.encode(r - c)), + (c = r), + (p += i.encode(e.originalLine - 1 - u)), + (u = e.originalLine - 1), + (p += i.encode(e.originalColumn - o)), + (o = e.originalColumn), + null != e.name && + ((t = this._names.indexOf(e.name)), + (p += i.encode(t - l)), + (l = t))) + } + return p + }), + (n.prototype._generateSourcesContent = function(e, t) { + return e.map(function(e) { + if (!this._sourcesContents) return null + null != t && (e = s.relative(t, e)) + var r = s.toSetString(e) + return Object.prototype.hasOwnProperty.call(this._sourcesContents, r) + ? this._sourcesContents[r] + : null + }, this) + }), + (n.prototype.toJSON = function() { + var e = { + version: this._version, + sources: this._sources.toArray(), + names: this._names.toArray(), + mappings: this._serializeMappings() + } + return ( + null != this._file && (e.file = this._file), + null != this._sourceRoot && (e.sourceRoot = this._sourceRoot), + this._sourcesContents && + (e.sourcesContent = this._generateSourcesContent( + e.sources, + e.sourceRoot + )), + e + ) + }), + (n.prototype.toString = function() { + return JSON.stringify(this.toJSON()) + }), + (t.SourceMapGenerator = n) + }, + function(e, t, r) { + ;(t.SourceMapGenerator = r(1424).SourceMapGenerator), + (t.SourceMapConsumer = r(2713).SourceMapConsumer), + (t.SourceNode = r(2714).SourceNode) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("classConstructorCall") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("classProperties") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("decorators") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("doExpressions") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("exponentiationOperator") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("exportExtensions") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("functionBind") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("objectRestSpread") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("trailingFunctionCommas") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(48)["default"] + t.__esModule = !0 + var i = r(2718), + s = n(i) + ;(t["default"] = function() { + return { + inherits: r(567), + visitor: { + Function: function(e, t) { + e.node.async && + !e.node.generator && + s["default"](e, t.addHelper("asyncToGenerator")) + } + } + } + }), + (e.exports = t["default"]) + }, + [7393, 841, 48, 29, 2746, 2749, 2750, 378, 2721, 33], + [7439, 2728, 828], + [7455, 2752], + [7468, 2748], + [7395, 311], + 1391, + [7407, 29, 33], + [7411, 311], + [7320, 2774], + 1370, + 1398, + [7439, 2800, 571], + [7455, 2823], + [7466, 2804], + [7468, 2818], + [7479, 832, 569], + [7488, 2798, 1447, 2807], + [7328, 2824], + [7429, 1469, 29, 33], + 1370, + 812, + [7443, 2867], + [7445, 1457, 573], + [7446, 184], + [7448, 2855, 121, 183], + 1409, + [7466, 1461], + [7471, 837, 838, 121], + [7472, 185, 184], + [7473, 121], + [7476, 2861, 185], + [7492, 839, 185, 838, 380, 121], + 1420, + [7334, 2903], + [7335, 2904], + 581, + [7358, 2917], + [7361, 574], + [7364, 477, 95], + [7366, 842], + [7369, 1477, 476, 1478, 845, 844, 576, 2918, 848, 95, 381], + 1380, + [7373, 845], + [7376, 575], + [7379, 843], + 805, + [7393, 482, 17, 6, 2964, 2967, 2968, 479, 2939, 11], + [7439, 2946, 854], + [7455, 2970], + [7468, 2966], + [7395, 86], + 1391, + [7407, 6, 11], + [7411, 86], + [7320, 2992], + 1370, + 1398, + [7439, 3018, 580], + [7455, 3041], + [7466, 3022], + [7468, 3036], + [7479, 858, 578], + [7488, 3016, 1493, 3025], + [7328, 3042], + [7335, 3055], + [7338, 3058], + [7343, 1500], + [7358, 3068], + [7361, 582], + [7364, 484, 96], + [7366, 862], + [7369, 1508, 483, 1509, 865, 864, 584, 3069, 868, 96, 385], + 1380, + [7373, 865], + [7376, 583], + [7379, 863], + 805, + [7429, 861, 6, 11], + [7395, 86], + 1391, + [7407, 6, 11], + [7411, 86], + [7320, 3118], + [7328, 3136], + 1370, + [7326, 3138, 1520, 3139], + 1398, + 812, + [7439, 3152, 386], + [7443, 3169], + [7445, 1525, 386], + [7446, 189], + [7447, 3177], + [7448, 3155, 122, 188], + 1409, + [7472, 159, 189], + [7473, 122], + [7476, 3161, 159], + [7477, 3151, 585, 587], + [7486, 188], + [7488, 3149, 1524, 3167], + [7492, 877, 159, 876, 314, 122], + 1420, + function(e, t, r) { + "use strict" + var n = r(588)["default"], + i = r(66)["default"] + t.__esModule = !0 + var s = r(3236), + a = i(s), + o = a["default"]( + "\n let CLASS_REF = CLASS;\n var CALL_REF = CALL;\n var WRAPPER_REF = function (...args) {\n if (this instanceof WRAPPER_REF) {\n return Reflect.construct(CLASS_REF, args);\n } else {\n return CALL_REF.apply(this, args);\n }\n };\n WRAPPER_REF.__proto__ = CLASS_REF;\n WRAPPER_REF;\n" + ) + ;(t["default"] = function(e) { + function t(e) { + for (var t = e.get("body.body"), r = 0; r < t.length; r++) { + var n = t[r] + if ("constructorCall" === n.node.kind) return n + } + return null + } + function i(e, t) { + var r = t, + n = r.node, + i = n.id || t.scope.generateUidIdentifier("class") + t.parentPath.isExportDefaultDeclaration() && + ((t = t.parentPath), t.insertAfter(s.exportDefaultDeclaration(i))), + t.replaceWithMultiple( + o({ + CLASS_REF: t.scope.generateUidIdentifier(i.name), + CALL_REF: t.scope.generateUidIdentifier(i.name + "Call"), + CALL: s.functionExpression(null, e.node.params, e.node.body), + CLASS: s.toExpression(n), + WRAPPER_REF: i + }) + ), + e.remove() + } + var s = e.types, + a = n() + return { + inherits: r(1426), + visitor: { + Class: function(e) { + if (!e.node[a]) { + e.node[a] = !0 + var r = t(e) + r && i(r, e) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7334, 3204], + [7335, 3205], + 581, + [7358, 3219], + [7361, 881], + [7364, 486, 100], + [7369, 1547, 589, 1548, 883, 882, 591, 3220, 886, 100, 387], + 1380, + [7373, 883], + [7376, 590], + 805, + [7395, 315], + 1391, + [7407, 38, 54], + [7411, 315], + [7320, 3258], + 1370, + [7328, 3278], + [7429, 1540, 38, 54], + 1370, + 810, + 1397, + 1398, + 812, + [7439, 3305, 389], + [7441, 3300, 1563, 1564, 1567, 3330, 3331, 3332, 149, 123], + [7443, 3321], + [7445, 1566, 389], + [7447, 3329], + [7448, 3308, 123, 194], + 1409, + 1410, + [7473, 123], + [7477, 1565, 487, 594], + [7486, 194], + [7492, 595, 149, 593, 193, 123], + 1420, + function(e, t, r) { + "use strict" + var n = r(3347)["default"] + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types, + i = { + Super: function(e) { + e.parentPath.isCallExpression({ callee: e.node }) && + this.push(e.parentPath) + } + }, + s = { + ReferencedIdentifier: function(e) { + this.scope.hasOwnBinding(e.node.name) && + ((this.collision = !0), e.skip()) + } + } + return { + inherits: r(1427), + visitor: { + Class: function(e) { + for ( + var r = !!e.node.superClass, + a = void 0, + o = [], + u = e.get("body"), + l = u.get("body"), + c = Array.isArray(l), + p = 0, + l = c ? l : n(l); + ; + + ) { + var f + if (c) { + if (p >= l.length) break + f = l[p++] + } else { + if (((p = l.next()), p.done)) break + f = p.value + } + var h = f + h.isClassProperty() + ? o.push(h) + : h.isClassMethod({ kind: "constructor" }) && (a = h) + } + if (o.length) { + var d = [], + m = void 0 + m = + e.isClassExpression() || !e.node.id + ? e.scope.generateUidIdentifier("class") + : e.node.id + for (var y = [], v = 0; v < o.length; v++) { + var g = o[v], + E = g.node + if ( + !(E.decorators && E.decorators.length > 0) && + E.value + ) { + var b = E["static"] + b + ? d.push( + t.expressionStatement( + t.assignmentExpression( + "=", + t.memberExpression(m, E.key), + E.value + ) + ) + ) + : y.push( + t.expressionStatement( + t.assignmentExpression( + "=", + t.memberExpression( + t.thisExpression(), + E.key + ), + E.value + ) + ) + ) + } + } + if (y.length) { + if (!a) { + var x = t.classMethod( + "constructor", + t.identifier("constructor"), + [], + t.blockStatement([]) + ) + r && + ((x.params = [ + t.restElement(t.identifier("args")) + ]), + x.body.body.push( + t.returnStatement( + t.callExpression(t["super"](), [ + t.spreadElement( + t.identifier("args") + ) + ]) + ) + )) + var A = u.unshiftContainer("body", x) + a = A[0] + } + for ( + var D = { collision: !1, scope: a.scope }, C = 0; + C < o.length; + C++ + ) { + var g = o[C] + if ((g.traverse(s, D), D.collision)) break + } + if (D.collision) { + var S = e.scope.generateUidIdentifier( + "initialiseProps" + ) + d.push( + t.variableDeclaration("var", [ + t.variableDeclarator( + S, + t.functionExpression( + null, + [], + t.blockStatement(y) + ) + ) + ]) + ), + (y = [ + t.expressionStatement( + t.callExpression( + t.memberExpression( + S, + t.identifier("call") + ), + [t.thisExpression()] + ) + ) + ]) + } + if (r) { + var F = [] + a.traverse(i, F) + for (var w = 0; w < F.length; w++) { + var _ = F[w] + _.insertAfter(y) + } + } else a.get("body").unshiftContainer("body", y) + } + for (var T = 0; T < o.length; T++) { + var g = o[T] + g.remove() + } + d.length && + (e.isClassExpression() + ? (e.scope.push({ id: m }), + e.replaceWith( + t.assignmentExpression("=", m, e.node) + )) + : (e.node.id || (e.node.id = m), + e.parentPath.isExportDeclaration() && + (e = e.parentPath)), + e.insertAfter(d)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 799, + 557, + 558, + [7369, 3361, 3355, 3362, 900, 1580, 596, 3359, 1583, 597, 488], + 803, + [7375, 597, 1580, 488], + [7334, 3386], + [7335, 3387], + 581, + [7358, 3401], + [7361, 905], + [7364, 489, 101], + [7369, 1591, 598, 1592, 907, 906, 600, 3402, 910, 101, 390], + 1380, + [7373, 907], + [7376, 599], + 805, + [7395, 317], + 1391, + [7407, 39, 55], + [7411, 317], + [7320, 3439], + 1370, + [7328, 3459], + [7429, 1584, 39, 55], + 1370, + 810, + 1397, + 1398, + 812, + [7439, 3486, 392], + [7441, 3481, 1607, 1608, 1611, 3511, 3512, 3513, 150, 124], + [7443, 3502], + [7445, 1610, 392], + [7447, 3510], + [7448, 3489, 124, 200], + 1409, + 1410, + [7473, 124], + [7477, 1609, 490, 603], + [7486, 200], + [7492, 604, 150, 602, 199, 124], + 1420, + function(e, t, r) { + "use strict" + var n = r(83)["default"], + i = r(605)["default"], + s = r(18)["default"] + t.__esModule = !0 + var a = r(3570), + o = s(a), + u = r(3528), + l = s(u), + c = o["default"]("\n CLASS_REF = DECORATOR(CLASS_REF) || CLASS_REF;\n") + ;(t["default"] = function(e) { + function t(e) { + return e.reverse().map(function(e) { + return e.expression + }) + } + function s(e, r, s) { + var a = [], + o = e.node.decorators + if (o) { + ;(e.node.decorators = null), (o = t(o)) + for (var l = o, p = Array.isArray(l), f = 0, l = p ? l : n(l); ; ) { + var h + if (p) { + if (f >= l.length) break + h = l[f++] + } else { + if (((f = l.next()), f.done)) break + h = f.value + } + var d = h + a.push(c({ CLASS_REF: r, DECORATOR: d })) + } + } + for ( + var m = i(null), + y = e.get("body.body"), + v = Array.isArray(y), + g = 0, + y = v ? y : n(y); + ; + + ) { + var E + if (v) { + if (g >= y.length) break + E = y[g++] + } else { + if (((g = y.next()), g.done)) break + E = g.value + } + var b = E, + x = b.node.decorators + if (x) { + var A = u.toKeyAlias(b.node) + ;(m[A] = m[A] || []), m[A].push(b.node), b.remove() + } + } + for (var A in m) var D = m[A] + return a + } + function a(e) { + if (e.isClass()) { + if (e.node.decorators) return !0 + for (var t = e.node.body.body, r = 0; r < t.length; r++) { + var n = t[r] + if (n.decorators) return !0 + } + } else if (e.isObjectExpression()) + for (var i = e.node.properties, s = 0; s < i.length; s++) { + var a = i[s] + if (a.decorators) return !0 + } + return !1 + } + function o(e) { + throw e.buildCodeFrameError( + "Decorators are not supported yet in 6.x pending proposal update." + ) + } + var u = e.types + return { + inherits: r(1428), + visitor: { + ClassExpression: function(e) { + if (a(e)) { + o(e), l["default"](e) + var t = e.scope.generateDeclaredUidIdentifier("ref"), + r = [] + r.push(u.assignmentExpression("=", t, e.node)), + (r = r.concat(s(e, t, this))), + r.push(t), + e.replaceWith(u.sequenceExpression(r)) + } + }, + ClassDeclaration: function(e) { + if (a(e)) { + o(e), l["default"](e) + var t = e.node.id, + r = [] + ;(r = r.concat( + s(e, t, this).map(function(e) { + return u.expressionStatement(e) + }) + )), + r.push(u.expressionStatement(t)), + e.insertAfter(r) + } + }, + ObjectExpression: function(e) { + a(e) && o(e) + } + } + } + }), + (e.exports = t["default"]) + }, + [7335, 3539], + [7338, 3542], + [7343, 1622], + [7358, 3553], + [7361, 924], + [7364, 493, 102], + [7369, 1629, 607, 1630, 926, 925, 609, 3554, 929, 102, 393], + 1380, + [7373, 926], + [7376, 608], + 805, + [7395, 87], + 1391, + [7407, 7, 13], + [7411, 87], + [7320, 3592], + 1370, + [7328, 3612], + 810, + 1398, + [7439, 3619, 612], + [7441, 3615, 3616, 1642, 3621, 3633, 3634, 3635, 320, 395], + [7466, 3624], + [7468, 3642], + [7429, 605, 7, 13], + [7395, 87], + 1391, + [7407, 7, 13], + [7411, 87], + [7320, 3681], + [7328, 3699], + 1370, + [7326, 3701, 1653, 3702], + 1398, + 812, + [7439, 3715, 396], + [7443, 3732], + [7445, 1658, 396], + [7446, 205], + [7447, 3740], + [7448, 3718, 125, 204], + 1409, + [7472, 160, 205], + [7473, 125], + [7476, 3724, 160], + [7477, 3714, 613, 615], + [7486, 204], + [7488, 3712, 1657, 3730], + [7492, 947, 160, 946, 322, 125], + 1420, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + inherits: r(1429), + visitor: { + DoExpression: function(e) { + var t = e.node.body.body + t.length + ? e.replaceWithMultiple(t) + : e.replaceWith(e.scope.buildUndefinedNode()) + } + } + } + }), + (e.exports = t["default"]) + }, + [7335, 3769], + 581, + [7358, 3783], + [7361, 952], + [7364, 496, 103], + [7369, 1679, 620, 1680, 954, 953, 622, 3784, 957, 103, 397], + 1380, + [7373, 954], + [7376, 621], + 805, + [7395, 207], + 1391, + [7407, 31, 40], + [7411, 207], + [7320, 3823], + 1370, + [7328, 3844], + [7429, 948, 31, 40], + 1370, + 1397, + 1398, + 812, + [7439, 3871, 398], + [7441, 3866, 1694, 1695, 1698, 3896, 3897, 3898, 151, 126], + [7443, 3887], + [7445, 1697, 398], + [7447, 3895], + [7448, 3874, 126, 211], + 1409, + 1410, + [7473, 126], + [7477, 1696, 497, 625], + [7486, 211], + [7492, 626, 151, 624, 210, 126], + [7494, 3881, 398], + 1420, + function(e, t, r) { + "use strict" + var n = r(152)["default"], + i = r(161)["default"], + s = r(32)["default"], + a = r(23)["default"] + t.__esModule = !0 + var o = r(325), + u = r(3940), + l = s(u), + c = r(1713), + p = s(c), + f = r(3914), + h = a(f), + d = r(1725), + m = s(d), + y = r(26), + v = a(y), + g = m["default"]("\n (function () {\n super(...arguments);\n })\n"), + E = { + "FunctionExpression|FunctionDeclaration": function(e) { + e.is("shadow") || e.skip() + }, + Method: function(e) { + e.skip() + } + }, + b = o.visitors.merge([ + E, + { + Super: function(e) { + if ( + this.isDerived && + !this.hasBareSuper && + !e.parentPath.isCallExpression({ callee: e.node }) + ) + throw e.buildCodeFrameError( + "'super.*' is not allowed before super()" + ) + }, + CallExpression: { + exit: function(e) { + if ( + e.get("callee").isSuper() && + ((this.hasBareSuper = !0), !this.isDerived) + ) + throw e.buildCodeFrameError( + "super() is only allowed in a derived constructor" + ) + } + }, + ThisExpression: function(e) { + if (this.isDerived && !this.hasBareSuper && !e.inShadow("this")) + throw e.buildCodeFrameError( + "'this' is not allowed before super()" + ) + } + } + ]), + x = o.visitors.merge([ + E, + { + ThisExpression: function(e) { + this.superThises.push(e) + } + } + ]), + A = (function() { + function e(t, r) { + n(this, e), + (this.parent = t.parent), + (this.scope = t.scope), + (this.node = t.node), + (this.path = t), + (this.file = r), + this.clearDescriptors(), + (this.instancePropBody = []), + (this.instancePropRefs = {}), + (this.staticPropBody = []), + (this.body = []), + (this.bareSuperAfter = []), + (this.bareSupers = []), + (this.pushedConstructor = !1), + (this.pushedInherits = !1), + (this.isLoose = !1), + (this.superThises = []), + (this.classId = this.node.id), + (this.classRef = + this.node.id || this.scope.generateUidIdentifier("class")), + (this.superName = this.node.superClass || v.identifier("Function")), + (this.isDerived = !!this.node.superClass) + } + return ( + (e.prototype.run = function() { + var e = this, + t = this.superName, + r = this.file, + n = this.body, + i = (this.constructorBody = v.blockStatement([])) + this.constructor = this.buildConstructor() + var s = [], + a = [] + if ( + (this.isDerived && + (a.push(t), + (t = this.scope.generateUidIdentifierBasedOnNode(t)), + s.push(t), + (this.superName = t)), + this.buildBody(), + i.body.unshift( + v.expressionStatement( + v.callExpression(r.addHelper("classCallCheck"), [ + v.thisExpression(), + this.classRef + ]) + ) + ), + (n = n.concat( + this.staticPropBody.map(function(t) { + return t(e.classRef) + }) + )), + this.classId && 1 === n.length) + ) + return v.toExpression(n[0]) + n.push(v.returnStatement(this.classRef)) + var o = v.functionExpression(null, s, v.blockStatement(n)) + return (o.shadow = !0), v.callExpression(o, a) + }), + (e.prototype.buildConstructor = function() { + var e = v.functionDeclaration( + this.classRef, + [], + this.constructorBody + ) + return v.inherits(e, this.node), e + }), + (e.prototype.pushToMap = function(e, t, r, n) { + void 0 === r && (r = "value") + var i = void 0 + e["static"] + ? ((this.hasStaticDescriptors = !0), + (i = this.staticMutatorMap)) + : ((this.hasInstanceDescriptors = !0), + (i = this.instanceMutatorMap)) + var s = h.push(i, e, r, this.file, n) + return t && (s.enumerable = v.booleanLiteral(!0)), s + }), + (e.prototype.constructorMeMaybe = function() { + for ( + var e = !1, t = this.path.get("body.body"), r = t, n = 0; + n < r.length; + n++ + ) { + var i = r[n] + if ((e = i.equals("kind", "constructor"))) break + } + if (!e) { + var s = void 0, + a = void 0 + if (this.isDerived) { + var o = g().expression + ;(s = o.params), (a = o.body) + } else (s = []), (a = v.blockStatement([])) + this.path + .get("body") + .unshiftContainer( + "body", + v.classMethod( + "constructor", + v.identifier("constructor"), + s, + a + ) + ) + } + }), + (e.prototype.buildBody = function() { + if ( + (this.constructorMeMaybe(), + this.pushBody(), + this.verifyConstructor(), + this.userConstructor) + ) { + var e = this.constructorBody + ;(e.body = e.body.concat(this.userConstructor.body.body)), + v.inherits(this.constructor, this.userConstructor), + v.inherits(e, this.userConstructor.body) + } + this.pushDescriptors() + }), + (e.prototype.pushBody = function() { + for (var e = this.path.get("body.body"), t = 0; t < e.length; t++) { + var r = e[t], + n = r.node + if (r.isClassProperty()) + throw r.buildCodeFrameError( + "Missing class properties transform." + ) + if (n.decorators) + throw r.buildCodeFrameError( + "Method has decorators, put the decorator plugin before the classes one." + ) + if (v.isClassMethod(n)) { + var i = "constructor" === n.kind + if ( + i && + (r.traverse(b, this), + !this.hasBareSuper && this.isDerived) + ) + throw r.buildCodeFrameError( + "missing super() call in constructor" + ) + var s = new l["default"]( + { + forceSuperMemoisation: i, + methodPath: r, + methodNode: n, + objectRef: this.classRef, + superRef: this.superName, + isStatic: n["static"], + isLoose: this.isLoose, + scope: this.scope, + file: this.file + }, + !0 + ) + s.replace(), + i + ? this.pushConstructor(s, n, r) + : this.pushMethod(n, r) + } + } + }), + (e.prototype.clearDescriptors = function() { + ;(this.hasInstanceDescriptors = !1), + (this.hasStaticDescriptors = !1), + (this.instanceMutatorMap = {}), + (this.staticMutatorMap = {}) + }), + (e.prototype.pushDescriptors = function() { + this.pushInherits() + var e = this.body, + t = void 0, + r = void 0 + if ( + (this.hasInstanceDescriptors && + (t = h.toClassObject(this.instanceMutatorMap)), + this.hasStaticDescriptors && + (r = h.toClassObject(this.staticMutatorMap)), + t || r) + ) { + t && (t = h.toComputedObjectFromClass(t)), + r && (r = h.toComputedObjectFromClass(r)) + var n = v.nullLiteral(), + i = [this.classRef, n, n, n, n] + t && (i[1] = t), + r && (i[2] = r), + this.instanceInitializersId && + ((i[3] = this.instanceInitializersId), + e.unshift( + this.buildObjectAssignment( + this.instanceInitializersId + ) + )), + this.staticInitializersId && + ((i[4] = this.staticInitializersId), + e.unshift( + this.buildObjectAssignment( + this.staticInitializersId + ) + )) + for (var s = 0, a = 0; a < i.length; a++) i[a] !== n && (s = a) + ;(i = i.slice(0, s + 1)), + e.push( + v.expressionStatement( + v.callExpression( + this.file.addHelper("createClass"), + i + ) + ) + ) + } + this.clearDescriptors() + }), + (e.prototype.buildObjectAssignment = function(e) { + return v.variableDeclaration("var", [ + v.variableDeclarator(e, v.objectExpression([])) + ]) + }), + (e.prototype.wrapSuperCall = function(e, t, r, n) { + var i = e.node + this.isLoose + ? (i.arguments.unshift(v.thisExpression()), + 2 === i.arguments.length && + v.isSpreadElement(i.arguments[1]) && + v.isIdentifier(i.arguments[1].argument, { name: "arguments" }) + ? ((i.arguments[1] = i.arguments[1].argument), + (i.callee = v.memberExpression( + t, + v.identifier("apply") + ))) + : (i.callee = v.memberExpression( + t, + v.identifier("call") + ))) + : (i = p["default"]( + v.callExpression( + v.memberExpression( + v.identifier("Object"), + v.identifier("getPrototypeOf") + ), + [this.classRef] + ), + v.thisExpression(), + i.arguments + )) + var s = v.callExpression( + this.file.addHelper("possibleConstructorReturn"), + [v.thisExpression(), i] + ), + a = this.bareSuperAfter.map(function(e) { + return e(r) + }) + e.parentPath.isExpressionStatement() && + e.parentPath.container === n.node.body && + n.node.body.length - 1 === e.parentPath.key + ? ((this.superThises.length || a.length) && + (e.scope.push({ id: r }), + (s = v.assignmentExpression("=", r, s))), + a.length && (s = v.toSequenceExpression([s].concat(a, [r]))), + e.parentPath.replaceWith(v.returnStatement(s))) + : e.replaceWithMultiple( + [ + v.variableDeclaration("var", [ + v.variableDeclarator(r, s) + ]) + ].concat(a, [v.expressionStatement(r)]) + ) + }), + (e.prototype.verifyConstructor = function() { + var e = this + if (this.isDerived) { + var t = this.userConstructorPath, + r = t.get("body") + t.traverse(x, this) + for ( + var n = !!this.bareSupers.length, + s = this.superName || v.identifier("Function"), + a = t.scope.generateUidIdentifier("this"), + o = this.bareSupers, + u = Array.isArray(o), + l = 0, + o = u ? o : i(o); + ; + + ) { + var c + if (u) { + if (l >= o.length) break + c = o[l++] + } else { + if (((l = o.next()), l.done)) break + c = l.value + } + var p = c + this.wrapSuperCall(p, s, a, r), + n && + p.find(function(e) { + return e === t + ? !0 + : e.isLoop() || e.isConditional() + ? ((n = !1), !0) + : void 0 + }) + } + for ( + var f = this.superThises, + h = Array.isArray(f), + d = 0, + f = h ? f : i(f); + ; + + ) { + var m + if (h) { + if (d >= f.length) break + m = f[d++] + } else { + if (((d = f.next()), d.done)) break + m = d.value + } + var y = m + y.replaceWith(a) + } + var g = function(t) { + return v.callExpression( + e.file.addHelper("possibleConstructorReturn"), + [a].concat(t || []) + ) + }, + E = r.get("body") + E.length && + !E.pop().isReturnStatement() && + r.pushContainer("body", v.returnStatement(n ? a : g())) + for ( + var b = this.superReturns, + A = Array.isArray(b), + D = 0, + b = A ? b : i(b); + ; + + ) { + var C + if (A) { + if (D >= b.length) break + C = b[D++] + } else { + if (((D = b.next()), D.done)) break + C = D.value + } + var S = C + if (S.node.argument) { + var F = S.scope.generateDeclaredUidIdentifier("ret") + S.get("argument").replaceWithMultiple([ + v.assignmentExpression("=", F, S.node.argument), + g(F) + ]) + } else S.get("argument").replaceWith(g()) + } + } + }), + (e.prototype.pushMethod = function(e, t) { + var r = t ? t.scope : this.scope + ;("method" === e.kind && this._processMethod(e, r)) || + this.pushToMap(e, !1, null, r) + }), + (e.prototype._processMethod = function() { + return !1 + }), + (e.prototype.pushConstructor = function(e, t, r) { + ;(this.bareSupers = e.bareSupers), + (this.superReturns = e.returns), + r.scope.hasOwnBinding(this.classRef.name) && + r.scope.rename(this.classRef.name) + var n = this.constructor + ;(this.userConstructorPath = r), + (this.userConstructor = t), + (this.hasConstructor = !0), + v.inheritsComments(n, t), + (n._ignoreUserWhitespace = !0), + (n.params = t.params), + v.inherits(n.body, t.body), + (n.body.directives = t.body.directives), + this._pushConstructor() + }), + (e.prototype._pushConstructor = function() { + this.pushedConstructor || + ((this.pushedConstructor = !0), + (this.hasInstanceDescriptors || this.hasStaticDescriptors) && + this.pushDescriptors(), + this.body.push(this.constructor), + this.pushInherits()) + }), + (e.prototype.pushInherits = function() { + this.isDerived && + !this.pushedInherits && + ((this.pushedInherits = !0), + this.body.unshift( + v.expressionStatement( + v.callExpression(this.file.addHelper("inherits"), [ + this.classRef, + this.superName + ]) + ) + )) + }), + e + ) + })() + ;(t["default"] = A), (e.exports = t["default"]) + }, + [7466, 3923], + [7468, 3934], + [7470, 1710, 399], + [7500, 23, 26], + [7335, 3954], + 581, + [7360, 3962], + [7361, 977], + [7364, 500, 97], + 559, + [7369, 1721, 499, 1722, 979, 978, 633, 3968, 982, 97, 401], + 1380, + [7373, 979], + [7376, 632], + 805, + [7393, 498, 32, 23, 4011, 4014, 4015, 325, 3986, 26], + [7439, 3993, 988], + [7455, 4017], + [7468, 4013], + [7395, 152], + 1391, + [7407, 23, 26], + [7411, 152], + [7320, 4039], + 1370, + 1398, + [7439, 4065, 637], + [7455, 4088], + [7466, 4069], + [7468, 4083], + [7479, 991, 635], + [7488, 4063, 1736, 4072], + [7328, 4089], + [7429, 972, 23, 26], + 1370, + 812, + [7443, 4132], + [7445, 1746, 639], + [7446, 215], + [7448, 4120, 127, 214], + 1409, + [7466, 1750], + [7471, 996, 997, 127], + [7472, 216, 215], + [7473, 127], + [7476, 4126, 216], + [7492, 998, 216, 997, 405, 127], + 1420, + 799, + 557, + 558, + [7369, 4170, 4164, 4171, 1001, 1760, 641, 4168, 1763, 642, 503], + 803, + [7375, 642, 1760, 503], + [7439, 4193, 1006], + [7455, 4217], + [7468, 4213], + [7395, 89], + 1391, + [7407, 8, 14], + [7411, 89], + [7320, 4239], + 1370, + 1398, + [7439, 4265, 649], + [7455, 4288], + [7466, 4269], + [7468, 4283], + [7479, 1010, 647], + [7488, 4263, 1774, 4272], + [7328, 4289], + [7335, 4300], + [7338, 4303], + [7343, 1781], + [7358, 4314], + [7361, 1016], + [7364, 509, 104], + [7369, 1788, 651, 1789, 1018, 1017, 653, 4315, 1021, 104, 409], + 1380, + [7373, 1018], + [7376, 652], + 805, + [7429, 1013, 8, 14], + [7395, 89], + 1391, + [7407, 8, 14], + [7411, 89], + [7320, 4363], + [7328, 4381], + 1370, + [7326, 4383, 1799, 4384], + 1398, + 812, + [7439, 4397, 410], + [7443, 4414], + [7445, 1804, 410], + [7446, 220], + [7447, 4422], + [7448, 4400, 128, 219], + 1409, + [7472, 163, 220], + [7473, 128], + [7476, 4406, 163], + [7477, 4396, 654, 656], + [7486, 219], + [7488, 4394, 1803, 4412], + [7492, 1030, 163, 1029, 329, 128], + 1420, + function(e, t, r) { + "use strict" + var n = r(1031)["default"], + i = r(68)["default"] + t.__esModule = !0 + var s = r(4482), + a = i(s), + o = a["default"]("\n define(MODULE_NAME, [SOURCES], FACTORY);\n"), + u = a["default"]("\n (function (PARAMS) {\n BODY;\n })\n") + ;(t["default"] = function(e) { + function t(e) { + if (!e.isCallExpression()) return !1 + if (!e.get("callee").isIdentifier({ name: "require" })) return !1 + if (e.scope.getBinding("require")) return !1 + var t = e.get("arguments") + if (1 !== t.length) return !1 + var r = t[0] + return !!r.isStringLiteral() + } + var i = e.types, + s = { + ReferencedIdentifier: function(e) { + var t = e.node, + r = e.scope + "exports" !== t.name || + r.getBinding("exports") || + (this.hasExports = !0), + "module" !== t.name || + r.getBinding("module") || + (this.hasModule = !0) + }, + CallExpression: function(e) { + t(e) && (this.bareSources.push(e.node.arguments[0]), e.remove()) + }, + VariableDeclarator: function(e) { + var r = e.get("id") + if (r.isIdentifier()) { + var n = e.get("init") + if (t(n)) { + var i = n.node.arguments[0] + ;(this.sourceNames[i.value] = !0), + this.sources.push([r.node, i]), + e.remove() + } + } + } + } + return { + inherits: r(1053), + pre: function() { + ;(this.sources = []), + (this.sourceNames = n(null)), + (this.bareSources = []), + (this.hasExports = !1), + (this.hasModule = !1) + }, + visitor: { + Program: { + exit: function(e) { + var t = this + if (!this.ran) { + ;(this.ran = !0), e.traverse(s, this) + var r = this.sources.map(function(e) { + return e[0] + }), + n = this.sources.map(function(e) { + return e[1] + }) + n = n.concat( + this.bareSources.filter(function(e) { + return !t.sourceNames[e.value] + }) + ) + var a = this.getModuleName() + a && (a = i.stringLiteral(a)), + this.hasExports && + (n.unshift(i.stringLiteral("exports")), + r.unshift(i.identifier("exports"))), + this.hasModule && + (n.unshift(i.stringLiteral("module")), + r.unshift(i.identifier("module"))) + var l = e.node, + c = u({ PARAMS: r, BODY: l.body }) + ;(c.expression.body.directives = l.directives), + (l.directives = []), + (l.body = [ + o({ MODULE_NAME: a, SOURCES: n, FACTORY: c }) + ]) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7335, 4451], + 581, + [7358, 4465], + [7361, 1036], + [7364, 511, 105], + [7369, 1825, 658, 1826, 1038, 1037, 660, 4466, 1041, 105, 411], + 1380, + [7373, 1038], + [7376, 659], + 805, + [7395, 330], + 1391, + [7407, 41, 56], + [7411, 330], + [7320, 4504], + 1370, + [7328, 4524], + [7429, 1031, 41, 56], + 1370, + 810, + 1397, + 1398, + 812, + [7439, 4551, 413], + [7441, 4546, 1841, 1842, 1845, 4576, 4577, 4578, 153, 129], + [7443, 4567], + [7445, 1844, 413], + [7447, 4575], + [7448, 4554, 129, 225], + 1409, + 1410, + [7473, 129], + [7477, 1843, 512, 663], + [7486, 225], + [7492, 664, 153, 662, 224, 129], + 1420, + [7335, 4602], + [7338, 4605], + [7343, 1855], + [7358, 4616], + [7361, 1056], + [7364, 513, 106], + [7369, 1862, 667, 1863, 1058, 1057, 669, 4617, 1061, 106, 416], + 1380, + [7373, 1058], + [7376, 668], + 805, + [7395, 90], + 1391, + [7407, 9, 15], + [7411, 90], + [7320, 4655], + 1370, + [7328, 4675], + 810, + 1398, + [7439, 4682, 672], + [7441, 4678, 4679, 1875, 4684, 4696, 4697, 4698, 333, 418], + [7466, 4687], + [7468, 4705], + [7429, 665, 9, 15], + [7395, 90], + 1391, + [7407, 9, 15], + [7411, 90], + [7320, 4744], + [7328, 4762], + 1370, + [7326, 4764, 1886, 4765], + 1398, + 812, + [7439, 4778, 419], + [7443, 4795], + [7445, 1891, 419], + [7446, 230], + [7447, 4803], + [7448, 4781, 130, 229], + 1409, + [7472, 164, 230], + [7473, 130], + [7476, 4787, 164], + [7477, 4777, 673, 675], + [7486, 229], + [7488, 4775, 1890, 4793], + [7492, 1079, 164, 1078, 335, 130], + 1420, + [7429, 517, 2, 57], + [7395, 91], + 1391, + [7407, 2, 57], + [7411, 91], + [7320, 4854], + [7328, 4872], + 1370, + [7326, 4874, 1912, 4875], + 1398, + 812, + [7439, 4888, 420], + [7443, 4905], + [7445, 1917, 420], + [7446, 233], + [7447, 4913], + [7448, 4891, 131, 232], + 1409, + [7472, 165, 233], + [7473, 131], + [7476, 4897, 165], + [7477, 4887, 676, 678], + [7486, 232], + [7488, 4885, 1916, 4903], + [7492, 1087, 165, 1086, 337, 131], + 1420, + [7332, 4933], + [7335, 4935], + [7338, 4938], + [7342, 4940], + [7343, 1932], + [7344, 4931, 4930, 1932], + function(e, t) { + "use strict" + ;(t["default"] = function(e, t) { + var r = t({}, e) + return delete r["default"], r + }), + (t.__esModule = !0) + }, + [7358, 4949], + [7361, 1090], + [7364, 518, 107], + [7369, 1942, 680, 1943, 1092, 1091, 682, 4950, 1095, 107, 423], + 1380, + [7373, 1092], + [7376, 681], + 805, + [7395, 91], + 1391, + [7407, 2, 58], + [7411, 91], + [7320, 4988], + 1370, + [7328, 5008], + [7429, 517, 2, 58], + 1370, + 810, + 1397, + 1398, + 812, + [7439, 5035, 425], + [7441, 5030, 1958, 1959, 1962, 5060, 5061, 5062, 154, 132], + [7443, 5051], + [7445, 1961, 425], + [7447, 5059], + [7448, 5038, 132, 237], + 1409, + 1410, + [7473, 132], + [7477, 1960, 519, 685], + [7486, 237], + [7492, 686, 154, 684, 236, 132], + 1420, + [7334, 5088], + [7335, 5089], + 581, + [7358, 5103], + [7361, 1111], + [7364, 520, 108], + [7369, 1979, 687, 1980, 1113, 1112, 689, 5104, 1116, 108, 426], + 1380, + [7373, 1113], + [7376, 688], + 805, + [7395, 339], + 1391, + [7407, 42, 59], + [7411, 339], + [7320, 5142], + 1370, + [7328, 5162], + [7429, 1972, 42, 59], + 1370, + 810, + 1397, + 1398, + 812, + [7439, 5189, 428], + [7441, 5184, 1995, 1996, 1999, 5214, 5215, 5216, 155, 133], + [7443, 5205], + [7445, 1998, 428], + [7447, 5213], + [7448, 5192, 133, 243], + 1409, + 1410, + [7473, 133], + [7477, 1997, 521, 692], + [7486, 243], + [7492, 693, 155, 691, 242, 133], + 1420, + [7395, 250], + 1391, + [7407, 34, 49], + [7411, 250], + [7320, 5254], + 1370, + 1398, + [7439, 5280, 698], + [7455, 5303], + [7466, 5284], + [7468, 5298], + [7479, 1130, 696], + [7488, 5278, 2016, 5287], + [7328, 5304], + [7429, 2038, 34, 49], + 1370, + 812, + [7443, 5347], + [7445, 2026, 700], + [7446, 247], + [7448, 5335, 134, 246], + 1409, + [7466, 2030], + [7471, 1135, 1136, 134], + [7472, 248, 247], + [7473, 134], + [7476, 5341, 248], + [7492, 1137, 248, 1136, 430, 134], + 1420, + [7334, 5381], + [7335, 5382], + 581, + [7358, 5396], + [7361, 1141], + [7364, 524, 109], + [7369, 2045, 702, 2046, 1143, 1142, 704, 5397, 1146, 109, 431], + 1380, + [7373, 1143], + [7376, 703], + 805, + [7334, 5429], + [7335, 5430], + 581, + [7358, 5444], + [7361, 1152], + [7364, 525, 110], + [7369, 2056, 706, 2057, 1154, 1153, 708, 5445, 1157, 110, 432], + 1380, + [7373, 1154], + [7376, 707], + 805, + [7393, 1149, 50, 24, 5486, 5489, 5490, 343, 5461, 28], + [7439, 5468, 1163], + [7455, 5492], + [7468, 5488], + [7395, 342], + 1391, + [7407, 24, 28], + [7411, 342], + [7320, 5514], + 1370, + 1398, + [7439, 5540, 712], + [7455, 5563], + [7466, 5544], + [7468, 5558], + [7479, 1167, 710], + [7488, 5538, 2071, 5547], + [7328, 5564], + [7429, 2049, 24, 28], + 1370, + 812, + [7443, 5607], + [7445, 2081, 714], + [7446, 256], + [7448, 5595, 135, 255], + 1409, + [7466, 2085], + [7471, 1172, 1173, 135], + [7472, 257, 256], + [7473, 135], + [7476, 5601, 257], + [7492, 1174, 257, 1173, 436, 135], + 1420, + [7334, 5641], + [7335, 5642], + [7341, 5648], + 581, + [7358, 5656], + [7361, 1178], + [7364, 528, 111], + [7369, 2101, 716, 2102, 1180, 1179, 718, 5657, 1183, 111, 437], + 1380, + [7373, 1180], + [7376, 717], + 805, + [7429, 2093, 43, 60], + [7395, 345], + 1391, + [7407, 43, 60], + [7411, 345], + [7320, 5705], + [7328, 5723], + 1370, + [7326, 5725, 2112, 5726], + 1398, + 812, + [7439, 5739, 438], + [7443, 5756], + [7445, 2117, 438], + [7446, 262], + [7447, 5764], + [7448, 5742, 136, 261], + 1409, + [7472, 166, 262], + [7473, 136], + [7476, 5748, 166], + [7477, 5738, 719, 721], + [7486, 261], + [7488, 5736, 2116, 5754], + [7492, 1192, 166, 1191, 347, 136], + 1420, + [7334, 5795], + [7335, 5796], + [7341, 5802], + 581, + [7358, 5810], + [7361, 1196], + [7364, 530, 112], + [7369, 2139, 724, 2140, 1198, 1197, 726, 5811, 1201, 112, 439], + 1380, + [7373, 1198], + [7376, 725], + 805, + [7429, 2131, 35, 51], + [7395, 348], + 1391, + [7407, 35, 51], + [7411, 348], + [7320, 5859], + [7328, 5877], + 1370, + [7326, 5879, 2150, 5880], + 1398, + 812, + [7439, 5893, 440], + [7443, 5910], + [7445, 2155, 440], + [7446, 267], + [7447, 5918], + [7448, 5896, 137, 266], + 1409, + [7472, 167, 267], + [7473, 137], + [7476, 5902, 167], + [7477, 5892, 727, 729], + [7486, 266], + [7488, 5890, 2154, 5908], + [7492, 1210, 167, 1209, 350, 137], + 1420, + 799, + 98, + [7361, 2172], + 465, + 558, + 803, + [7376, 732], + 805, + [7380, 2175, 2176, 732], + [7429, 2203, 36, 61], + [7395, 353], + 1391, + [7407, 36, 61], + [7411, 353], + [7320, 5987], + [7328, 6005], + 1370, + [7326, 6007, 2185, 6008], + 1398, + 812, + [7439, 6023, 442], + [7443, 6040], + [7445, 2190, 442], + [7446, 270], + [7448, 6026, 138, 269], + 1409, + [7472, 168, 270], + [7473, 138], + [7476, 6032, 168], + [7477, 6022, 734, 736], + [7486, 269], + [7488, 6020, 2189, 6038], + [7492, 1220, 168, 1219, 352, 138], + 1420, + [7334, 6074], + [7335, 6075], + [7341, 6081], + 581, + [7358, 6089], + [7361, 1224], + [7364, 533, 113], + [7369, 2211, 737, 2212, 1226, 1225, 739, 6090, 1229, 113, 443], + 1380, + [7373, 1226], + [7376, 738], + 805, + function(e, t, r) { + var n + ;(function(e, i) { + !(function(s) { + var a = "object" == typeof t && t, + o = ("object" == typeof e && e && e.exports == a && e, + "object" == typeof i && i) + ;(o.global !== o && o.window !== o) || (s = o) + var u = { + rangeOrder: + "A range’s `stop` value must be greater than or equal to the `start` value.", + codePointRange: + "Invalid code point value. Code points range from U+000000 to U+10FFFF." + }, + l = 55296, + c = 56319, + p = 56320, + f = 57343, + h = /\\x00([^0123456789]|$)/g, + d = {}, + m = d.hasOwnProperty, + y = function(e, t) { + var r + for (r in t) m.call(t, r) && (e[r] = t[r]) + return e + }, + v = function(e, t) { + for (var r = -1, n = e.length; ++r < n; ) t(e[r], r) + }, + g = d.toString, + E = function(e) { + return "[object Array]" == g.call(e) + }, + b = function(e) { + return "number" == typeof e || "[object Number]" == g.call(e) + }, + x = "0000", + A = function(e, t) { + var r = String(e) + return r.length < t ? (x + r).slice(-t) : r + }, + D = function(e) { + return Number(e) + .toString(16) + .toUpperCase() + }, + C = [].slice, + S = function(e) { + for ( + var t, r = -1, n = e.length, i = n - 1, s = [], a = !0, o = 0; + ++r < n; + + ) + if (((t = e[r]), a)) s.push(t), (o = t), (a = !1) + else if (t == o + 1) { + if (r != i) { + o = t + continue + } + ;(a = !0), s.push(t + 1) + } else s.push(o + 1, t), (o = t) + return a || s.push(t + 1), s + }, + F = function(e, t) { + for (var r, n, i = 0, s = e.length; s > i; ) { + if (((r = e[i]), (n = e[i + 1]), t >= r && n > t)) + return t == r + ? n == r + 1 + ? (e.splice(i, 2), e) + : ((e[i] = t + 1), e) + : t == n - 1 + ? ((e[i + 1] = t), e) + : (e.splice(i, 2, r, t, t + 1, n), e) + i += 2 + } + return e + }, + w = function(e, t, r) { + if (t > r) throw Error(u.rangeOrder) + for (var n, i, s = 0; s < e.length; ) { + if (((n = e[s]), (i = e[s + 1] - 1), n > r)) return e + if (n >= t && r >= i) e.splice(s, 2) + else { + if (t >= n && i > r) + return t == n + ? ((e[s] = r + 1), (e[s + 1] = i + 1), e) + : (e.splice(s, 2, n, t, r + 1, i + 1), e) + if (t >= n && i >= t) e[s + 1] = t + else if (r >= n && i >= r) return (e[s] = r + 1), e + s += 2 + } + } + return e + }, + _ = function(e, t) { + var r, + n, + i = 0, + s = null, + a = e.length + if (0 > t || t > 1114111) throw RangeError(u.codePointRange) + for (; a > i; ) { + if (((r = e[i]), (n = e[i + 1]), t >= r && n > t)) return e + if (t == r - 1) return (e[i] = t), e + if (r > t) + return e.splice(null != s ? s + 2 : 0, 0, t, t + 1), e + if (t == n) + return t + 1 == e[i + 2] + ? (e.splice(i, 4, r, e[i + 3]), e) + : ((e[i + 1] = t + 1), e) + ;(s = i), (i += 2) + } + return e.push(t, t + 1), e + }, + T = function(e, t) { + for (var r, n, i = 0, s = e.slice(), a = t.length; a > i; ) + (r = t[i]), + (n = t[i + 1] - 1), + (s = r == n ? _(s, r) : B(s, r, n)), + (i += 2) + return s + }, + P = function(e, t) { + for (var r, n, i = 0, s = e.slice(), a = t.length; a > i; ) + (r = t[i]), + (n = t[i + 1] - 1), + (s = r == n ? F(s, r) : w(s, r, n)), + (i += 2) + return s + }, + B = function(e, t, r) { + if (t > r) throw Error(u.rangeOrder) + if (0 > t || t > 1114111 || 0 > r || r > 1114111) + throw RangeError(u.codePointRange) + for (var n, i, s = 0, a = !1, o = e.length; o > s; ) { + if (((n = e[s]), (i = e[s + 1]), a)) { + if (n == r + 1) return e.splice(s - 1, 2), e + if (n > r) return e + n >= t && + r >= n && + (i > t && r >= i - 1 + ? (e.splice(s, 2), (s -= 2)) + : (e.splice(s - 1, 2), (s -= 2))) + } else { + if (n == r + 1) return (e[s] = t), e + if (n > r) return e.splice(s, 0, t, r + 1), e + if (t >= n && i > t && i >= r + 1) return e + ;(t >= n && i > t) || i == t + ? ((e[s + 1] = r + 1), (a = !0)) + : n >= t && + r + 1 >= i && + ((e[s] = t), (e[s + 1] = r + 1), (a = !0)) + } + s += 2 + } + return a || e.push(t, r + 1), e + }, + k = function(e, t) { + var r = 0, + n = e.length, + i = e[r], + s = e[n - 1] + if (n >= 2 && (i > t || t > s)) return !1 + for (; n > r; ) { + if (((i = e[r]), (s = e[r + 1]), t >= i && s > t)) return !0 + r += 2 + } + return !1 + }, + I = function(e, t) { + for (var r, n = 0, i = t.length, s = []; i > n; ) + (r = t[n]), k(e, r) && s.push(r), ++n + return S(s) + }, + O = function(e) { + return !e.length + }, + M = function(e) { + return 2 == e.length && e[0] + 1 == e[1] + }, + R = function(e) { + for (var t, r, n = 0, i = [], s = e.length; s > n; ) { + for (t = e[n], r = e[n + 1]; r > t; ) i.push(t), ++t + n += 2 + } + return i + }, + L = Math.floor, + N = function(e) { + return parseInt(L((e - 65536) / 1024) + l, 10) + }, + j = function(e) { + return parseInt(((e - 65536) % 1024) + p, 10) + }, + U = String.fromCharCode, + V = function(e) { + var t + return (t = + 9 == e + ? "\\t" + : 10 == e + ? "\\n" + : 12 == e + ? "\\f" + : 13 == e + ? "\\r" + : 92 == e + ? "\\\\" + : 36 == e || + (e >= 40 && 43 >= e) || + 45 == e || + 46 == e || + 63 == e || + (e >= 91 && 94 >= e) || + (e >= 123 && 125 >= e) + ? "\\" + U(e) + : e >= 32 && 126 >= e + ? U(e) + : 255 >= e + ? "\\x" + A(D(e), 2) + : "\\u" + A(D(e), 4)) + }, + G = function(e) { + var t, + r = e.length, + n = e.charCodeAt(0) + return n >= l && c >= n && r > 1 + ? ((t = e.charCodeAt(1)), 1024 * (n - l) + t - p + 65536) + : n + }, + W = function(e) { + var t, + r, + n = "", + i = 0, + s = e.length + if (M(e)) return V(e[0]) + for (; s > i; ) + (t = e[i]), + (r = e[i + 1] - 1), + (n += + t == r + ? V(t) + : t + 1 == r + ? V(t) + V(r) + : V(t) + "-" + V(r)), + (i += 2) + return "[" + n + "]" + }, + q = function(e) { + for ( + var t, r, n = [], i = [], s = [], a = [], o = 0, u = e.length; + u > o; + + ) + (t = e[o]), + (r = e[o + 1] - 1), + l > t + ? (l > r && s.push(t, r + 1), + r >= l && c >= r && (s.push(t, l), n.push(l, r + 1)), + r >= p && + f >= r && + (s.push(t, l), + n.push(l, c + 1), + i.push(p, r + 1)), + r > f && + (s.push(t, l), + n.push(l, c + 1), + i.push(p, f + 1), + 65535 >= r + ? s.push(f + 1, r + 1) + : (s.push(f + 1, 65536), + a.push(65536, r + 1)))) + : t >= l && c >= t + ? (r >= l && c >= r && n.push(t, r + 1), + r >= p && + f >= r && + (n.push(t, c + 1), i.push(p, r + 1)), + r > f && + (n.push(t, c + 1), + i.push(p, f + 1), + 65535 >= r + ? s.push(f + 1, r + 1) + : (s.push(f + 1, 65536), + a.push(65536, r + 1)))) + : t >= p && f >= t + ? (r >= p && f >= r && i.push(t, r + 1), + r > f && + (i.push(t, f + 1), + 65535 >= r + ? s.push(f + 1, r + 1) + : (s.push(f + 1, 65536), + a.push(65536, r + 1)))) + : t > f && 65535 >= t + ? 65535 >= r + ? s.push(t, r + 1) + : (s.push(t, 65536), a.push(65536, r + 1)) + : a.push(t, r + 1), + (o += 2) + return { + loneHighSurrogates: n, + loneLowSurrogates: i, + bmp: s, + astral: a + } + }, + H = function(e) { + for ( + var t, + r, + n, + i, + s, + a, + o = [], + u = [], + l = !1, + c = -1, + p = e.length; + ++c < p; + + ) + if (((t = e[c]), (r = e[c + 1]))) { + for ( + n = t[0], i = t[1], s = r[0], a = r[1], u = i; + s && n[0] == s[0] && n[1] == s[1]; + + ) + (u = M(a) ? _(u, a[0]) : B(u, a[0], a[1] - 1)), + ++c, + (t = e[c]), + (n = t[0]), + (i = t[1]), + (r = e[c + 1]), + (s = r && r[0]), + (a = r && r[1]), + (l = !0) + o.push([n, l ? u : i]), (l = !1) + } else o.push(t) + return Y(o) + }, + Y = function(e) { + if (1 == e.length) return e + for (var t = -1, r = -1; ++t < e.length; ) { + var n = e[t], + i = n[1], + s = i[0], + a = i[1] + for (r = t; ++r < e.length; ) { + var o = e[r], + u = o[1], + l = u[0], + c = u[1] + s == l && + a == c && + (M(o[0]) + ? (n[0] = _(n[0], o[0][0])) + : (n[0] = B(n[0], o[0][0], o[0][1] - 1)), + e.splice(r, 1), + --r) + } + } + return e + }, + J = function(e) { + if (!e.length) return [] + for ( + var t, r, n, i, s, a, o = 0, u = 0, l = 0, c = [], h = e.length; + h > o; + + ) { + ;(t = e[o]), + (r = e[o + 1] - 1), + (n = N(t)), + (i = j(t)), + (s = N(r)), + (a = j(r)) + var d = i == p, + m = a == f, + y = !1 + n == s || (d && m) + ? (c.push([[n, s + 1], [i, a + 1]]), (y = !0)) + : c.push([[n, n + 1], [i, f + 1]]), + !y && + s > n + 1 && + (m + ? (c.push([[n + 1, s + 1], [p, a + 1]]), (y = !0)) + : c.push([[n + 1, s], [p, f + 1]])), + y || c.push([[s, s + 1], [p, a + 1]]), + (u = n), + (l = s), + (o += 2) + } + return H(c) + }, + K = function(e) { + var t = [] + return ( + v(e, function(e) { + var r = e[0], + n = e[1] + t.push(W(r) + W(n)) + }), + t.join("|") + ) + }, + X = function(e, t) { + var r = [], + n = q(e), + i = n.loneHighSurrogates, + s = n.loneLowSurrogates, + a = n.bmp, + o = n.astral, + u = (!O(n.astral), !O(i)), + l = !O(s), + c = J(o) + return ( + t && ((a = T(a, i)), (u = !1), (a = T(a, s)), (l = !1)), + O(a) || r.push(W(a)), + c.length && r.push(K(c)), + u && r.push(W(i) + "(?![\\uDC00-\\uDFFF])"), + l && r.push("(?:[^\\uD800-\\uDBFF]|^)" + W(s)), + r.join("|") + ) + }, + z = function(e) { + return ( + arguments.length > 1 && (e = C.call(arguments)), + this instanceof z + ? ((this.data = []), e ? this.add(e) : this) + : new z().add(e) + ) + } + z.version = "1.2.0" + var $ = z.prototype + y($, { + add: function(e) { + var t = this + return null == e + ? t + : e instanceof z + ? ((t.data = T(t.data, e.data)), t) + : (arguments.length > 1 && (e = C.call(arguments)), + E(e) + ? (v(e, function(e) { + t.add(e) + }), + t) + : ((t.data = _(t.data, b(e) ? e : G(e))), t)) + }, + remove: function(e) { + var t = this + return null == e + ? t + : e instanceof z + ? ((t.data = P(t.data, e.data)), t) + : (arguments.length > 1 && (e = C.call(arguments)), + E(e) + ? (v(e, function(e) { + t.remove(e) + }), + t) + : ((t.data = F(t.data, b(e) ? e : G(e))), t)) + }, + addRange: function(e, t) { + var r = this + return (r.data = B(r.data, b(e) ? e : G(e), b(t) ? t : G(t))), r + }, + removeRange: function(e, t) { + var r = this, + n = b(e) ? e : G(e), + i = b(t) ? t : G(t) + return (r.data = w(r.data, n, i)), r + }, + intersection: function(e) { + var t = this, + r = e instanceof z ? R(e.data) : e + return (t.data = I(t.data, r)), t + }, + contains: function(e) { + return k(this.data, b(e) ? e : G(e)) + }, + clone: function() { + var e = new z() + return (e.data = this.data.slice(0)), e + }, + toString: function(e) { + var t = X(this.data, e ? e.bmpOnly : !1) + return t.replace(h, "\\0$1") + }, + toRegExp: function(e) { + return RegExp(this.toString(), e || "") + }, + valueOf: function() { + return R(this.data) + } + }), + ($.toArray = $.valueOf), + (n = function() { + return z + }.call(t, r, t, e)), + !(void 0 !== n && (e.exports = n)) + })(this) + }.call( + t, + r(25)(e), + (function() { + return this + })() + )) + }, + [7395, 93], + 1391, + [7407, 4, 12], + [7411, 93], + [7320, 6139], + 1370, + [7328, 6160], + [7429, 1242, 4, 12], + [7395, 93], + 1391, + [7407, 4, 12], + [7411, 93], + [7320, 6194], + [7328, 6212], + 1370, + [7326, 6214, 2230, 6215], + 1397, + [7434, 6219], + 1398, + 812, + [7439, 6226, 445], + [7441, 6221, 2235, 2236, 2239, 6251, 6252, 6253, 156, 139], + [7443, 6242], + [7445, 2238, 445], + [7447, 6250], + [7448, 6229, 139, 275], + 1409, + 1410, + [7473, 139], + [7486, 275], + [7489, 744, 6223, 6244], + [7490, 1236, 2243, 743, 156, 741, 1239, 274, 2232, 1240], + [7492, 743, 156, 741, 274, 139], + 1420, + [7335, 6275], + [7338, 6278], + [7343, 2250], + [7358, 6289], + [7361, 1245], + [7364, 539, 114], + [7369, 2257, 746, 2258, 1247, 1246, 748, 6290, 1250, 114, 446], + 1380, + [7373, 1247], + [7376, 747], + 805, + function(e, t, r) { + "use strict" + var n = r(72)["default"] + t.__esModule = !0 + var i = r(6307), + s = n(i) + ;(t["default"] = function(e) { + var t = e.types + return { + inherits: r(1430), + visitor: s["default"]({ + operator: "**", + build: function(e, r) { + return t.callExpression( + t.memberExpression(t.identifier("Math"), t.identifier("pow")), + [e, r] + ) + } + }) + } + }), + (e.exports = t["default"]) + }, + [7429, 2288, 37, 52], + [7395, 358], + 1391, + [7407, 37, 52], + [7411, 358], + [7320, 6341], + [7328, 6359], + 1370, + [7326, 6361, 2269, 6362], + 1398, + 812, + [7439, 6375, 447], + [7443, 6392], + [7445, 2274, 447], + [7446, 280], + [7447, 6400], + [7448, 6378, 140, 279], + 1409, + [7472, 169, 280], + [7473, 140], + [7476, 6384, 169], + [7477, 6374, 749, 751], + [7486, 279], + [7488, 6372, 2273, 6390], + [7492, 1259, 169, 1258, 357, 140], + 1420, + [7334, 6427], + [7335, 6428], + [7341, 6434], + 581, + [7358, 6442], + [7361, 1263], + [7364, 541, 115], + [7369, 2296, 752, 2297, 1265, 1264, 754, 6443, 1268, 115, 448], + 1380, + [7373, 1265], + [7376, 753], + 805, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e, r, i) { + var s = e.specifiers[0] + if (n.isExportNamespaceSpecifier(s) || n.isExportDefaultSpecifier(s)) { + var a = e.specifiers.shift(), + o = i.generateUidIdentifier(a.exported.name), + u = void 0 + ;(u = n.isExportNamespaceSpecifier(a) + ? n.importNamespaceSpecifier(o) + : n.importDefaultSpecifier(o)), + r.push(n.importDeclaration([u], e.source)), + r.push( + n.exportNamedDeclaration(null, [ + n.exportSpecifier(o, a.exported) + ]) + ), + t(e, r, i) + } + } + var n = e.types + return { + inherits: r(1431), + visitor: { + ExportNamedDeclaration: function(e) { + var r = e.node, + n = e.scope, + i = [] + t(r, i, n), + i.length && + (r.specifiers.length >= 1 && i.push(r), + e.replaceWithMultiple(i)) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types, + n = "@flow" + return { + inherits: r(822), + visitor: { + Program: function(e, t) { + for ( + var r = t.file.ast.comments, i = r, s = 0; + s < i.length; + s++ + ) { + var a = i[s] + a.value.indexOf(n) >= 0 && + ((a.value = a.value.replace(n, "")), + a.value.replace(/\*/g, "").trim() || (a.ignore = !0)) + } + }, + Flow: function(e) { + e.remove() + }, + ClassProperty: function(e) { + ;(e.node.typeAnnotation = null), e.node.value || e.remove() + }, + Class: function(e) { + var t = e.node + t["implements"] = null + }, + Function: function(e) { + for (var t = e.node, r = 0; r < t.params.length; r++) { + var n = t.params[r] + n.optional = !1 + } + }, + TypeCastExpression: function(e) { + var r = e.node + do r = r.expression + while (t.isTypeCastExpression(r)) + e.replaceWith(r) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + var t = e.path.getData("functionBind") + return t + ? t + : ((t = e.generateDeclaredUidIdentifier("context")), + e.path.setData("functionBind", t)) + } + function n(e, t) { + var r = e.object || e.callee.object + return t.isStatic(r) && r + } + function i(e, r) { + var i = n(e, r) + if (i) return i + var a = t(r) + return ( + e.object + ? (e.callee = s.sequenceExpression([ + s.assignmentExpression("=", a, e.object), + e.callee + ])) + : (e.callee.object = s.assignmentExpression( + "=", + a, + e.callee.object + )), + a + ) + } + var s = e.types + return { + inherits: r(1432), + visitor: { + CallExpression: function(e) { + var t = e.node, + r = e.scope, + n = t.callee + if (s.isBindExpression(n)) { + var a = i(n, r) + ;(t.callee = s.memberExpression( + n.callee, + s.identifier("call") + )), + t.arguments.unshift(a) + } + }, + BindExpression: function(e) { + var t = e.node, + r = e.scope, + n = i(t, r) + e.replaceWith( + s.callExpression( + s.memberExpression(t.callee, s.identifier("bind")), + [n] + ) + ) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + for (var t = e.properties, r = 0; r < t.length; r++) { + var i = t[r] + if (n.isSpreadProperty(i)) return !0 + } + return !1 + } + var n = e.types + return { + inherits: r(1433), + visitor: { + ObjectExpression: function(e, r) { + function i() { + a.length && (s.push(n.objectExpression(a)), (a = [])) + } + if (t(e.node)) { + for ( + var s = [], a = [], o = e.node.properties, u = 0; + u < o.length; + u++ + ) { + var l = o[u] + n.isSpreadProperty(l) + ? (i(), s.push(l.argument)) + : a.push(l) + } + i(), + n.isObjectExpression(s[0]) || + s.unshift(n.objectExpression([])), + e.replaceWith( + n.callExpression(r.addHelper("extends"), s) + ) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(6474)["default"] + t.__esModule = !0 + var i = r(175), + s = n(i) + ;(t["default"] = function(e) { + function t(e, t) { + for (var r = t.arguments[0].properties, i = !0, s = 0; s < r.length; s++) { + var a = r[s], + o = n.toComputedKey(a) + if (n.isLiteral(o, { value: "displayName" })) { + i = !1 + break + } + } + i && + r.unshift( + n.objectProperty(n.identifier("displayName"), n.stringLiteral(e)) + ) + } + function r(e) { + if (!e || !n.isCallExpression(e)) return !1 + if (!i(e.callee)) return !1 + var t = e.arguments + if (1 !== t.length) return !1 + var r = t[0] + return !!n.isObjectExpression(r) + } + var n = e.types, + i = n.buildMatchMemberExpression("React.createClass") + return { + visitor: { + ExportDefaultDeclaration: function(e, n) { + var i = e.node + if (r(i.declaration)) { + var a = n.file.opts.basename + "index" === a && + (a = s["default"].basename( + s["default"].dirname(n.file.opts.filename) + )), + t(a, i.declaration) + } + }, + CallExpression: function(e) { + var i = e.node + if (r(i)) { + var s = void 0 + e.find(function(e) { + if (e.isAssignmentExpression()) s = e.node.left + else if (e.isObjectProperty()) s = e.node.key + else if (e.isVariableDeclarator()) s = e.node.id + else if (e.isStatement()) return !0 + return s ? !0 : void 0 + }), + s && + (n.isMemberExpression(s) && (s = s.property), + n.isIdentifier(s) && t(s.name, i)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7429, 2330, 44, 62], + [7395, 361], + 1391, + [7407, 44, 62], + [7411, 361], + [7320, 6510], + [7328, 6528], + 1370, + 1398, + 812, + [7439, 6545, 449], + [7443, 6562], + [7445, 2316, 449], + [7446, 285], + [7447, 6570], + [7448, 6548, 141, 284], + 1409, + [7472, 170, 285], + [7473, 141], + [7476, 6554, 170], + [7477, 6544, 755, 757], + [7486, 284], + [7488, 6542, 2315, 6560], + [7492, 1278, 170, 1277, 360, 141], + 1420, + [7334, 6596], + [7335, 6597], + [7341, 6603], + 581, + [7358, 6611], + [7361, 1282], + [7364, 543, 116], + [7369, 2338, 758, 2339, 1284, 1283, 760, 6612, 1287, 116, 450], + 1380, + [7373, 1284], + [7376, 759], + 805, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types, + n = /\*?\s*@jsx\s+([^\s]+)/, + i = r(6629)({ + pre: function(e) { + var r = e.tagName, + n = e.args + t.react.isCompatTag(r) + ? n.push(t.stringLiteral(r)) + : n.push(e.tagExpr) + }, + post: function(e, t) { + e.callee = t.get("jsxIdentifier") + } + }) + return ( + (i.Program = function(e, r) { + for ( + var i = r.file, + s = r.opts.pragma || "React.createElement", + a = i.ast.comments, + o = 0; + o < a.length; + o++ + ) { + var u = a[o], + l = n.exec(u.value) + if (l) { + if (((s = l[1]), "React.DOM" === s)) + throw i.buildCodeFrameError( + u, + "The @jsx React.DOM pragma has been deprecated as of React 0.12" + ) + break + } + } + r.set( + "jsxIdentifier", + s + .split(".") + .map(function(e) { + return t.identifier(e) + }) + .reduce(function(e, r) { + return t.memberExpression(e, r) + }) + ) + }), + { inherits: r(823), visitor: i } + ) + }), + (e.exports = t["default"]) + }, + [7429, 2368, 45, 63], + [7395, 364], + 1391, + [7407, 45, 63], + [7411, 364], + [7320, 6662], + [7328, 6680], + 1370, + 1398, + 812, + [7439, 6697, 451], + [7443, 6714], + [7445, 2354, 451], + [7446, 290], + [7447, 6722], + [7448, 6700, 142, 289], + 1409, + [7472, 171, 290], + [7473, 142], + [7476, 6706, 171], + [7477, 6696, 761, 763], + [7486, 289], + [7488, 6694, 2353, 6712], + [7492, 1297, 171, 1296, 363, 142], + 1420, + [7334, 6748], + [7335, 6749], + [7341, 6755], + 581, + [7358, 6763], + [7361, 1301], + [7364, 545, 117], + [7369, 2376, 764, 2377, 1303, 1302, 766, 6764, 1306, 117, 452], + 1380, + [7373, 1303], + [7376, 765], + 805, + function(e, t, r) { + "use strict" + function n(e) { + c["default"].ok(this instanceof n), + f.assertIdentifier(e), + (this.nextTempId = 0), + (this.contextId = e), + (this.listing = []), + (this.marked = [!0]), + (this.finalLoc = i()), + (this.tryEntries = []), + (this.leapManager = new d.LeapManager(this)) + } + function i() { + return f.numericLiteral(-1) + } + function s(e) { + return new Error( + "all declarations should have been transformed into assignments before the Exploder began its work: " + + JSON.stringify(e) + ) + } + function a(e) { + var t = e.type + return "normal" === t + ? !E.call(e, "target") + : "break" === t || "continue" === t + ? !E.call(e, "value") && f.isLiteral(e.target) + : "return" === t || "throw" === t + ? E.call(e, "value") && !E.call(e, "target") + : !1 + } + var o = r(53)["default"], + u = r(27)["default"], + l = r(789), + c = o(l), + p = r(30), + f = u(p), + h = r(6781), + d = u(h), + m = r(6782), + y = u(m), + v = r(2381), + g = u(v), + E = Object.prototype.hasOwnProperty, + b = n.prototype + ;(t.Emitter = n), + (b.mark = function(e) { + f.assertLiteral(e) + var t = this.listing.length + return ( + -1 === e.value ? (e.value = t) : c["default"].strictEqual(e.value, t), + (this.marked[t] = !0), + e + ) + }), + (b.emit = function(e) { + f.isExpression(e) && (e = f.expressionStatement(e)), + f.assertStatement(e), + this.listing.push(e) + }), + (b.emitAssign = function(e, t) { + return this.emit(this.assign(e, t)), e + }), + (b.assign = function(e, t) { + return f.expressionStatement(f.assignmentExpression("=", e, t)) + }), + (b.contextProperty = function(e, t) { + return f.memberExpression( + this.contextId, + t ? f.stringLiteral(e) : f.identifier(e), + !!t + ) + }), + (b.stop = function(e) { + e && this.setReturnValue(e), this.jump(this.finalLoc) + }), + (b.setReturnValue = function(e) { + f.assertExpression(e.value), + this.emitAssign(this.contextProperty("rval"), this.explodeExpression(e)) + }), + (b.clearPendingException = function(e, t) { + f.assertLiteral(e) + var r = f.callExpression(this.contextProperty("catch", !0), [e]) + t ? this.emitAssign(t, r) : this.emit(r) + }), + (b.jump = function(e) { + this.emitAssign(this.contextProperty("next"), e), + this.emit(f.breakStatement()) + }), + (b.jumpIf = function(e, t) { + f.assertExpression(e), + f.assertLiteral(t), + this.emit( + f.ifStatement( + e, + f.blockStatement([ + this.assign(this.contextProperty("next"), t), + f.breakStatement() + ]) + ) + ) + }), + (b.jumpIfNot = function(e, t) { + f.assertExpression(e), f.assertLiteral(t) + var r = void 0 + ;(r = + f.isUnaryExpression(e) && "!" === e.operator + ? e.argument + : f.unaryExpression("!", e)), + this.emit( + f.ifStatement( + r, + f.blockStatement([ + this.assign(this.contextProperty("next"), t), + f.breakStatement() + ]) + ) + ) + }), + (b.makeTempVar = function() { + return this.contextProperty("t" + this.nextTempId++) + }), + (b.getContextFunction = function(e) { + return f.functionExpression( + e || null, + [this.contextId], + f.blockStatement([this.getDispatchLoop()]), + !1, + !1 + ) + }), + (b.getDispatchLoop = function() { + var e = this, + t = [], + r = void 0, + n = !1 + return ( + e.listing.forEach(function(i, s) { + e.marked.hasOwnProperty(s) && + (t.push(f.switchCase(f.numericLiteral(s), (r = []))), (n = !1)), + n || (r.push(i), f.isCompletionStatement(i) && (n = !0)) + }), + (this.finalLoc.value = this.listing.length), + t.push( + f.switchCase(this.finalLoc, []), + f.switchCase(f.stringLiteral("end"), [ + f.returnStatement( + f.callExpression(this.contextProperty("stop"), []) + ) + ]) + ), + f.whileStatement( + f.numericLiteral(1), + f.switchStatement( + f.assignmentExpression( + "=", + this.contextProperty("prev"), + this.contextProperty("next") + ), + t + ) + ) + ) + }), + (b.getTryLocsList = function() { + if (0 === this.tryEntries.length) return null + var e = 0 + return f.arrayExpression( + this.tryEntries.map(function(t) { + var r = t.firstLoc.value + c["default"].ok(r >= e, "try entries out of order"), (e = r) + var n = t.catchEntry, + i = t.finallyEntry, + s = [t.firstLoc, n ? n.firstLoc : null] + return ( + i && ((s[2] = i.firstLoc), (s[3] = i.afterLoc)), + f.arrayExpression(s) + ) + }) + ) + }), + (b.explode = function(e, t) { + var r = e.node, + n = this + if ((f.assertNode(r), f.isDeclaration(r))) throw s(r) + if (f.isStatement(r)) return n.explodeStatement(e) + if (f.isExpression(r)) return n.explodeExpression(e, t) + switch (r.type) { + case "Program": + return e.get("body").map(n.explodeStatement, n) + case "VariableDeclarator": + throw s(r) + case "Property": + case "SwitchCase": + case "CatchClause": + throw new Error( + r.type + " nodes should be handled by their parents" + ) + default: + throw new Error("unknown Node of type " + JSON.stringify(r.type)) + } + }), + (b.explodeStatement = function(e, t) { + var r = e.node, + n = this, + s = void 0, + a = void 0, + o = void 0 + if ( + (f.assertStatement(r), + t ? f.assertIdentifier(t) : (t = null), + f.isBlockStatement(r)) + ) + return void e.get("body").forEach(function(e) { + n.explodeStatement(e) + }) + if (!y.containsLeap(r)) return void n.emit(r) + switch (r.type) { + case "ExpressionStatement": + n.explodeExpression(e.get("expression"), !0) + break + case "LabeledStatement": + ;(a = i()), + n.leapManager.withEntry( + new d.LabeledEntry(a, r.label), + function() { + n.explodeStatement(e.get("body"), r.label) + } + ), + n.mark(a) + break + case "WhileStatement": + ;(s = i()), + (a = i()), + n.mark(s), + n.jumpIfNot(n.explodeExpression(e.get("test")), a), + n.leapManager.withEntry(new d.LoopEntry(a, s, t), function() { + n.explodeStatement(e.get("body")) + }), + n.jump(s), + n.mark(a) + break + case "DoWhileStatement": + var u = i(), + l = i() + ;(a = i()), + n.mark(u), + n.leapManager.withEntry(new d.LoopEntry(a, l, t), function() { + n.explode(e.get("body")) + }), + n.mark(l), + n.jumpIf(n.explodeExpression(e.get("test")), u), + n.mark(a) + break + case "ForStatement": + o = i() + var p = i() + ;(a = i()), + r.init && n.explode(e.get("init"), !0), + n.mark(o), + r.test && n.jumpIfNot(n.explodeExpression(e.get("test")), a), + n.leapManager.withEntry(new d.LoopEntry(a, p, t), function() { + n.explodeStatement(e.get("body")) + }), + n.mark(p), + r.update && n.explode(e.get("update"), !0), + n.jump(o), + n.mark(a) + break + case "TypeCastExpression": + return n.explodeExpression(e.get("expression")) + case "ForInStatement": + ;(o = i()), (a = i()) + var h = n.makeTempVar() + n.emitAssign( + h, + f.callExpression(g.runtimeProperty("keys"), [ + n.explodeExpression(e.get("right")) + ]) + ), + n.mark(o) + var m = n.makeTempVar() + n.jumpIf( + f.memberExpression( + f.assignmentExpression("=", m, f.callExpression(h, [])), + f.identifier("done"), + !1 + ), + a + ), + n.emitAssign( + r.left, + f.memberExpression(m, f.identifier("value"), !1) + ), + n.leapManager.withEntry(new d.LoopEntry(a, o, t), function() { + n.explodeStatement(e.get("body")) + }), + n.jump(o), + n.mark(a) + break + case "BreakStatement": + n.emitAbruptCompletion({ + type: "break", + target: n.leapManager.getBreakLoc(r.label) + }) + break + case "ContinueStatement": + n.emitAbruptCompletion({ + type: "continue", + target: n.leapManager.getContinueLoc(r.label) + }) + break + case "SwitchStatement": + var v = n.emitAssign( + n.makeTempVar(), + n.explodeExpression(e.get("discriminant")) + ) + a = i() + for ( + var E = i(), b = E, A = [], D = r.cases || [], C = D.length - 1; + C >= 0; + --C + ) { + var S = D[C] + f.assertSwitchCase(S), + S.test + ? (b = f.conditionalExpression( + f.binaryExpression("===", v, S.test), + (A[C] = i()), + b + )) + : (A[C] = E) + } + var F = e.get("discriminant") + F.replaceWith(b), + n.jump(n.explodeExpression(F)), + n.leapManager.withEntry(new d.SwitchEntry(a), function() { + e.get("cases").forEach(function(e) { + var t = e.key + n.mark(A[t]), + e.get("consequent").forEach(function(e) { + n.explodeStatement(e) + }) + }) + }), + n.mark(a), + -1 === E.value && + (n.mark(E), c["default"].strictEqual(a.value, E.value)) + break + case "IfStatement": + var w = r.alternate && i() + ;(a = i()), + n.jumpIfNot(n.explodeExpression(e.get("test")), w || a), + n.explodeStatement(e.get("consequent")), + w && + (n.jump(a), + n.mark(w), + n.explodeStatement(e.get("alternate"))), + n.mark(a) + break + case "ReturnStatement": + n.emitAbruptCompletion({ + type: "return", + value: n.explodeExpression(e.get("argument")) + }) + break + case "WithStatement": + throw new Error( + "WithStatement not supported in generator functions." + ) + case "TryStatement": + a = i() + var _ = r.handler, + T = _ && i(), + P = T && new d.CatchEntry(T, _.param), + B = r.finalizer && i(), + k = B && new d.FinallyEntry(B, a), + I = new d.TryEntry(n.getUnmarkedCurrentLoc(), P, k) + n.tryEntries.push(I), + n.updateContextPrevLoc(I.firstLoc), + n.leapManager.withEntry(I, function() { + n.explodeStatement(e.get("block")), + T && + !(function() { + B ? n.jump(B) : n.jump(a), + n.updateContextPrevLoc(n.mark(T)) + var t = e.get("handler.body"), + r = n.makeTempVar() + n.clearPendingException(I.firstLoc, r), + t.traverse(x, { + safeParam: r, + catchParamName: _.param.name + }), + n.leapManager.withEntry(P, function() { + n.explodeStatement(t) + }) + })(), + B && + (n.updateContextPrevLoc(n.mark(B)), + n.leapManager.withEntry(k, function() { + n.explodeStatement(e.get("finalizer")) + }), + n.emit( + f.returnStatement( + f.callExpression( + n.contextProperty("finish"), + [k.firstLoc] + ) + ) + )) + }), + n.mark(a) + break + case "ThrowStatement": + n.emit(f.throwStatement(n.explodeExpression(e.get("argument")))) + break + default: + throw new Error( + "unknown Statement of type " + JSON.stringify(r.type) + ) + } + }) + var x = { + Identifier: function(e, t) { + e.node.name === t.catchParamName && + g.isReference(e) && + e.replaceWith(t.safeParam) + }, + Scope: function(e, t) { + e.scope.hasOwnBinding(t.catchParamName) && e.skip() + } + } + ;(b.emitAbruptCompletion = function(e) { + a(e) || c["default"].ok(!1, "invalid completion record: " + JSON.stringify(e)), + c["default"].notStrictEqual( + e.type, + "normal", + "normal completions are not abrupt" + ) + var t = [f.stringLiteral(e.type)] + "break" === e.type || "continue" === e.type + ? (f.assertLiteral(e.target), (t[1] = e.target)) + : ("return" !== e.type && "throw" !== e.type) || + (e.value && (f.assertExpression(e.value), (t[1] = e.value))), + this.emit( + f.returnStatement(f.callExpression(this.contextProperty("abrupt"), t)) + ) + }), + (b.getUnmarkedCurrentLoc = function() { + return f.numericLiteral(this.listing.length) + }), + (b.updateContextPrevLoc = function(e) { + e + ? (f.assertLiteral(e), + -1 === e.value + ? (e.value = this.listing.length) + : c["default"].strictEqual(e.value, this.listing.length)) + : (e = this.getUnmarkedCurrentLoc()), + this.emitAssign(this.contextProperty("prev"), e) + }), + (b.explodeExpression = function(e, t) { + function r(e) { + return f.assertExpression(e), t ? void a.emit(e) : e + } + function n(e, t, r) { + c["default"].ok( + !r || !e, + "Ignoring the result of a child expression but forcing it to be assigned to a temporary variable?" + ) + var n = a.explodeExpression(t, r) + return ( + r || + ((e || (l && !f.isLiteral(n))) && + (n = a.emitAssign(e || a.makeTempVar(), n))), + n + ) + } + var s = e.node + if (!s) return s + f.assertExpression(s) + var a = this, + o = void 0, + u = void 0 + if (!y.containsLeap(s)) return r(s) + var l = y.containsLeap.onlyChildren(s) + switch (s.type) { + case "MemberExpression": + return r( + f.memberExpression( + a.explodeExpression(e.get("object")), + s.computed ? n(null, e.get("property")) : s.property, + s.computed + ) + ) + case "CallExpression": + var p = e.get("callee"), + h = e.get("arguments"), + d = void 0, + m = [], + v = !1 + if ( + (h.forEach(function(e) { + v = v || y.containsLeap(e.node) + }), + f.isMemberExpression(p.node)) + ) + if (v) { + var g = n(a.makeTempVar(), p.get("object")), + E = p.node.computed + ? n(null, p.get("property")) + : p.node.property + m.unshift(g), + (d = f.memberExpression( + f.memberExpression(g, E, p.node.computed), + f.identifier("call"), + !1 + )) + } else d = a.explodeExpression(p) + else + (d = a.explodeExpression(p)), + f.isMemberExpression(d) && + (d = f.sequenceExpression([f.numericLiteral(0), d])) + return ( + h.forEach(function(e) { + m.push(n(null, e)) + }), + r(f.callExpression(d, m)) + ) + case "NewExpression": + return r( + f.newExpression( + n(null, e.get("callee")), + e.get("arguments").map(function(e) { + return n(null, e) + }) + ) + ) + case "ObjectExpression": + return r( + f.objectExpression( + e.get("properties").map(function(e) { + return e.isObjectProperty() + ? f.objectProperty( + e.node.key, + n(null, e.get("value")), + e.node.computed + ) + : e.node + }) + ) + ) + case "ArrayExpression": + return r( + f.arrayExpression( + e.get("elements").map(function(e) { + return n(null, e) + }) + ) + ) + case "SequenceExpression": + var b = s.expressions.length - 1 + return ( + e.get("expressions").forEach(function(e) { + e.key === b + ? (o = a.explodeExpression(e, t)) + : a.explodeExpression(e, !0) + }), + o + ) + case "LogicalExpression": + ;(u = i()), t || (o = a.makeTempVar()) + var x = n(o, e.get("left")) + return ( + "&&" === s.operator + ? a.jumpIfNot(x, u) + : (c["default"].strictEqual(s.operator, "||"), + a.jumpIf(x, u)), + n(o, e.get("right"), t), + a.mark(u), + o + ) + case "ConditionalExpression": + var A = i() + u = i() + var D = a.explodeExpression(e.get("test")) + return ( + a.jumpIfNot(D, A), + t || (o = a.makeTempVar()), + n(o, e.get("consequent"), t), + a.jump(u), + a.mark(A), + n(o, e.get("alternate"), t), + a.mark(u), + o + ) + case "UnaryExpression": + return r( + f.unaryExpression( + s.operator, + a.explodeExpression(e.get("argument")), + !!s.prefix + ) + ) + case "BinaryExpression": + return r( + f.binaryExpression( + s.operator, + n(null, e.get("left")), + n(null, e.get("right")) + ) + ) + case "AssignmentExpression": + return r( + f.assignmentExpression( + s.operator, + a.explodeExpression(e.get("left")), + a.explodeExpression(e.get("right")) + ) + ) + case "UpdateExpression": + return r( + f.updateExpression( + s.operator, + a.explodeExpression(e.get("argument")), + s.prefix + ) + ) + case "YieldExpression": + u = i() + var C = s.argument && a.explodeExpression(e.get("argument")) + if (C && s.delegate) { + var S = a.makeTempVar() + return ( + a.emit( + f.returnStatement( + f.callExpression( + a.contextProperty("delegateYield"), + [C, f.stringLiteral(S.property.name), u] + ) + ) + ), + a.mark(u), + S + ) + } + return ( + a.emitAssign(a.contextProperty("next"), u), + a.emit(f.returnStatement(C || null)), + a.mark(u), + a.contextProperty("sent") + ) + default: + throw new Error( + "unknown Expression of type " + JSON.stringify(s.type) + ) + } + }) + }, + function(e, t, r) { + "use strict" + function n(e) { + return o.memberExpression( + o.identifier("regeneratorRuntime"), + o.identifier(e), + !1 + ) + } + function i(e) { + return e.isReferenced() || e.parentPath.isAssignmentExpression({ left: e.node }) + } + var s = r(27)["default"] + ;(t.__esModule = !0), (t.runtimeProperty = n), (t.isReference = i) + var a = r(30), + o = s(a) + }, + [7334, 6794], + [7335, 6795], + [7341, 6801], + 581, + [7358, 6809], + [7361, 1310], + [7364, 546, 118], + [7369, 2390, 769, 2391, 1312, 1311, 771, 6810, 1315, 118, 453], + 1380, + [7373, 1312], + [7376, 770], + 805, + [7395, 365], + 1391, + [7407, 27, 30], + [7411, 365], + [7320, 6847], + 1370, + 1398, + [7439, 6872, 774], + [7455, 6895], + [7466, 6876], + [7468, 6890], + [7479, 1320, 772], + [7488, 6870, 2401, 6879], + [7328, 6896], + [7429, 2382, 27, 30], + 1370, + 812, + [7443, 6939], + [7445, 2411, 776], + [7446, 297], + [7448, 6927, 143, 296], + 1409, + [7466, 2415], + [7471, 1325, 1326, 143], + [7472, 298, 297], + [7473, 143], + [7476, 6933, 298], + [7492, 1327, 298, 1326, 455, 143], + 1420, + function(e, t) { + "use strict" + function r(e, t, r) { + if (c) + try { + c.call(l, e, t, { value: r }) + } catch (n) { + e[t] = r + } + else e[t] = r + } + function n(e) { + return e && (r(e, "call", e.call), r(e, "apply", e.apply)), e + } + function i(e) { + return p ? p.call(l, e) : ((m.prototype = e || null), new m()) + } + function s() { + do var e = a(d.call(h.call(y(), 36), 2)) + while (f.call(v, e)) + return (v[e] = e) + } + function a(e) { + var t = {} + return (t[e] = !0), Object.keys(t)[0] + } + function o(e) { + return i(null) + } + function u(e) { + function t(t) { + function n(r, n) { + return r === u ? (n ? (i = null) : i || (i = e(t))) : void 0 + } + var i + r(t, a, n) + } + function n(e) { + return f.call(e, a) || t(e), e[a](u) + } + var a = s(), + u = i(null) + return ( + (e = e || o), + (n.forget = function(e) { + f.call(e, a) && e[a](u, !0) + }), + n + ) + } + var l = Object, + c = Object.defineProperty, + p = Object.create + n(c), n(p) + var f = n(Object.prototype.hasOwnProperty), + h = n(Number.prototype.toString), + d = n(String.prototype.slice), + m = function() {}, + y = Math.random, + v = i(null) + r(t, "makeUniqueKey", s) + var g = Object.getOwnPropertyNames + ;(Object.getOwnPropertyNames = function(e) { + for (var t = g(e), r = 0, n = 0, i = t.length; i > r; ++r) + f.call(v, t[r]) || (r > n && (t[n] = t[r]), ++n) + return (t.length = n), t + }), + r(t, "makeAccessor", u) + }, + [7334, 6980], + [7335, 6981], + [7341, 6987], + 581, + [7358, 6995], + [7361, 1332], + [7364, 549, 119], + [7369, 2432, 777, 2433, 1334, 1333, 779, 6996, 1337, 119, 456], + 1380, + [7373, 1334], + [7376, 778], + 805, + [7429, 2424, 46, 64], + [7395, 367], + 1391, + [7407, 46, 64], + [7411, 367], + [7320, 7044], + [7328, 7062], + 1370, + [7326, 7064, 2443, 7065], + 1398, + 812, + [7439, 7078, 457], + [7443, 7095], + [7445, 2448, 457], + [7446, 303], + [7447, 7103], + [7448, 7081, 144, 302], + 1409, + [7472, 172, 303], + [7473, 144], + [7476, 7087, 172], + [7477, 7077, 780, 782], + [7486, 302], + [7488, 7075, 2447, 7093], + [7492, 1346, 172, 1345, 369, 144], + 1420, + [7335, 7137], + [7341, 7143], + 581, + [7358, 7151], + [7361, 1351], + [7364, 551, 120], + [7369, 2469, 783, 2470, 1353, 1352, 785, 7152, 1356, 120, 458], + 1380, + [7373, 1353], + [7376, 784], + 805, + [7429, 1347, 47, 65], + [7395, 370], + 1391, + [7407, 47, 65], + [7411, 370], + [7320, 7200], + [7328, 7218], + 1370, + [7326, 7220, 2480, 7221], + 1398, + 812, + [7439, 7234, 459], + [7443, 7251], + [7445, 2485, 459], + [7446, 307], + [7447, 7259], + [7448, 7237, 145, 306], + 1409, + [7472, 174, 307], + [7473, 145], + [7476, 7243, 174], + [7477, 7233, 786, 788], + [7486, 306], + [7488, 7231, 2484, 7249], + [7492, 1365, 174, 1364, 372, 145], + 1420, + function(e, t, r) { + e.exports = { presets: [r(2500)], plugins: [r(1539), r(1577), r(1621), r(2300)] } + }, + function(e, t, r) { + e.exports = { presets: [r(2501)], plugins: [r(1434), r(2303)] } + }, + function(e, t, r) { + e.exports = { plugins: [r(1435), r(2261)] } + }, + function(e, t, r) { + ;(function(e, n) { + "use strict" + function i() { + function e() {} + try { + var t = new Uint8Array(1) + return ( + (t.foo = function() { + return 42 + }), + (t.constructor = e), + 42 === t.foo() && + t.constructor === e && + "function" == typeof t.subarray && + 0 === t.subarray(1, 1).byteLength + ) + } catch (r) { + return !1 + } + } + function s() { + return e.TYPED_ARRAY_SUPPORT ? 2147483647 : 1073741823 + } + function e(t) { + return this instanceof e + ? (e.TYPED_ARRAY_SUPPORT || ((this.length = 0), (this.parent = void 0)), + "number" == typeof t + ? a(this, t) + : "string" == typeof t + ? o(this, t, arguments.length > 1 ? arguments[1] : "utf8") + : u(this, t)) + : arguments.length > 1 + ? new e(t, arguments[1]) + : new e(t) + } + function a(t, r) { + if (((t = m(t, 0 > r ? 0 : 0 | y(r))), !e.TYPED_ARRAY_SUPPORT)) + for (var n = 0; r > n; n++) t[n] = 0 + return t + } + function o(e, t, r) { + ;("string" == typeof r && "" !== r) || (r = "utf8") + var n = 0 | g(t, r) + return (e = m(e, n)), e.write(t, r), e + } + function u(t, r) { + if (e.isBuffer(r)) return l(t, r) + if (z(r)) return c(t, r) + if (null == r) + throw new TypeError("must start with number, buffer, array or string") + if ("undefined" != typeof ArrayBuffer) { + if (r.buffer instanceof ArrayBuffer) return p(t, r) + if (r instanceof ArrayBuffer) return f(t, r) + } + return r.length ? h(t, r) : d(t, r) + } + function l(e, t) { + var r = 0 | y(t.length) + return (e = m(e, r)), t.copy(e, 0, 0, r), e + } + function c(e, t) { + var r = 0 | y(t.length) + e = m(e, r) + for (var n = 0; r > n; n += 1) e[n] = 255 & t[n] + return e + } + function p(e, t) { + var r = 0 | y(t.length) + e = m(e, r) + for (var n = 0; r > n; n += 1) e[n] = 255 & t[n] + return e + } + function f(t, r) { + return ( + e.TYPED_ARRAY_SUPPORT + ? (r.byteLength, (t = e._augment(new Uint8Array(r)))) + : (t = p(t, new Uint8Array(r))), + t + ) + } + function h(e, t) { + var r = 0 | y(t.length) + e = m(e, r) + for (var n = 0; r > n; n += 1) e[n] = 255 & t[n] + return e + } + function d(e, t) { + var r, + n = 0 + "Buffer" === t.type && z(t.data) && ((r = t.data), (n = 0 | y(r.length))), + (e = m(e, n)) + for (var i = 0; n > i; i += 1) e[i] = 255 & r[i] + return e + } + function m(t, r) { + e.TYPED_ARRAY_SUPPORT + ? ((t = e._augment(new Uint8Array(r))), (t.__proto__ = e.prototype)) + : ((t.length = r), (t._isBuffer = !0)) + var n = 0 !== r && r <= e.poolSize >>> 1 + return n && (t.parent = $), t + } + function y(e) { + if (e >= s()) + throw new RangeError( + "Attempt to allocate Buffer larger than maximum size: 0x" + + s().toString(16) + + " bytes" + ) + return 0 | e + } + function v(t, r) { + if (!(this instanceof v)) return new v(t, r) + var n = new e(t, r) + return delete n.parent, n + } + function g(e, t) { + "string" != typeof e && (e = "" + e) + var r = e.length + if (0 === r) return 0 + for (var n = !1; ; ) + switch (t) { + case "ascii": + case "binary": + case "raw": + case "raws": + return r + case "utf8": + case "utf-8": + return W(e).length + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return 2 * r + case "hex": + return r >>> 1 + case "base64": + return Y(e).length + default: + if (n) return W(e).length + ;(t = ("" + t).toLowerCase()), (n = !0) + } + } + function E(e, t, r) { + var n = !1 + if ( + ((t = 0 | t), + (r = void 0 === r || r === 1 / 0 ? this.length : 0 | r), + e || (e = "utf8"), + 0 > t && (t = 0), + r > this.length && (r = this.length), + t >= r) + ) + return "" + for (;;) + switch (e) { + case "hex": + return B(this, t, r) + case "utf8": + case "utf-8": + return w(this, t, r) + case "ascii": + return T(this, t, r) + case "binary": + return P(this, t, r) + case "base64": + return F(this, t, r) + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return k(this, t, r) + default: + if (n) throw new TypeError("Unknown encoding: " + e) + ;(e = (e + "").toLowerCase()), (n = !0) + } + } + function b(e, t, r, n) { + r = Number(r) || 0 + var i = e.length - r + n ? ((n = Number(n)), n > i && (n = i)) : (n = i) + var s = t.length + if (s % 2 !== 0) throw new Error("Invalid hex string") + n > s / 2 && (n = s / 2) + for (var a = 0; n > a; a++) { + var o = parseInt(t.substr(2 * a, 2), 16) + if (isNaN(o)) throw new Error("Invalid hex string") + e[r + a] = o + } + return a + } + function x(e, t, r, n) { + return J(W(t, e.length - r), e, r, n) + } + function A(e, t, r, n) { + return J(q(t), e, r, n) + } + function D(e, t, r, n) { + return A(e, t, r, n) + } + function C(e, t, r, n) { + return J(Y(t), e, r, n) + } + function S(e, t, r, n) { + return J(H(t, e.length - r), e, r, n) + } + function F(e, t, r) { + return 0 === t && r === e.length + ? K.fromByteArray(e) + : K.fromByteArray(e.slice(t, r)) + } + function w(e, t, r) { + r = Math.min(e.length, r) + for (var n = [], i = t; r > i; ) { + var s = e[i], + a = null, + o = s > 239 ? 4 : s > 223 ? 3 : s > 191 ? 2 : 1 + if (r >= i + o) { + var u, l, c, p + switch (o) { + case 1: + 128 > s && (a = s) + break + case 2: + ;(u = e[i + 1]), + 128 === (192 & u) && + ((p = ((31 & s) << 6) | (63 & u)), + p > 127 && (a = p)) + break + case 3: + ;(u = e[i + 1]), + (l = e[i + 2]), + 128 === (192 & u) && + 128 === (192 & l) && + ((p = + ((15 & s) << 12) | ((63 & u) << 6) | (63 & l)), + p > 2047 && (55296 > p || p > 57343) && (a = p)) + break + case 4: + ;(u = e[i + 1]), + (l = e[i + 2]), + (c = e[i + 3]), + 128 === (192 & u) && + 128 === (192 & l) && + 128 === (192 & c) && + ((p = + ((15 & s) << 18) | + ((63 & u) << 12) | + ((63 & l) << 6) | + (63 & c)), + p > 65535 && 1114112 > p && (a = p)) + } + } + null === a + ? ((a = 65533), (o = 1)) + : a > 65535 && + ((a -= 65536), + n.push(((a >>> 10) & 1023) | 55296), + (a = 56320 | (1023 & a))), + n.push(a), + (i += o) + } + return _(n) + } + function _(e) { + var t = e.length + if (Q >= t) return String.fromCharCode.apply(String, e) + for (var r = "", n = 0; t > n; ) + r += String.fromCharCode.apply(String, e.slice(n, (n += Q))) + return r + } + function T(e, t, r) { + var n = "" + r = Math.min(e.length, r) + for (var i = t; r > i; i++) n += String.fromCharCode(127 & e[i]) + return n + } + function P(e, t, r) { + var n = "" + r = Math.min(e.length, r) + for (var i = t; r > i; i++) n += String.fromCharCode(e[i]) + return n + } + function B(e, t, r) { + var n = e.length + ;(!t || 0 > t) && (t = 0), (!r || 0 > r || r > n) && (r = n) + for (var i = "", s = t; r > s; s++) i += G(e[s]) + return i + } + function k(e, t, r) { + for (var n = e.slice(t, r), i = "", s = 0; s < n.length; s += 2) + i += String.fromCharCode(n[s] + 256 * n[s + 1]) + return i + } + function I(e, t, r) { + if (e % 1 !== 0 || 0 > e) throw new RangeError("offset is not uint") + if (e + t > r) throw new RangeError("Trying to access beyond buffer length") + } + function O(t, r, n, i, s, a) { + if (!e.isBuffer(t)) throw new TypeError("buffer must be a Buffer instance") + if (r > s || a > r) throw new RangeError("value is out of bounds") + if (n + i > t.length) throw new RangeError("index out of range") + } + function M(e, t, r, n) { + 0 > t && (t = 65535 + t + 1) + for (var i = 0, s = Math.min(e.length - r, 2); s > i; i++) + e[r + i] = + (t & (255 << (8 * (n ? i : 1 - i)))) >>> (8 * (n ? i : 1 - i)) + } + function R(e, t, r, n) { + 0 > t && (t = 4294967295 + t + 1) + for (var i = 0, s = Math.min(e.length - r, 4); s > i; i++) + e[r + i] = (t >>> (8 * (n ? i : 3 - i))) & 255 + } + function L(e, t, r, n, i, s) { + if (t > i || s > t) throw new RangeError("value is out of bounds") + if (r + n > e.length) throw new RangeError("index out of range") + if (0 > r) throw new RangeError("index out of range") + } + function N(e, t, r, n, i) { + return ( + i || L(e, t, r, 4, 3.4028234663852886e38, -3.4028234663852886e38), + X.write(e, t, r, n, 23, 4), + r + 4 + ) + } + function j(e, t, r, n, i) { + return ( + i || L(e, t, r, 8, 1.7976931348623157e308, -1.7976931348623157e308), + X.write(e, t, r, n, 52, 8), + r + 8 + ) + } + function U(e) { + if (((e = V(e).replace(ee, "")), e.length < 2)) return "" + for (; e.length % 4 !== 0; ) e += "=" + return e + } + function V(e) { + return e.trim ? e.trim() : e.replace(/^\s+|\s+$/g, "") + } + function G(e) { + return 16 > e ? "0" + e.toString(16) : e.toString(16) + } + function W(e, t) { + t = t || 1 / 0 + for (var r, n = e.length, i = null, s = [], a = 0; n > a; a++) { + if (((r = e.charCodeAt(a)), r > 55295 && 57344 > r)) { + if (!i) { + if (r > 56319) { + ;(t -= 3) > -1 && s.push(239, 191, 189) + continue + } + if (a + 1 === n) { + ;(t -= 3) > -1 && s.push(239, 191, 189) + continue + } + i = r + continue + } + if (56320 > r) { + ;(t -= 3) > -1 && s.push(239, 191, 189), (i = r) + continue + } + r = (((i - 55296) << 10) | (r - 56320)) + 65536 + } else i && (t -= 3) > -1 && s.push(239, 191, 189) + if (((i = null), 128 > r)) { + if ((t -= 1) < 0) break + s.push(r) + } else if (2048 > r) { + if ((t -= 2) < 0) break + s.push((r >> 6) | 192, (63 & r) | 128) + } else if (65536 > r) { + if ((t -= 3) < 0) break + s.push((r >> 12) | 224, ((r >> 6) & 63) | 128, (63 & r) | 128) + } else { + if (!(1114112 > r)) throw new Error("Invalid code point") + if ((t -= 4) < 0) break + s.push( + (r >> 18) | 240, + ((r >> 12) & 63) | 128, + ((r >> 6) & 63) | 128, + (63 & r) | 128 + ) + } + } + return s + } + function q(e) { + for (var t = [], r = 0; r < e.length; r++) t.push(255 & e.charCodeAt(r)) + return t + } + function H(e, t) { + for (var r, n, i, s = [], a = 0; a < e.length && !((t -= 2) < 0); a++) + (r = e.charCodeAt(a)), (n = r >> 8), (i = r % 256), s.push(i), s.push(n) + return s + } + function Y(e) { + return K.toByteArray(U(e)) + } + function J(e, t, r, n) { + for (var i = 0; n > i && !(i + r >= t.length || i >= e.length); i++) + t[i + r] = e[i] + return i + } + var K = r(7311), + X = r(7312), + z = r(7313) + ;(t.Buffer = e), + (t.SlowBuffer = v), + (t.INSPECT_MAX_BYTES = 50), + (e.poolSize = 8192) + var $ = {} + ;(e.TYPED_ARRAY_SUPPORT = + void 0 !== n.TYPED_ARRAY_SUPPORT ? n.TYPED_ARRAY_SUPPORT : i()), + e.TYPED_ARRAY_SUPPORT + ? ((e.prototype.__proto__ = Uint8Array.prototype), + (e.__proto__ = Uint8Array)) + : ((e.prototype.length = void 0), (e.prototype.parent = void 0)), + (e.isBuffer = function(e) { + return !(null == e || !e._isBuffer) + }), + (e.compare = function(t, r) { + if (!e.isBuffer(t) || !e.isBuffer(r)) + throw new TypeError("Arguments must be Buffers") + if (t === r) return 0 + for ( + var n = t.length, i = r.length, s = 0, a = Math.min(n, i); + a > s && t[s] === r[s]; + + ) + ++s + return s !== a && ((n = t[s]), (i = r[s])), i > n ? -1 : n > i ? 1 : 0 + }), + (e.isEncoding = function(e) { + switch (String(e).toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "binary": + case "base64": + case "raw": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return !0 + default: + return !1 + } + }), + (e.concat = function(t, r) { + if (!z(t)) + throw new TypeError("list argument must be an Array of Buffers.") + if (0 === t.length) return new e(0) + var n + if (void 0 === r) for (r = 0, n = 0; n < t.length; n++) r += t[n].length + var i = new e(r), + s = 0 + for (n = 0; n < t.length; n++) { + var a = t[n] + a.copy(i, s), (s += a.length) + } + return i + }), + (e.byteLength = g), + (e.prototype.toString = function() { + var e = 0 | this.length + return 0 === e + ? "" + : 0 === arguments.length + ? w(this, 0, e) + : E.apply(this, arguments) + }), + (e.prototype.equals = function(t) { + if (!e.isBuffer(t)) throw new TypeError("Argument must be a Buffer") + return this === t ? !0 : 0 === e.compare(this, t) + }), + (e.prototype.inspect = function() { + var e = "", + r = t.INSPECT_MAX_BYTES + return ( + this.length > 0 && + ((e = this.toString("hex", 0, r) + .match(/.{2}/g) + .join(" ")), + this.length > r && (e += " ... ")), + "" + ) + }), + (e.prototype.compare = function(t) { + if (!e.isBuffer(t)) throw new TypeError("Argument must be a Buffer") + return this === t ? 0 : e.compare(this, t) + }), + (e.prototype.indexOf = function(t, r) { + function n(e, t, r) { + for (var n = -1, i = 0; r + i < e.length; i++) + if (e[r + i] === t[-1 === n ? 0 : i - n]) { + if ((-1 === n && (n = i), i - n + 1 === t.length)) + return r + n + } else n = -1 + return -1 + } + if ( + (r > 2147483647 + ? (r = 2147483647) + : -2147483648 > r && (r = -2147483648), + (r >>= 0), + 0 === this.length) + ) + return -1 + if (r >= this.length) return -1 + if ((0 > r && (r = Math.max(this.length + r, 0)), "string" == typeof t)) + return 0 === t.length + ? -1 + : String.prototype.indexOf.call(this, t, r) + if (e.isBuffer(t)) return n(this, t, r) + if ("number" == typeof t) + return e.TYPED_ARRAY_SUPPORT && + "function" === Uint8Array.prototype.indexOf + ? Uint8Array.prototype.indexOf.call(this, t, r) + : n(this, [t], r) + throw new TypeError("val must be string, number or Buffer") + }), + (e.prototype.get = function(e) { + return ( + console.log( + ".get() is deprecated. Access using array indexes instead." + ), + this.readUInt8(e) + ) + }), + (e.prototype.set = function(e, t) { + return ( + console.log( + ".set() is deprecated. Access using array indexes instead." + ), + this.writeUInt8(e, t) + ) + }), + (e.prototype.write = function(e, t, r, n) { + if (void 0 === t) (n = "utf8"), (r = this.length), (t = 0) + else if (void 0 === r && "string" == typeof t) + (n = t), (r = this.length), (t = 0) + else if (isFinite(t)) + (t = 0 | t), + isFinite(r) + ? ((r = 0 | r), void 0 === n && (n = "utf8")) + : ((n = r), (r = void 0)) + else { + var i = n + ;(n = t), (t = 0 | r), (r = i) + } + var s = this.length - t + if ( + ((void 0 === r || r > s) && (r = s), + (e.length > 0 && (0 > r || 0 > t)) || t > this.length) + ) + throw new RangeError("attempt to write outside buffer bounds") + n || (n = "utf8") + for (var a = !1; ; ) + switch (n) { + case "hex": + return b(this, e, t, r) + case "utf8": + case "utf-8": + return x(this, e, t, r) + case "ascii": + return A(this, e, t, r) + case "binary": + return D(this, e, t, r) + case "base64": + return C(this, e, t, r) + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + return S(this, e, t, r) + default: + if (a) throw new TypeError("Unknown encoding: " + n) + ;(n = ("" + n).toLowerCase()), (a = !0) + } + }), + (e.prototype.toJSON = function() { + return { + type: "Buffer", + data: Array.prototype.slice.call(this._arr || this, 0) + } + }) + var Q = 4096 + ;(e.prototype.slice = function(t, r) { + var n = this.length + ;(t = ~~t), + (r = void 0 === r ? n : ~~r), + 0 > t ? ((t += n), 0 > t && (t = 0)) : t > n && (t = n), + 0 > r ? ((r += n), 0 > r && (r = 0)) : r > n && (r = n), + t > r && (r = t) + var i + if (e.TYPED_ARRAY_SUPPORT) i = e._augment(this.subarray(t, r)) + else { + var s = r - t + i = new e(s, void 0) + for (var a = 0; s > a; a++) i[a] = this[a + t] + } + return i.length && (i.parent = this.parent || this), i + }), + (e.prototype.readUIntLE = function(e, t, r) { + ;(e = 0 | e), (t = 0 | t), r || I(e, t, this.length) + for (var n = this[e], i = 1, s = 0; ++s < t && (i *= 256); ) + n += this[e + s] * i + return n + }), + (e.prototype.readUIntBE = function(e, t, r) { + ;(e = 0 | e), (t = 0 | t), r || I(e, t, this.length) + for (var n = this[e + --t], i = 1; t > 0 && (i *= 256); ) + n += this[e + --t] * i + return n + }), + (e.prototype.readUInt8 = function(e, t) { + return t || I(e, 1, this.length), this[e] + }), + (e.prototype.readUInt16LE = function(e, t) { + return t || I(e, 2, this.length), this[e] | (this[e + 1] << 8) + }), + (e.prototype.readUInt16BE = function(e, t) { + return t || I(e, 2, this.length), (this[e] << 8) | this[e + 1] + }), + (e.prototype.readUInt32LE = function(e, t) { + return ( + t || I(e, 4, this.length), + (this[e] | (this[e + 1] << 8) | (this[e + 2] << 16)) + + 16777216 * this[e + 3] + ) + }), + (e.prototype.readUInt32BE = function(e, t) { + return ( + t || I(e, 4, this.length), + 16777216 * this[e] + + ((this[e + 1] << 16) | (this[e + 2] << 8) | this[e + 3]) + ) + }), + (e.prototype.readIntLE = function(e, t, r) { + ;(e = 0 | e), (t = 0 | t), r || I(e, t, this.length) + for (var n = this[e], i = 1, s = 0; ++s < t && (i *= 256); ) + n += this[e + s] * i + return (i *= 128), n >= i && (n -= Math.pow(2, 8 * t)), n + }), + (e.prototype.readIntBE = function(e, t, r) { + ;(e = 0 | e), (t = 0 | t), r || I(e, t, this.length) + for (var n = t, i = 1, s = this[e + --n]; n > 0 && (i *= 256); ) + s += this[e + --n] * i + return (i *= 128), s >= i && (s -= Math.pow(2, 8 * t)), s + }), + (e.prototype.readInt8 = function(e, t) { + return ( + t || I(e, 1, this.length), + 128 & this[e] ? -1 * (255 - this[e] + 1) : this[e] + ) + }), + (e.prototype.readInt16LE = function(e, t) { + t || I(e, 2, this.length) + var r = this[e] | (this[e + 1] << 8) + return 32768 & r ? 4294901760 | r : r + }), + (e.prototype.readInt16BE = function(e, t) { + t || I(e, 2, this.length) + var r = this[e + 1] | (this[e] << 8) + return 32768 & r ? 4294901760 | r : r + }), + (e.prototype.readInt32LE = function(e, t) { + return ( + t || I(e, 4, this.length), + this[e] | + (this[e + 1] << 8) | + (this[e + 2] << 16) | + (this[e + 3] << 24) + ) + }), + (e.prototype.readInt32BE = function(e, t) { + return ( + t || I(e, 4, this.length), + (this[e] << 24) | + (this[e + 1] << 16) | + (this[e + 2] << 8) | + this[e + 3] + ) + }), + (e.prototype.readFloatLE = function(e, t) { + return t || I(e, 4, this.length), X.read(this, e, !0, 23, 4) + }), + (e.prototype.readFloatBE = function(e, t) { + return t || I(e, 4, this.length), X.read(this, e, !1, 23, 4) + }), + (e.prototype.readDoubleLE = function(e, t) { + return t || I(e, 8, this.length), X.read(this, e, !0, 52, 8) + }), + (e.prototype.readDoubleBE = function(e, t) { + return t || I(e, 8, this.length), X.read(this, e, !1, 52, 8) + }), + (e.prototype.writeUIntLE = function(e, t, r, n) { + ;(e = +e), + (t = 0 | t), + (r = 0 | r), + n || O(this, e, t, r, Math.pow(2, 8 * r), 0) + var i = 1, + s = 0 + for (this[t] = 255 & e; ++s < r && (i *= 256); ) + this[t + s] = (e / i) & 255 + return t + r + }), + (e.prototype.writeUIntBE = function(e, t, r, n) { + ;(e = +e), + (t = 0 | t), + (r = 0 | r), + n || O(this, e, t, r, Math.pow(2, 8 * r), 0) + var i = r - 1, + s = 1 + for (this[t + i] = 255 & e; --i >= 0 && (s *= 256); ) + this[t + i] = (e / s) & 255 + return t + r + }), + (e.prototype.writeUInt8 = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 1, 255, 0), + e.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), + (this[r] = 255 & t), + r + 1 + ) + }), + (e.prototype.writeUInt16LE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 2, 65535, 0), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = 255 & t), (this[r + 1] = t >>> 8)) + : M(this, t, r, !0), + r + 2 + ) + }), + (e.prototype.writeUInt16BE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 2, 65535, 0), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = t >>> 8), (this[r + 1] = 255 & t)) + : M(this, t, r, !1), + r + 2 + ) + }), + (e.prototype.writeUInt32LE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 4, 4294967295, 0), + e.TYPED_ARRAY_SUPPORT + ? ((this[r + 3] = t >>> 24), + (this[r + 2] = t >>> 16), + (this[r + 1] = t >>> 8), + (this[r] = 255 & t)) + : R(this, t, r, !0), + r + 4 + ) + }), + (e.prototype.writeUInt32BE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 4, 4294967295, 0), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = t >>> 24), + (this[r + 1] = t >>> 16), + (this[r + 2] = t >>> 8), + (this[r + 3] = 255 & t)) + : R(this, t, r, !1), + r + 4 + ) + }), + (e.prototype.writeIntLE = function(e, t, r, n) { + if (((e = +e), (t = 0 | t), !n)) { + var i = Math.pow(2, 8 * r - 1) + O(this, e, t, r, i - 1, -i) + } + var s = 0, + a = 1, + o = 0 > e ? 1 : 0 + for (this[t] = 255 & e; ++s < r && (a *= 256); ) + this[t + s] = (((e / a) >> 0) - o) & 255 + return t + r + }), + (e.prototype.writeIntBE = function(e, t, r, n) { + if (((e = +e), (t = 0 | t), !n)) { + var i = Math.pow(2, 8 * r - 1) + O(this, e, t, r, i - 1, -i) + } + var s = r - 1, + a = 1, + o = 0 > e ? 1 : 0 + for (this[t + s] = 255 & e; --s >= 0 && (a *= 256); ) + this[t + s] = (((e / a) >> 0) - o) & 255 + return t + r + }), + (e.prototype.writeInt8 = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 1, 127, -128), + e.TYPED_ARRAY_SUPPORT || (t = Math.floor(t)), + 0 > t && (t = 255 + t + 1), + (this[r] = 255 & t), + r + 1 + ) + }), + (e.prototype.writeInt16LE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 2, 32767, -32768), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = 255 & t), (this[r + 1] = t >>> 8)) + : M(this, t, r, !0), + r + 2 + ) + }), + (e.prototype.writeInt16BE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 2, 32767, -32768), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = t >>> 8), (this[r + 1] = 255 & t)) + : M(this, t, r, !1), + r + 2 + ) + }), + (e.prototype.writeInt32LE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 4, 2147483647, -2147483648), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = 255 & t), + (this[r + 1] = t >>> 8), + (this[r + 2] = t >>> 16), + (this[r + 3] = t >>> 24)) + : R(this, t, r, !0), + r + 4 + ) + }), + (e.prototype.writeInt32BE = function(t, r, n) { + return ( + (t = +t), + (r = 0 | r), + n || O(this, t, r, 4, 2147483647, -2147483648), + 0 > t && (t = 4294967295 + t + 1), + e.TYPED_ARRAY_SUPPORT + ? ((this[r] = t >>> 24), + (this[r + 1] = t >>> 16), + (this[r + 2] = t >>> 8), + (this[r + 3] = 255 & t)) + : R(this, t, r, !1), + r + 4 + ) + }), + (e.prototype.writeFloatLE = function(e, t, r) { + return N(this, e, t, !0, r) + }), + (e.prototype.writeFloatBE = function(e, t, r) { + return N(this, e, t, !1, r) + }), + (e.prototype.writeDoubleLE = function(e, t, r) { + return j(this, e, t, !0, r) + }), + (e.prototype.writeDoubleBE = function(e, t, r) { + return j(this, e, t, !1, r) + }), + (e.prototype.copy = function(t, r, n, i) { + if ( + (n || (n = 0), + i || 0 === i || (i = this.length), + r >= t.length && (r = t.length), + r || (r = 0), + i > 0 && n > i && (i = n), + i === n) + ) + return 0 + if (0 === t.length || 0 === this.length) return 0 + if (0 > r) throw new RangeError("targetStart out of bounds") + if (0 > n || n >= this.length) + throw new RangeError("sourceStart out of bounds") + if (0 > i) throw new RangeError("sourceEnd out of bounds") + i > this.length && (i = this.length), + t.length - r < i - n && (i = t.length - r + n) + var s, + a = i - n + if (this === t && r > n && i > r) + for (s = a - 1; s >= 0; s--) t[s + r] = this[s + n] + else if (1e3 > a || !e.TYPED_ARRAY_SUPPORT) + for (s = 0; a > s; s++) t[s + r] = this[s + n] + else t._set(this.subarray(n, n + a), r) + return a + }), + (e.prototype.fill = function(e, t, r) { + if ((e || (e = 0), t || (t = 0), r || (r = this.length), t > r)) + throw new RangeError("end < start") + if (r !== t && 0 !== this.length) { + if (0 > t || t >= this.length) + throw new RangeError("start out of bounds") + if (0 > r || r > this.length) + throw new RangeError("end out of bounds") + var n + if ("number" == typeof e) for (n = t; r > n; n++) this[n] = e + else { + var i = W(e.toString()), + s = i.length + for (n = t; r > n; n++) this[n] = i[n % s] + } + return this + } + }), + (e.prototype.toArrayBuffer = function() { + if ("undefined" != typeof Uint8Array) { + if (e.TYPED_ARRAY_SUPPORT) return new e(this).buffer + for ( + var t = new Uint8Array(this.length), r = 0, n = t.length; + n > r; + r += 1 + ) + t[r] = this[r] + return t.buffer + } + throw new TypeError( + "Buffer.toArrayBuffer not supported in this browser" + ) + }) + var Z = e.prototype + e._augment = function(t) { + return ( + (t.constructor = e), + (t._isBuffer = !0), + (t._set = t.set), + (t.get = Z.get), + (t.set = Z.set), + (t.write = Z.write), + (t.toString = Z.toString), + (t.toLocaleString = Z.toString), + (t.toJSON = Z.toJSON), + (t.equals = Z.equals), + (t.compare = Z.compare), + (t.indexOf = Z.indexOf), + (t.copy = Z.copy), + (t.slice = Z.slice), + (t.readUIntLE = Z.readUIntLE), + (t.readUIntBE = Z.readUIntBE), + (t.readUInt8 = Z.readUInt8), + (t.readUInt16LE = Z.readUInt16LE), + (t.readUInt16BE = Z.readUInt16BE), + (t.readUInt32LE = Z.readUInt32LE), + (t.readUInt32BE = Z.readUInt32BE), + (t.readIntLE = Z.readIntLE), + (t.readIntBE = Z.readIntBE), + (t.readInt8 = Z.readInt8), + (t.readInt16LE = Z.readInt16LE), + (t.readInt16BE = Z.readInt16BE), + (t.readInt32LE = Z.readInt32LE), + (t.readInt32BE = Z.readInt32BE), + (t.readFloatLE = Z.readFloatLE), + (t.readFloatBE = Z.readFloatBE), + (t.readDoubleLE = Z.readDoubleLE), + (t.readDoubleBE = Z.readDoubleBE), + (t.writeUInt8 = Z.writeUInt8), + (t.writeUIntLE = Z.writeUIntLE), + (t.writeUIntBE = Z.writeUIntBE), + (t.writeUInt16LE = Z.writeUInt16LE), + (t.writeUInt16BE = Z.writeUInt16BE), + (t.writeUInt32LE = Z.writeUInt32LE), + (t.writeUInt32BE = Z.writeUInt32BE), + (t.writeIntLE = Z.writeIntLE), + (t.writeIntBE = Z.writeIntBE), + (t.writeInt8 = Z.writeInt8), + (t.writeInt16LE = Z.writeInt16LE), + (t.writeInt16BE = Z.writeInt16BE), + (t.writeInt32LE = Z.writeInt32LE), + (t.writeInt32BE = Z.writeInt32BE), + (t.writeFloatLE = Z.writeFloatLE), + (t.writeFloatBE = Z.writeFloatBE), + (t.writeDoubleLE = Z.writeDoubleLE), + (t.writeDoubleBE = Z.writeDoubleBE), + (t.fill = Z.fill), + (t.inspect = Z.inspect), + (t.toArrayBuffer = Z.toArrayBuffer), + t + ) + } + var ee = /[^+\/0-9A-Za-z-_]/g + }.call( + t, + r(2502).Buffer, + (function() { + return this + })() + )) + }, + function(e, t, r) { + e.exports = r(1366) + }, + function(e, t, r) { + "use strict" + var n = r(146)["default"], + i = r(5)["default"] + t.__esModule = !0 + var s = r(2696), + a = i(s) + ;(t["default"] = function(e, t) { + return e && t + ? a["default"](e, t, function(e, t) { + if (t && Array.isArray(e)) { + for ( + var r = t.slice(0), + i = e, + s = Array.isArray(i), + a = 0, + i = s ? i : n(i); + ; + + ) { + var o + if (s) { + if (a >= i.length) break + o = i[a++] + } else { + if (((a = i.next()), a.done)) break + o = a.value + } + var u = o + r.indexOf(u) < 0 && r.push(u) + } + return r + } + }) + : void 0 + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(3)["default"] + t.__esModule = !0 + var i = r(16), + s = n(i) + ;(t["default"] = function(e, t, r) { + if (e) { + if ("Program" === e.type) return s.file(e, t || [], r || []) + if ("File" === e.type) return e + } + throw new Error("Not a valid ast?") + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + ;(function(n) { + "use strict" + var i = r(5)["default"] + t.__esModule = !0 + var s = r(373), + a = i(s), + o = r(175), + u = i(o), + l = {} + ;(t["default"] = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? n.cwd() + : arguments[1] + if ("object" == typeof a["default"]) return null + var r = l[t] + if (!r) { + r = new a["default"]() + var i = u["default"].join(t, ".babelrc") + ;(r.id = i), + (r.filename = i), + (r.paths = a["default"]._nodeModulePaths(t)), + (l[t] = r) + } + try { + return a["default"]._resolveFilename(e, r) + } catch (s) { + return null + } + }), + (e.exports = t["default"]) + }.call(t, r(1))) + }, + function(e, t, r) { + "use strict" + function n(e, t) { + var r = [], + n = b.functionExpression( + null, + [b.identifier("global")], + b.blockStatement(r) + ), + i = b.program([ + b.expressionStatement(b.callExpression(n, [c.get("selfGlobal")])) + ]) + return ( + r.push( + b.variableDeclaration("var", [ + b.variableDeclarator( + e, + b.assignmentExpression( + "=", + b.memberExpression(b.identifier("global"), e), + b.objectExpression([]) + ) + ) + ]) + ), + t(r), + i + ) + } + function i(e, t) { + var r = [] + return ( + r.push( + b.variableDeclaration("var", [ + b.variableDeclarator(e, b.identifier("global")) + ]) + ), + t(r), + b.program([ + x({ + FACTORY_PARAMETERS: b.identifier("global"), + BROWSER_ARGUMENTS: b.assignmentExpression( + "=", + b.memberExpression(b.identifier("root"), e), + b.objectExpression([]) + ), + COMMON_ARGUMENTS: b.identifier("exports"), + AMD_ARGUMENTS: b.arrayExpression([b.stringLiteral("exports")]), + FACTORY_BODY: r, + UMD_ROOT: b.identifier("this") + }) + ]) + ) + } + function s(e, t) { + var r = [] + return ( + r.push( + b.variableDeclaration("var", [ + b.variableDeclarator(e, b.objectExpression([])) + ]) + ), + t(r), + r.push(b.expressionStatement(e)), + b.program(r) + ) + } + function a(e, t, r) { + g["default"](c.list, function(n) { + if (!(r && r.indexOf(n) < 0)) { + var i = b.identifier(n) + e.push( + b.expressionStatement( + b.assignmentExpression("=", b.memberExpression(t, i), c.get(n)) + ) + ) + } + }) + } + var o = r(3)["default"], + u = r(5)["default"] + t.__esModule = !0 + var l = r(1374), + c = o(l), + p = r(1372), + f = u(p), + h = r(176), + d = o(h), + m = r(807), + y = u(m), + v = r(811), + g = u(v), + E = r(16), + b = o(E), + x = y["default"]( + '\n (function (root, factory) {\n if (typeof define === "function" && define.amd) {\n define(AMD_ARGUMENTS, factory);\n } else if (typeof exports === "object") {\n factory(COMMON_ARGUMENTS);\n } else {\n factory(BROWSER_ARGUMENTS);\n }\n })(UMD_ROOT, function (FACTORY_PARAMETERS) {\n FACTORY_BODY\n });\n' + ) + ;(t["default"] = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? "global" + : arguments[1], + r = b.identifier("babelHelpers"), + o = function(t) { + return a(t, r, e) + }, + u = void 0, + l = { global: n, umd: i, var: s }[t] + if (!l) throw new Error(d.get("unsupportedOutputType", t)) + return (u = l(r, o)), f["default"](u).code + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(80)["default"], + i = r(5)["default"] + t.__esModule = !0 + var s = r(2647), + a = i(s), + o = a["default"]("babel:verbose"), + u = a["default"]("babel"), + l = [], + c = (function() { + function e(t, r) { + n(this, e), (this.filename = r), (this.file = t) + } + return ( + (e.prototype._buildMessage = function(e) { + var t = "[BABEL] " + this.filename + return e && (t += ": " + e), t + }), + (e.prototype.warn = function(e) { + console.warn(this._buildMessage(e)) + }), + (e.prototype.error = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? Error + : arguments[1] + throw new t(this._buildMessage(e)) + }), + (e.prototype.deprecate = function(e) { + ;(this.file.opts && this.file.opts.suppressDeprecationMessages) || + ((e = this._buildMessage(e)), + l.indexOf(e) >= 0 || (l.push(e), console.error(e))) + }), + (e.prototype.verbose = function(e) { + o.enabled && o(this._buildMessage(e)) + }), + (e.prototype.debug = function(e) { + u.enabled && u(this._buildMessage(e)) + }), + (e.prototype.deopt = function(e, t) { + this.debug(t) + }), + e + ) + })() + ;(t["default"] = c), (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e, t) { + var r = e.node, + n = r.source ? r.source.value : null, + i = t.metadata.modules.exports, + s = e.get("declaration") + if (s.isStatement()) { + var a = s.getBindingIdentifiers() + for (var u in a) + i.exported.push(u), + i.specifiers.push({ + kind: "local", + local: u, + exported: e.isExportDefaultDeclaration() ? "default" : u + }) + } + if (e.isExportNamedDeclaration() && r.specifiers) + for (var l = r.specifiers, c = 0; c < l.length; c++) { + var p = l[c], + f = p.exported.name + i.exported.push(f), + o.isExportDefaultSpecifier(p) && + i.specifiers.push({ + kind: "external", + local: f, + exported: f, + source: n + }), + o.isExportNamespaceSpecifier(p) && + i.specifiers.push({ + kind: "external-namespace", + exported: f, + source: n + }) + var h = p.local + h && + (n && + i.specifiers.push({ + kind: "external", + local: h.name, + exported: f, + source: n + }), + n || + i.specifiers.push({ + kind: "local", + local: h.name, + exported: f + })) + } + e.isExportAllDeclaration() && + i.specifiers.push({ kind: "external-all", source: n }) + } + function i(e) { + e.skip() + } + var s = r(3)["default"] + ;(t.__esModule = !0), (t.ExportDeclaration = n), (t.Scope = i) + var a = r(16), + o = s(a), + u = { + enter: function(e, t) { + var r = e.node + r.source && (r.source.value = t.resolveModuleSource(r.source.value)) + } + } + t.ModuleDeclaration = u + var l = { + exit: function(e, t) { + var r = e.node, + n = [], + i = [] + t.metadata.modules.imports.push({ + source: r.source.value, + imported: i, + specifiers: n + }) + for (var s = e.get("specifiers"), a = 0; a < s.length; a++) { + var o = s[a], + u = o.node.local.name + if ( + (o.isImportDefaultSpecifier() && + (i.push("default"), + n.push({ kind: "named", imported: "default", local: u })), + o.isImportSpecifier()) + ) { + var l = o.node.imported.name + i.push(l), n.push({ kind: "named", imported: l, local: u }) + } + o.isImportNamespaceSpecifier() && + (i.push("*"), n.push({ kind: "namespace", local: u })) + } + } + } + t.ImportDeclaration = l + }, + function(e, t, r) { + "use strict" + var n = r(5)["default"] + t.__esModule = !0 + var i = r(553), + s = n(i), + a = r(2655), + o = n(a) + ;(t["default"] = new s["default"]({ + visitor: { + Block: { + exit: function(e) { + for (var t = e.node, r = !1, n = 0; n < t.body.length; n++) { + var i = t.body[n] + if (i && null != i._blockHoist) { + r = !0 + break + } + } + r && + (t.body = o["default"](t.body, function(e) { + var t = e && e._blockHoist + return null == t && (t = 1), t === !0 && (t = 2), -1 * t + })) + } + } + } + })), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e, t) { + return e.is("_forceShadow") ? !0 : t && !t.isArrowFunctionExpression() + } + function i(e, t, r) { + var i = e.inShadow(t) + if (n(e, i)) { + var s = e.node._shadowedFunctionLiteral, + a = void 0, + o = e.findParent(function(e) { + return ( + (e.isProgram() || e.isFunction()) && (a = a || e), + e.isProgram() + ? !0 + : e.isFunction() + ? s + ? e === s || e.node === s.node + : !e.is("shadow") + : !1 + ) + }) + if (o !== a) { + var u = o.getData(t) + if (u) return e.replaceWith(u) + var l = r(), + c = e.scope.generateUidIdentifier(t) + return ( + o.setData(t, c), o.scope.push({ id: c, init: l }), e.replaceWith(c) + ) + } + } + } + var s = r(5)["default"], + a = r(3)["default"] + t.__esModule = !0 + var o = r(553), + u = s(o), + l = r(16), + c = a(l) + ;(t["default"] = new u["default"]({ + visitor: { + ThisExpression: function(e) { + i(e, "this", function() { + return c.thisExpression() + }) + }, + ReferencedIdentifier: function(e) { + "arguments" === e.node.name && + i(e, "arguments", function() { + return c.identifier("arguments") + }) + } + } + })), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(80)["default"], + i = r(5)["default"] + t.__esModule = !0 + var s = r(2505), + a = i(s), + o = r(553), + u = i(o), + l = r(791), + c = i(l), + p = (function() { + function e() { + n(this, e) + } + return ( + (e.prototype.lint = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? {} + : arguments[1] + return (t.code = !1), (t.mode = "lint"), this.transform(e, t) + }), + (e.prototype.pretransform = function(e, t) { + var r = new c["default"](t, this) + return r.wrap(e, function() { + return r.addCode(e), r.parseCode(e), r + }) + }), + (e.prototype.transform = function(e, t) { + var r = new c["default"](t, this) + return r.wrap(e, function() { + return r.addCode(e), r.parseCode(e), r.transform() + }) + }), + (e.prototype.analyse = function(e, t, r) { + return ( + void 0 === t && (t = {}), + (t.code = !1), + r && + ((t.plugins = t.plugins || []), + t.plugins.push(new u["default"]({ visitor: r }))), + this.transform(e, t).metadata + ) + }), + (e.prototype.transformFromAst = function(e, t, r) { + e = a["default"](e) + var n = new c["default"](r, this) + return n.wrap(t, function() { + return n.addCode(t), n.addAst(e), n.transform() + }) + }), + e + ) + })() + ;(t["default"] = p), (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(5)["default"] + t.__esModule = !0 + var a = r(790), + o = s(a), + u = r(147), + l = s(u), + c = r(791), + p = (s(c), + (function(e) { + function t(r, n) { + var s = + arguments.length <= 2 || void 0 === arguments[2] ? {} : arguments[2] + i(this, t), + e.call(this), + (this.plugin = n), + (this.file = r), + (this.opts = s) + } + return ( + n(t, e), + (t.prototype.transform = function() { + var e = this.file + e.log.debug("Start transformer " + this.key), + l["default"](e.ast, this.plugin.visitor, e.scope, e), + e.log.debug("Finish transformer " + this.key) + }), + (t.prototype.addHelper = function() { + var e + return (e = this.file).addHelper.apply(e, arguments) + }), + (t.prototype.addImport = function() { + var e + return (e = this.file).addImport.apply(e, arguments) + }), + (t.prototype.getModuleName = function() { + var e + return (e = this.file).getModuleName.apply(e, arguments) + }), + (t.prototype.buildCodeFrameError = function() { + var e + return (e = this.file).buildCodeFrameError.apply(e, arguments) + }), + t + ) + })(o["default"])) + ;(t["default"] = p), (e.exports = t["default"]) + }, + [7318, 2519, 2515, 2522, 2520, 2524], + [7319, 2517], + function(e, t) { + e.exports = { + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + grey: [128, 128, 128], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + rebeccapurple: [102, 51, 153], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] + } + }, + [7321, 1369, 2518], + [7322, 1369], + function(e, t) { + "use strict" + var r = /[|\\{}()[\]^$+*?.]/g + e.exports = function(e) { + if ("string" != typeof e) throw new TypeError("Expected a string") + return e.replace(r, "\\$&") + } + }, + [7323, 2521], + function(e, t) { + "use strict" + e.exports = function() { + return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g + } + }, + [7324, 2523], + 2521, + function(e, t, r) { + ;(function(t) { + "use strict" + var r = t.argv, + n = r.indexOf("--"), + i = function(e) { + e = "--" + e + var t = r.indexOf(e) + return -1 !== t && (-1 !== n ? n > t : !0) + } + e.exports = (function() { + return "FORCE_COLOR" in t.env + ? !0 + : i("no-color") || i("no-colors") || i("color=false") + ? !1 + : i("color") || i("colors") || i("color=true") || i("color=always") + ? !0 + : t.stdout && !t.stdout.isTTY + ? !1 + : "win32" === t.platform + ? !0 + : "COLORTERM" in t.env + ? !0 + : "dumb" === t.env.TERM + ? !1 + : !!/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(t.env.TERM) + })() + }.call(t, r(1))) + }, + function(e, t) { + !(function() { + "use strict" + function t(e) { + if (null == e) return !1 + switch (e.type) { + case "ArrayExpression": + case "AssignmentExpression": + case "BinaryExpression": + case "CallExpression": + case "ConditionalExpression": + case "FunctionExpression": + case "Identifier": + case "Literal": + case "LogicalExpression": + case "MemberExpression": + case "NewExpression": + case "ObjectExpression": + case "SequenceExpression": + case "ThisExpression": + case "UnaryExpression": + case "UpdateExpression": + return !0 + } + return !1 + } + function r(e) { + if (null == e) return !1 + switch (e.type) { + case "DoWhileStatement": + case "ForInStatement": + case "ForStatement": + case "WhileStatement": + return !0 + } + return !1 + } + function n(e) { + if (null == e) return !1 + switch (e.type) { + case "BlockStatement": + case "BreakStatement": + case "ContinueStatement": + case "DebuggerStatement": + case "DoWhileStatement": + case "EmptyStatement": + case "ExpressionStatement": + case "ForInStatement": + case "ForStatement": + case "IfStatement": + case "LabeledStatement": + case "ReturnStatement": + case "SwitchStatement": + case "ThrowStatement": + case "TryStatement": + case "VariableDeclaration": + case "WhileStatement": + case "WithStatement": + return !0 + } + return !1 + } + function i(e) { + return n(e) || (null != e && "FunctionDeclaration" === e.type) + } + function s(e) { + switch (e.type) { + case "IfStatement": + return null != e.alternate ? e.alternate : e.consequent + case "LabeledStatement": + case "ForStatement": + case "ForInStatement": + case "WhileStatement": + case "WithStatement": + return e.body + } + return null + } + function a(e) { + var t + if ("IfStatement" !== e.type) return !1 + if (null == e.alternate) return !1 + t = e.consequent + do { + if ("IfStatement" === t.type && null == t.alternate) return !0 + t = s(t) + } while (t) + return !1 + } + e.exports = { + isExpression: t, + isStatement: n, + isIterationStatement: r, + isSourceElement: i, + isProblematicIfStatement: a, + trailingStatement: s + } + })() + }, + [7325, 1370], + [7326, 2525, 1370, 2526], + function(e, t) { + ;(e.exports = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyu]{1,5}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|((?:0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?))|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]{1,6}\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-*\/%&|^]|<{1,2}|>{1,3}|!=?|={1,2})=?|[?:~]|[;,.[\](){}])|(\s+)|(^$|[\s\S])/g), + (e.exports.matchToToken = function(e) { + var t = { type: "invalid", value: e[0] } + return ( + e[1] + ? ((t.type = "string"), (t.closed = !(!e[3] && !e[4]))) + : e[5] + ? (t.type = "comment") + : e[6] + ? ((t.type = "comment"), (t.closed = !!e[7])) + : e[8] + ? (t.type = "regex") + : e[9] + ? (t.type = "number") + : e[10] + ? (t.type = "name") + : e[11] + ? (t.type = "punctuator") + : e[12] && (t.type = "whitespace"), + t + ) + }) + }, + [7327, 2530], + function(e, t) { + function r(e, t, r) { + e = String(e) + var n = -1 + for (r || (r = " "), t -= e.length; ++n < t; ) e = r + e + return e + } + e.exports = r + }, + [7328, 2532], + [7329, 2533], + function(e, t) { + "use strict" + e.exports = + Number.isNaN || + function(e) { + return e !== e + } + }, + function(e, t, r) { + "use strict" + var n = r(80)["default"], + i = r(5)["default"] + t.__esModule = !0 + var s = r(554), + a = i(s), + o = r(2556), + u = i(o), + l = (function() { + function e(t, r) { + n(this, e), + (this.printedCommentStarts = {}), + (this.parenPushNewlineState = null), + (this.position = t), + (this._indent = r.indent.base), + (this.format = r), + (this.buf = ""), + (this.last = "") + } + return ( + (e.prototype.catchUp = function(e) { + if (e.loc && this.format.retainLines && this.buf) + for (; this.position.line < e.loc.start.line; ) this._push("\n") + }), + (e.prototype.get = function() { + return u["default"](this.buf) + }), + (e.prototype.getIndent = function() { + return this.format.compact || this.format.concise + ? "" + : a["default"](this.format.indent.style, this._indent) + }), + (e.prototype.indentSize = function() { + return this.getIndent().length + }), + (e.prototype.indent = function() { + this._indent++ + }), + (e.prototype.dedent = function() { + this._indent-- + }), + (e.prototype.semicolon = function() { + this.push(";") + }), + (e.prototype.ensureSemicolon = function() { + this.isLast(";") || this.semicolon() + }), + (e.prototype.rightBrace = function() { + this.newline(!0), + this.format.minified && + !this._lastPrintedIsEmptyStatement && + this._removeLast(";"), + this.push("}") + }), + (e.prototype.keyword = function(e) { + this.push(e), this.space() + }), + (e.prototype.space = function(e) { + ;(!e && this.format.compact) || + ((e || (this.buf && !this.isLast(" ") && !this.isLast("\n"))) && + this.push(" ")) + }), + (e.prototype.removeLast = function(e) { + return this.format.compact ? void 0 : this._removeLast(e) + }), + (e.prototype._removeLast = function(e) { + this._isLast(e) && + ((this.buf = this.buf.slice(0, -1)), + (this.last = this.buf[this.buf.length - 1]), + this.position.unshift(e)) + }), + (e.prototype.startTerminatorless = function() { + return (this.parenPushNewlineState = { printed: !1 }) + }), + (e.prototype.endTerminatorless = function(e) { + e.printed && (this.dedent(), this.newline(), this.push(")")) + }), + (e.prototype.newline = function(e, t) { + return this.format.retainLines || this.format.compact + ? void 0 + : this.format.concise + ? void this.space() + : void ( + this.endsWith("\n\n") || + ("boolean" == typeof e && (t = e), + "number" != typeof e && (e = 1), + (e = Math.min(2, e)), + (this.endsWith("{\n") || this.endsWith(":\n")) && e--, + 0 >= e || + (t && this.removeLast("\n"), + this.removeLast(" "), + this._removeSpacesAfterLastNewline(), + this._push(a["default"]("\n", e)))) + ) + }), + (e.prototype._removeSpacesAfterLastNewline = function() { + var e = this.buf.lastIndexOf("\n") + e >= 0 && + this.get().length <= e && + ((this.buf = this.buf.substring(0, e + 1)), (this.last = "\n")) + }), + (e.prototype.push = function(e, t) { + if (!this.format.compact && this._indent && !t && "\n" !== e) { + var r = this.getIndent() + ;(e = e.replace(/\n/g, "\n" + r)), + this.isLast("\n") && this._push(r) + } + this._push(e) + }), + (e.prototype._push = function(e) { + var t = this.parenPushNewlineState + if (t) + for (var r = 0; r < e.length; r++) { + var n = e[r] + if (" " !== n) { + ;(this.parenPushNewlineState = null), + ("\n" !== n && "/" !== n) || + (this._push("("), + this.indent(), + (t.printed = !0)) + break + } + } + this.position.push(e), + (this.buf += e), + (this.last = e[e.length - 1]) + }), + (e.prototype.endsWith = function(e) { + return 1 === e.length + ? this.last === e + : this.buf.slice(-e.length) === e + }), + (e.prototype.isLast = function(e) { + return this.format.compact ? !1 : this._isLast(e) + }), + (e.prototype._isLast = function(e) { + var t = this.last + return Array.isArray(e) ? e.indexOf(t) >= 0 : e === t + }), + e + ) + })() + ;(t["default"] = l), (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + function r(e) { + this.print(e.program, e) + } + function n(e) { + this.printInnerComments(e, !1), + this.printSequence(e.directives, e), + e.directives && e.directives.length && this.newline(), + this.printSequence(e.body, e) + } + function i(e) { + this.push("{"), + this.printInnerComments(e), + e.body.length + ? (this.newline(), + this.printSequence(e.directives, e, { indent: !0 }), + e.directives && e.directives.length && this.newline(), + this.printSequence(e.body, e, { indent: !0 }), + this.format.retainLines || + this.format.concise || + this.removeLast("\n"), + this.rightBrace()) + : this.push("}") + } + function s() {} + function a(e) { + this.print(e.value, e), this.semicolon() + } + function o(e) { + this.push(this._stringLiteral(e.value)) + } + ;(t.__esModule = !0), + (t.File = r), + (t.Program = n), + (t.BlockStatement = i), + (t.Noop = s), + (t.Directive = a), + (t.DirectiveLiteral = o) + }, + function(e, t) { + "use strict" + function r(e) { + this.printJoin(e.decorators, e, { separator: "" }), + this.push("class"), + e.id && (this.push(" "), this.print(e.id, e)), + this.print(e.typeParameters, e), + e.superClass && + (this.push(" extends "), + this.print(e.superClass, e), + this.print(e.superTypeParameters, e)), + e["implements"] && + (this.push(" implements "), + this.printJoin(e["implements"], e, { separator: ", " })), + this.space(), + this.print(e.body, e) + } + function n(e) { + this.push("{"), + this.printInnerComments(e), + 0 === e.body.length + ? this.push("}") + : (this.newline(), + this.indent(), + this.printSequence(e.body, e), + this.dedent(), + this.rightBrace()) + } + function i(e) { + this.printJoin(e.decorators, e, { separator: "" }), + e["static"] && this.push("static "), + this.print(e.key, e), + this.print(e.typeAnnotation, e), + e.value && + (this.space(), this.push("="), this.space(), this.print(e.value, e)), + this.semicolon() + } + function s(e) { + this.printJoin(e.decorators, e, { separator: "" }), + e["static"] && this.push("static "), + "constructorCall" === e.kind && this.push("call "), + this._method(e) + } + ;(t.__esModule = !0), + (t.ClassDeclaration = r), + (t.ClassBody = n), + (t.ClassProperty = i), + (t.ClassMethod = s), + (t.ClassExpression = r) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = /[a-z]$/.test(e.operator), + r = e.argument + ;(P.isUpdateExpression(r) || P.isUnaryExpression(r)) && (t = !0), + P.isUnaryExpression(r) && "!" === r.operator && (t = !1), + this.push(e.operator), + t && this.push(" "), + this.print(e.argument, e) + } + function i(e) { + this.push("do"), this.space(), this.print(e.body, e) + } + function s(e) { + this.push("("), this.print(e.expression, e), this.push(")") + } + function a(e) { + e.prefix + ? (this.push(e.operator), this.print(e.argument, e)) + : (this.print(e.argument, e), this.push(e.operator)) + } + function o(e) { + this.print(e.test, e), + this.space(), + this.push("?"), + this.space(), + this.print(e.consequent, e), + this.space(), + this.push(":"), + this.space(), + this.print(e.alternate, e) + } + function u(e, t) { + this.push("new "), + this.print(e.callee, e), + (0 !== e.arguments.length || + !this.format.minified || + P.isCallExpression(t, { callee: e }) || + P.isMemberExpression(t) || + P.isNewExpression(t)) && + (this.push("("), this.printList(e.arguments, e), this.push(")")) + } + function l(e) { + this.printList(e.expressions, e) + } + function c() { + this.push("this") + } + function p() { + this.push("super") + } + function f(e) { + this.push("@"), this.print(e.expression, e), this.newline() + } + function h(e) { + this.print(e.callee, e), e.loc && this.printAuxAfterComment(), this.push("(") + var t = e._prettyCall && !this.format.retainLines && !this.format.compact, + r = void 0 + t && ((r = ",\n"), this.newline(), this.indent()), + this.printList(e.arguments, e, { separator: r }), + t && (this.newline(), this.dedent()), + this.push(")") + } + function d(e) { + return function(t) { + if ((this.push(e), t.delegate && this.push("*"), t.argument)) { + this.push(" ") + var r = this.startTerminatorless() + this.print(t.argument, t), this.endTerminatorless(r) + } + } + } + function m() { + ;(this._lastPrintedIsEmptyStatement = !0), this.semicolon() + } + function y(e) { + this.print(e.expression, e), this.semicolon() + } + function v(e) { + this.print(e.left, e), + this.space(), + this.push("="), + this.space(), + this.print(e.right, e) + } + function g(e, t) { + var r = + this._inForStatementInitCounter && + "in" === e.operator && + !k.needsParens(e, t) + r && this.push("("), this.print(e.left, e) + var n = + !this.format.compact || "in" === e.operator || "instanceof" === e.operator + if ( + (n && this.push(" "), + this.push(e.operator), + !n && + ((n = + "<" === e.operator && + P.isUnaryExpression(e.right, { prefix: !0, operator: "!" }) && + P.isUnaryExpression(e.right.argument, { + prefix: !0, + operator: "--" + })), + !n)) + ) { + var i = A(e.right) + n = + P.isUnaryExpression(i, { prefix: !0, operator: e.operator }) || + P.isUpdateExpression(i, { + prefix: !0, + operator: e.operator + e.operator + }) + } + n && this.push(" "), this.print(e.right, e), r && this.push(")") + } + function E(e) { + this.print(e.object, e), this.push("::"), this.print(e.callee, e) + } + function b(e) { + if ((this.print(e.object, e), !e.computed && P.isMemberExpression(e.property))) + throw new TypeError("Got a MemberExpression for MemberExpression property") + var t = e.computed + if ((P.isLiteral(e.property) && _["default"](e.property.value) && (t = !0), t)) + this.push("["), this.print(e.property, e), this.push("]") + else { + if (P.isNumericLiteral(e.object)) { + var r = this.getPossibleRaw(e.object) || e.object.value + !F["default"](+r) || + M.test(r) || + I.test(r) || + O.test(r) || + this.endsWith(".") || + this.push(".") + } + this.push("."), this.print(e.property, e) + } + } + function x(e) { + this.print(e.meta, e), this.push("."), this.print(e.property, e) + } + function A(e) { + return P.isBinaryExpression(e) ? A(e.left) : e + } + var D = r(5)["default"], + C = r(3)["default"] + ;(t.__esModule = !0), + (t.UnaryExpression = n), + (t.DoExpression = i), + (t.ParenthesizedExpression = s), + (t.UpdateExpression = a), + (t.ConditionalExpression = o), + (t.NewExpression = u), + (t.SequenceExpression = l), + (t.ThisExpression = c), + (t.Super = p), + (t.Decorator = f), + (t.CallExpression = h), + (t.EmptyStatement = m), + (t.ExpressionStatement = y), + (t.AssignmentPattern = v), + (t.AssignmentExpression = g), + (t.BindExpression = E), + (t.MemberExpression = b), + (t.MetaProperty = x) + var S = r(2551), + F = D(S), + w = r(1416), + _ = D(w), + T = r(16), + P = C(T), + B = r(1373), + k = C(B), + I = /e/i, + O = /\.0+$/, + M = /^0[box]/, + R = d("yield") + t.YieldExpression = R + var L = d("await") + ;(t.AwaitExpression = L), (t.BinaryExpression = g), (t.LogicalExpression = g) + }, + function(e, t, r) { + "use strict" + function n() { + this.push("any") + } + function i(e) { + this.print(e.elementType, e), this.push("["), this.push("]") + } + function s() { + this.push("bool") + } + function a(e) { + this.push(e.value ? "true" : "false") + } + function o() { + this.push("null") + } + function u(e) { + this.push("declare class "), this._interfaceish(e) + } + function l(e) { + this.push("declare function "), + this.print(e.id, e), + this.print(e.id.typeAnnotation.typeAnnotation, e), + this.semicolon() + } + function c(e) { + this.push("declare "), this.InterfaceDeclaration(e) + } + function p(e) { + this.push("declare module "), + this.print(e.id, e), + this.space(), + this.print(e.body, e) + } + function f(e) { + this.push("declare "), this.TypeAlias(e) + } + function h(e) { + this.push("declare var "), + this.print(e.id, e), + this.print(e.id.typeAnnotation, e), + this.semicolon() + } + function d() { + this.push("*") + } + function m(e, t) { + this.print(e.typeParameters, e), + this.push("("), + this.printList(e.params, e), + e.rest && + (e.params.length && (this.push(","), this.space()), + this.push("..."), + this.print(e.rest, e)), + this.push(")"), + "ObjectTypeProperty" === t.type || + "ObjectTypeCallProperty" === t.type || + "DeclareFunction" === t.type + ? this.push(":") + : (this.space(), this.push("=>")), + this.space(), + this.print(e.returnType, e) + } + function y(e) { + this.print(e.name, e), + e.optional && this.push("?"), + this.push(":"), + this.space(), + this.print(e.typeAnnotation, e) + } + function v(e) { + this.print(e.id, e), this.print(e.typeParameters, e) + } + function g(e) { + this.print(e.id, e), + this.print(e.typeParameters, e), + e["extends"].length && + (this.push(" extends "), + this.printJoin(e["extends"], e, { separator: ", " })), + e.mixins && + e.mixins.length && + (this.push(" mixins "), + this.printJoin(e.mixins, e, { separator: ", " })), + this.space(), + this.print(e.body, e) + } + function E(e) { + this.push("interface "), this._interfaceish(e) + } + function b(e) { + this.printJoin(e.types, e, { separator: " & " }) + } + function x() { + this.push("mixed") + } + function A(e) { + this.push("?"), this.print(e.typeAnnotation, e) + } + function D() { + this.push("number") + } + function C(e) { + this.push(this._stringLiteral(e.value)) + } + function S() { + this.push("string") + } + function F() { + this.push("this") + } + function w(e) { + this.push("["), this.printJoin(e.types, e, { separator: ", " }), this.push("]") + } + function _(e) { + this.push("typeof "), this.print(e.argument, e) + } + function T(e) { + this.push("type "), + this.print(e.id, e), + this.print(e.typeParameters, e), + this.space(), + this.push("="), + this.space(), + this.print(e.right, e), + this.semicolon() + } + function P(e) { + this.push(":"), + this.space(), + e.optional && this.push("?"), + this.print(e.typeAnnotation, e) + } + function B(e) { + var t = this + this.push("<"), + this.printJoin(e.params, e, { + separator: ", ", + iterator: function(e) { + t.print(e.typeAnnotation, e) + } + }), + this.push(">") + } + function k(e) { + var t = this + this.push("{") + var r = e.properties.concat(e.callProperties, e.indexers) + r.length && + (this.space(), + this.printJoin(r, e, { + separator: !1, + indent: !0, + iterator: function() { + 1 !== r.length && (t.semicolon(), t.space()) + } + }), + this.space()), + this.push("}") + } + function I(e) { + e["static"] && this.push("static "), this.print(e.value, e) + } + function O(e) { + e["static"] && this.push("static "), + this.push("["), + this.print(e.id, e), + this.push(":"), + this.space(), + this.print(e.key, e), + this.push("]"), + this.push(":"), + this.space(), + this.print(e.value, e) + } + function M(e) { + e["static"] && this.push("static "), + this.print(e.key, e), + e.optional && this.push("?"), + G.isFunctionTypeAnnotation(e.value) || (this.push(":"), this.space()), + this.print(e.value, e) + } + function R(e) { + this.print(e.qualification, e), this.push("."), this.print(e.id, e) + } + function L(e) { + this.printJoin(e.types, e, { separator: " | " }) + } + function N(e) { + this.push("("), + this.print(e.expression, e), + this.print(e.typeAnnotation, e), + this.push(")") + } + function j() { + this.push("void") + } + var U = r(3)["default"] + ;(t.__esModule = !0), + (t.AnyTypeAnnotation = n), + (t.ArrayTypeAnnotation = i), + (t.BooleanTypeAnnotation = s), + (t.BooleanLiteralTypeAnnotation = a), + (t.NullLiteralTypeAnnotation = o), + (t.DeclareClass = u), + (t.DeclareFunction = l), + (t.DeclareInterface = c), + (t.DeclareModule = p), + (t.DeclareTypeAlias = f), + (t.DeclareVariable = h), + (t.ExistentialTypeParam = d), + (t.FunctionTypeAnnotation = m), + (t.FunctionTypeParam = y), + (t.InterfaceExtends = v), + (t._interfaceish = g), + (t.InterfaceDeclaration = E), + (t.IntersectionTypeAnnotation = b), + (t.MixedTypeAnnotation = x), + (t.NullableTypeAnnotation = A), + (t.NumberTypeAnnotation = D), + (t.StringLiteralTypeAnnotation = C), + (t.StringTypeAnnotation = S), + (t.ThisTypeAnnotation = F), + (t.TupleTypeAnnotation = w), + (t.TypeofTypeAnnotation = _), + (t.TypeAlias = T), + (t.TypeAnnotation = P), + (t.TypeParameterInstantiation = B), + (t.ObjectTypeAnnotation = k), + (t.ObjectTypeCallProperty = I), + (t.ObjectTypeIndexer = O), + (t.ObjectTypeProperty = M), + (t.QualifiedTypeIdentifier = R), + (t.UnionTypeAnnotation = L), + (t.TypeCastExpression = N), + (t.VoidTypeAnnotation = j) + var V = r(16), + G = U(V) + ;(t.ClassImplements = v), (t.GenericTypeAnnotation = v) + var W = r(1371) + ;(t.NumericLiteralTypeAnnotation = W.NumericLiteral), + (t.TypeParameterDeclaration = B) + }, + function(e, t) { + "use strict" + function r(e) { + this.print(e.name, e), e.value && (this.push("="), this.print(e.value, e)) + } + function n(e) { + this.push(e.name) + } + function i(e) { + this.print(e.namespace, e), this.push(":"), this.print(e.name, e) + } + function s(e) { + this.print(e.object, e), this.push("."), this.print(e.property, e) + } + function a(e) { + this.push("{..."), this.print(e.argument, e), this.push("}") + } + function o(e) { + this.push("{"), this.print(e.expression, e), this.push("}") + } + function u(e) { + this.push(e.value, !0) + } + function l(e) { + var t = e.openingElement + if ((this.print(t, e), !t.selfClosing)) { + this.indent() + for (var r = e.children, n = 0; n < r.length; n++) { + var i = r[n] + this.print(i, e) + } + this.dedent(), this.print(e.closingElement, e) + } + } + function c(e) { + this.push("<"), + this.print(e.name, e), + e.attributes.length > 0 && + (this.push(" "), this.printJoin(e.attributes, e, { separator: " " })), + this.push(e.selfClosing ? " />" : ">") + } + function p(e) { + this.push("") + } + function f() {} + ;(t.__esModule = !0), + (t.JSXAttribute = r), + (t.JSXIdentifier = n), + (t.JSXNamespacedName = i), + (t.JSXMemberExpression = s), + (t.JSXSpreadAttribute = a), + (t.JSXExpressionContainer = o), + (t.JSXText = u), + (t.JSXElement = l), + (t.JSXOpeningElement = c), + (t.JSXClosingElement = p), + (t.JSXEmptyExpression = f) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = this + this.print(e.typeParameters, e), + this.push("("), + this.printList(e.params, e, { + iterator: function(e) { + e.optional && t.push("?"), t.print(e.typeAnnotation, e) + } + }), + this.push(")"), + e.returnType && this.print(e.returnType, e) + } + function i(e) { + var t = e.kind, + r = e.key + ;("method" !== t && "init" !== t) || (e.generator && this.push("*")), + ("get" !== t && "set" !== t) || this.push(t + " "), + e.async && this.push("async "), + e.computed + ? (this.push("["), this.print(r, e), this.push("]")) + : this.print(r, e), + this._params(e), + this.space(), + this.print(e.body, e) + } + function s(e) { + e.async && this.push("async "), + this.push("function"), + e.generator && this.push("*"), + e.id ? (this.push(" "), this.print(e.id, e)) : this.space(), + this._params(e), + this.space(), + this.print(e.body, e) + } + function a(e) { + e.async && this.push("async "), + 1 === e.params.length && l.isIdentifier(e.params[0]) + ? this.print(e.params[0], e) + : this._params(e), + this.push(" => "), + this.print(e.body, e) + } + var o = r(3)["default"] + ;(t.__esModule = !0), + (t._params = n), + (t._method = i), + (t.FunctionExpression = s), + (t.ArrowFunctionExpression = a) + var u = r(16), + l = o(u) + t.FunctionDeclaration = s + }, + function(e, t, r) { + "use strict" + function n(e) { + this.print(e.imported, e), + e.local && + e.local.name !== e.imported.name && + (this.push(" as "), this.print(e.local, e)) + } + function i(e) { + this.print(e.local, e) + } + function s(e) { + this.print(e.exported, e) + } + function a(e) { + this.print(e.local, e), + e.exported && + e.local.name !== e.exported.name && + (this.push(" as "), this.print(e.exported, e)) + } + function o(e) { + this.push("* as "), this.print(e.exported, e) + } + function u(e) { + this.push("export *"), + e.exported && (this.push(" as "), this.print(e.exported, e)), + this.push(" from "), + this.print(e.source, e), + this.semicolon() + } + function l() { + this.push("export "), p.apply(this, arguments) + } + function c() { + this.push("export default "), p.apply(this, arguments) + } + function p(e) { + if (e.declaration) { + var t = e.declaration + if ((this.print(t, e), y.isStatement(t) || y.isFunction(t) || y.isClass(t))) + return + } else { + "type" === e.exportKind && this.push("type ") + for (var r = e.specifiers.slice(0), n = !1; ; ) { + var i = r[0] + if (!y.isExportDefaultSpecifier(i) && !y.isExportNamespaceSpecifier(i)) + break + ;(n = !0), this.print(r.shift(), e), r.length && this.push(", ") + } + ;(r.length || (!r.length && !n)) && + (this.push("{"), + r.length && + (this.space(), + this.printJoin(r, e, { separator: ", " }), + this.space()), + this.push("}")), + e.source && (this.push(" from "), this.print(e.source, e)) + } + this.ensureSemicolon() + } + function f(e) { + this.push("import "), + ("type" !== e.importKind && "typeof" !== e.importKind) || + this.push(e.importKind + " ") + var t = e.specifiers.slice(0) + if (t && t.length) { + for (;;) { + var r = t[0] + if (!y.isImportDefaultSpecifier(r) && !y.isImportNamespaceSpecifier(r)) + break + this.print(t.shift(), e), t.length && this.push(", ") + } + t.length && + (this.push("{"), + this.space(), + this.printJoin(t, e, { separator: ", " }), + this.space(), + this.push("}")), + this.push(" from ") + } + this.print(e.source, e), this.semicolon() + } + function h(e) { + this.push("* as "), this.print(e.local, e) + } + var d = r(3)["default"] + ;(t.__esModule = !0), + (t.ImportSpecifier = n), + (t.ImportDefaultSpecifier = i), + (t.ExportDefaultSpecifier = s), + (t.ExportSpecifier = a), + (t.ExportNamespaceSpecifier = o), + (t.ExportAllDeclaration = u), + (t.ExportNamedDeclaration = l), + (t.ExportDefaultDeclaration = c), + (t.ImportDeclaration = f), + (t.ImportNamespaceSpecifier = h) + var m = r(16), + y = d(m) + }, + function(e, t, r) { + "use strict" + function n(e) { + this.keyword("with"), + this.push("("), + this.print(e.object, e), + this.push(")"), + this.printBlock(e) + } + function i(e) { + this.keyword("if"), + this.push("("), + this.print(e.test, e), + this.push(")"), + this.space() + var t = e.alternate && D.isIfStatement(s(e.consequent)) + t && (this.push("{"), this.newline(), this.indent()), + this.printAndIndentOnComments(e.consequent, e), + t && (this.dedent(), this.newline(), this.push("}")), + e.alternate && + (this.isLast("}") && this.space(), + this.push("else "), + this.printAndIndentOnComments(e.alternate, e)) + } + function s(e) { + return D.isStatement(e.body) ? s(e.body) : e + } + function a(e) { + this.keyword("for"), + this.push("("), + this._inForStatementInitCounter++, + this.print(e.init, e), + this._inForStatementInitCounter--, + this.push(";"), + e.test && (this.space(), this.print(e.test, e)), + this.push(";"), + e.update && (this.space(), this.print(e.update, e)), + this.push(")"), + this.printBlock(e) + } + function o(e) { + this.keyword("while"), + this.push("("), + this.print(e.test, e), + this.push(")"), + this.printBlock(e) + } + function u(e) { + this.push("do "), + this.print(e.body, e), + this.space(), + this.keyword("while"), + this.push("("), + this.print(e.test, e), + this.push(");") + } + function l(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] ? "label" : arguments[1] + return function(r) { + this.push(e) + var n = r[t] + if (n) { + ;(this.format.minified && + (D.isUnaryExpression(n, { prefix: !0 }) || + D.isUpdateExpression(n, { prefix: !0 })) && + C.indexOf(n.operator) > -1) || + this.push(" ") + var i = this.startTerminatorless() + this.print(n, r), this.endTerminatorless(i) + } + this.semicolon() + } + } + function c(e) { + this.print(e.label, e), this.push(": "), this.print(e.body, e) + } + function p(e) { + this.keyword("try"), + this.print(e.block, e), + this.space(), + e.handlers ? this.print(e.handlers[0], e) : this.print(e.handler, e), + e.finalizer && + (this.space(), this.push("finally "), this.print(e.finalizer, e)) + } + function f(e) { + this.keyword("catch"), + this.push("("), + this.print(e.param, e), + this.push(")"), + this.space(), + this.print(e.body, e) + } + function h(e) { + this.keyword("switch"), + this.push("("), + this.print(e.discriminant, e), + this.push(")"), + this.space(), + this.push("{"), + this.printSequence(e.cases, e, { + indent: !0, + addNewlines: function(t, r) { + return t || e.cases[e.cases.length - 1] !== r ? void 0 : -1 + } + }), + this.push("}") + } + function d(e) { + e.test + ? (this.push("case "), this.print(e.test, e), this.push(":")) + : this.push("default:"), + e.consequent.length && + (this.newline(), this.printSequence(e.consequent, e, { indent: !0 })) + } + function m() { + this.push("debugger;") + } + function y(e, t) { + this.push(e.kind + " ") + var r = !1 + if (!D.isFor(t)) + for (var n = e.declarations, i = 0; i < n.length; i++) { + var s = n[i] + s.init && (r = !0) + } + var a = void 0 + this.format.compact || + this.format.concise || + !r || + this.format.retainLines || + (a = ",\n" + x["default"](" ", e.kind.length + 1)), + this.printList(e.declarations, e, { separator: a }), + (!D.isFor(t) || (t.left !== e && t.init !== e)) && this.semicolon() + } + function v(e) { + this.print(e.id, e), + this.print(e.id.typeAnnotation, e), + e.init && + (this.space(), this.push("="), this.space(), this.print(e.init, e)) + } + var g = r(5)["default"], + E = r(3)["default"] + ;(t.__esModule = !0), + (t.WithStatement = n), + (t.IfStatement = i), + (t.ForStatement = a), + (t.WhileStatement = o), + (t.DoWhileStatement = u), + (t.LabeledStatement = c), + (t.TryStatement = p), + (t.CatchClause = f), + (t.SwitchStatement = h), + (t.SwitchCase = d), + (t.DebuggerStatement = m), + (t.VariableDeclaration = y), + (t.VariableDeclarator = v) + var b = r(554), + x = g(b), + A = r(16), + D = E(A), + C = D.UPDATE_OPERATORS.concat(D.NUMBER_UNARY_OPERATORS).concat(["!"]), + S = function(e) { + return function(t) { + this.keyword("for"), + this.push("("), + this.print(t.left, t), + this.push(" " + e + " "), + this.print(t.right, t), + this.push(")"), + this.printBlock(t) + } + }, + F = S("in") + t.ForInStatement = F + var w = S("of") + t.ForOfStatement = w + var _ = l("continue") + t.ContinueStatement = _ + var T = l("return", "argument") + t.ReturnStatement = T + var P = l("break") + t.BreakStatement = P + var B = l("throw", "argument") + t.ThrowStatement = B + }, + function(e, t) { + "use strict" + function r(e) { + this.print(e.tag, e), this.print(e.quasi, e) + } + function n(e) { + this._push(e.value.raw) + } + function i(e) { + this.push("`") + for (var t = e.quasis, r = 0; r < t.length; r++) + this.print(t[r], e), + r + 1 < t.length && + (this._push("${ "), + this.print(e.expressions[r], e), + this.push(" }")) + this._push("`") + } + ;(t.__esModule = !0), + (t.TaggedTemplateExpression = r), + (t.TemplateElement = n), + (t.TemplateLiteral = i) + }, + function(e, t, r) { + "use strict" + function n(e, t) { + return E.isArrayTypeAnnotation(t) + } + function i(e, t) { + return !(!E.isMemberExpression(t) || t.object !== e) + } + function s(e, t, r) { + return E.isExpressionStatement(t) ? !0 : y(r, !0) + } + function a(e, t) { + if ((E.isCallExpression(t) || E.isNewExpression(t)) && t.callee === e) return !0 + if (E.isUnaryLike(t)) return !0 + if (E.isMemberExpression(t) && t.object === e) return !0 + if (E.isBinary(t)) { + var r = t.operator, + n = b[r], + i = e.operator, + s = b[i] + if (n > s) return !0 + if (n === s && t.right === e && !E.isLogicalExpression(t)) return !0 + } + return !1 + } + function o(e, t) { + if ("in" === e.operator) { + if (E.isVariableDeclarator(t)) return !0 + if (E.isFor(t)) return !0 + } + return !1 + } + function u(e, t) { + return E.isForStatement(t) + ? !1 + : E.isExpressionStatement(t) && t.expression === e + ? !1 + : E.isReturnStatement(t) + ? !1 + : E.isThrowStatement(t) + ? !1 + : E.isSwitchStatement(t) && t.discriminant === e + ? !1 + : E.isWhileStatement(t) && t.test === e + ? !1 + : E.isIfStatement(t) && t.test === e + ? !1 + : !E.isForInStatement(t) || t.right !== e + } + function l(e, t) { + return ( + E.isBinary(t) || + E.isUnaryLike(t) || + E.isCallExpression(t) || + E.isMemberExpression(t) || + E.isNewExpression(t) + ) + } + function c(e, t) { + return E.isExpressionStatement(t) ? !0 : !!E.isExportDeclaration(t) + } + function p(e, t) { + return E.isMemberExpression(t, { object: e }) + ? !0 + : !( + !E.isCallExpression(t, { callee: e }) && + !E.isNewExpression(t, { callee: e }) + ) + } + function f(e, t, r) { + return E.isExpressionStatement(t) ? !0 : E.isExportDeclaration(t) ? !0 : y(r) + } + function h(e, t) { + return E.isExportDeclaration(t) + ? !0 + : E.isBinaryExpression(t) || E.isLogicalExpression(t) + ? !0 + : E.isUnaryExpression(t) + ? !0 + : p(e, t) + } + function d(e, t) { + return E.isUnaryLike(t) + ? !0 + : E.isBinary(t) + ? !0 + : E.isConditionalExpression(t, { test: e }) + ? !0 + : p(e, t) + } + function m(e) { + return E.isObjectPattern(e.left) ? !0 : d.apply(void 0, arguments) + } + function y(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? !1 : arguments[1], + r = e.length - 1, + n = e[r] + r-- + for (var i = e[r]; r > 0; ) { + if (E.isExpressionStatement(i, { expression: n })) return !0 + if (t && E.isArrowFunctionExpression(i, { body: n })) return !0 + if ( + !( + E.isCallExpression(i, { callee: n }) || + (E.isSequenceExpression(i) && i.expressions[0] === n) || + E.isMemberExpression(i, { object: n }) || + E.isConditional(i, { test: n }) || + E.isBinary(i, { left: n }) || + E.isAssignmentExpression(i, { left: n }) + ) + ) + return !1 + ;(n = i), r--, (i = e[r]) + } + return !1 + } + var v = r(3)["default"] + ;(t.__esModule = !0), + (t.NullableTypeAnnotation = n), + (t.UpdateExpression = i), + (t.ObjectExpression = s), + (t.Binary = a), + (t.BinaryExpression = o), + (t.SequenceExpression = u), + (t.YieldExpression = l), + (t.ClassExpression = c), + (t.UnaryLike = p), + (t.FunctionExpression = f), + (t.ArrowFunctionExpression = h), + (t.ConditionalExpression = d), + (t.AssignmentExpression = m) + var g = r(16), + E = v(g), + b = { + "||": 0, + "&&": 1, + "|": 2, + "^": 3, + "&": 4, + "==": 5, + "===": 5, + "!=": 5, + "!==": 5, + "<": 6, + ">": 6, + "<=": 6, + ">=": 6, + in: 6, + instanceof: 6, + ">>": 7, + "<<": 7, + ">>>": 7, + "+": 8, + "-": 8, + "*": 9, + "/": 9, + "%": 9, + "**": 10 + } + ;(t.FunctionTypeAnnotation = n), (t.AwaitExpression = l) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? {} : arguments[1] + return ( + m.isMemberExpression(e) + ? (n(e.object, t), e.computed && n(e.property, t)) + : m.isBinary(e) || m.isAssignmentExpression(e) + ? (n(e.left, t), n(e.right, t)) + : m.isCallExpression(e) + ? ((t.hasCall = !0), n(e.callee, t)) + : m.isFunction(e) + ? (t.hasFunction = !0) + : m.isIdentifier(e) && (t.hasHelper = t.hasHelper || i(e.callee)), + t + ) + } + function i(e) { + return m.isMemberExpression(e) + ? i(e.object) || i(e.property) + : m.isIdentifier(e) + ? "require" === e.name || "_" === e.name[0] + : m.isCallExpression(e) + ? i(e.callee) + : m.isBinary(e) || m.isAssignmentExpression(e) + ? (m.isIdentifier(e.left) && i(e.left)) || i(e.right) + : !1 + } + function s(e) { + return ( + m.isLiteral(e) || + m.isObjectExpression(e) || + m.isArrayExpression(e) || + m.isIdentifier(e) || + m.isMemberExpression(e) + ) + } + var a = r(5)["default"], + o = r(3)["default"], + u = r(1414), + l = a(u), + c = r(811), + p = a(c), + f = r(2654), + h = a(f), + d = r(16), + m = o(d) + ;(t.nodes = { + AssignmentExpression: function(e) { + var t = n(e.right) + return (t.hasCall && t.hasHelper) || t.hasFunction + ? { before: t.hasFunction, after: !0 } + : void 0 + }, + SwitchCase: function(e, t) { + return { before: e.consequent.length || t.cases[0] === e } + }, + LogicalExpression: function(e) { + return m.isFunction(e.left) || m.isFunction(e.right) + ? { after: !0 } + : void 0 + }, + Literal: function(e) { + return "use strict" === e.value ? { after: !0 } : void 0 + }, + CallExpression: function(e) { + return m.isFunction(e.callee) || i(e) ? { before: !0, after: !0 } : void 0 + }, + VariableDeclaration: function(e) { + for (var t = 0; t < e.declarations.length; t++) { + var r = e.declarations[t], + a = i(r.id) && !s(r.init) + if (!a) { + var o = n(r.init) + a = (i(r.init) && o.hasCall) || o.hasFunction + } + if (a) return { before: !0, after: !0 } + } + }, + IfStatement: function(e) { + return m.isBlockStatement(e.consequent) ? { before: !0, after: !0 } : void 0 + } + }), + (t.nodes.ObjectProperty = t.nodes.ObjectMethod = t.nodes.SpreadProperty = function( + e, + t + ) { + return t.properties[0] === e ? { before: !0 } : void 0 + }), + (t.list = { + VariableDeclaration: function(e) { + return h["default"](e.declarations, "init") + }, + ArrayExpression: function(e) { + return e.elements + }, + ObjectExpression: function(e) { + return e.properties + } + }), + p["default"]( + { + Function: !0, + Class: !0, + Loop: !0, + LabeledStatement: !0, + SwitchStatement: !0, + TryStatement: !0 + }, + function(e, r) { + l["default"](e) && (e = { after: e, before: e }), + p["default"]([r].concat(m.FLIPPED_ALIAS_KEYS[r] || []), function( + r + ) { + t.nodes[r] = function() { + return e + } + }) + } + ) + }, + function(e, t, r) { + "use strict" + var n = r(80)["default"] + t.__esModule = !0 + var i = (function() { + function e() { + n(this, e), (this.line = 1), (this.column = 0) + } + return ( + (e.prototype.push = function(e) { + for (var t = 0; t < e.length; t++) + "\n" === e[t] ? (this.line++, (this.column = 0)) : this.column++ + }), + (e.prototype.unshift = function(e) { + for (var t = 0; t < e.length; t++) + "\n" === e[t] ? this.line-- : this.column-- + }), + e + ) + })() + ;(t["default"] = i), (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(374)["default"], + i = r(80)["default"], + s = r(796)["default"], + a = r(5)["default"], + o = r(3)["default"] + t.__esModule = !0 + var u = r(554), + l = a(u), + c = r(2534), + p = a(c), + f = r(1373), + h = o(f), + d = r(16), + m = o(d), + y = (function(e) { + function t() { + i(this, t) + for (var r = arguments.length, n = Array(r), s = 0; r > s; s++) + n[s] = arguments[s] + e.call.apply(e, [this].concat(n)), + (this.insideAux = !1), + (this.printAuxAfterOnNextUserNode = !1), + (this._printStack = []) + } + return ( + n(t, e), + (t.prototype.print = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? {} + : arguments[2] + if (e) { + ;(this._lastPrintedIsEmptyStatement = !1), + t && t._compact && (e._compact = !0) + var n = this.insideAux + this.insideAux = !e.loc + var i = this.format.concise + e._compact && (this.format.concise = !0) + var s = this[e.type] + if (!s) + throw new ReferenceError( + "unknown node of type " + + JSON.stringify(e.type) + + " with constructor " + + JSON.stringify(e && e.constructor.name) + ) + this._printStack.push(e), + e.loc && this.printAuxAfterComment(), + this.printAuxBeforeComment(n) + var a = h.needsParens(e, t, this._printStack) + a && this.push("("), + this.printLeadingComments(e, t), + this.catchUp(e), + this._printNewline(!0, e, t, r), + r.before && r.before(), + this.map.mark(e), + this._print(e, t), + e.loc && this.printAuxAfterComment(), + this.printTrailingComments(e, t), + a && this.push(")"), + this._printStack.pop(), + t && this.map.mark(t), + r.after && r.after(), + (this.format.concise = i), + (this.insideAux = n), + this._printNewline(!1, e, t, r) + } + }), + (t.prototype.printAuxBeforeComment = function(e) { + var t = this.format.auxiliaryCommentBefore + e || + !this.insideAux || + this.printAuxAfterOnNextUserNode || + ((this.printAuxAfterOnNextUserNode = !0), + t && this.printComment({ type: "CommentBlock", value: t })) + }), + (t.prototype.printAuxAfterComment = function() { + if (this.printAuxAfterOnNextUserNode) { + this.printAuxAfterOnNextUserNode = !1 + var e = this.format.auxiliaryCommentAfter + e && this.printComment({ type: "CommentBlock", value: e }) + } + }), + (t.prototype.getPossibleRaw = function(e) { + var t = e.extra + return t && + null != t.raw && + null != t.rawValue && + e.value === t.rawValue + ? t.raw + : void 0 + }), + (t.prototype._print = function(e, t) { + if (!this.format.minified) { + var r = this.getPossibleRaw(e) + if (r) return this.push(""), void this._push(r) + } + var n = this[e.type] + n.call(this, e, t) + }), + (t.prototype.printJoin = function(e, t) { + var r = this, + n = + arguments.length <= 2 || void 0 === arguments[2] + ? {} + : arguments[2] + if (e && e.length) { + var i = e.length, + s = void 0, + a = void 0 + n.indent && this.indent() + var o = { + statement: n.statement, + addNewlines: n.addNewlines, + after: function() { + n.iterator && n.iterator(s, a), + n.separator && t.loc && r.printAuxAfterComment(), + n.separator && i - 1 > a && r.push(n.separator) + } + } + for (a = 0; a < e.length; a++) (s = e[a]), this.print(s, t, o) + n.indent && this.dedent() + } + }), + (t.prototype.printAndIndentOnComments = function(e, t) { + var r = !!e.leadingComments + r && this.indent(), this.print(e, t), r && this.dedent() + }), + (t.prototype.printBlock = function(e) { + var t = e.body + m.isEmptyStatement(t) || this.space(), this.print(t, e) + }), + (t.prototype.generateComment = function(e) { + var t = e.value + return (t = "CommentLine" === e.type ? "//" + t : "/*" + t + "*/") + }), + (t.prototype.printTrailingComments = function(e, t) { + this.printComments(this.getComments("trailingComments", e, t)) + }), + (t.prototype.printLeadingComments = function(e, t) { + this.printComments(this.getComments("leadingComments", e, t)) + }), + (t.prototype.printInnerComments = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? !0 + : arguments[1] + e.innerComments && + (t && this.indent(), + this.printComments(e.innerComments), + t && this.dedent()) + }), + (t.prototype.printSequence = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? {} + : arguments[2] + return (r.statement = !0), this.printJoin(e, t, r) + }), + (t.prototype.printList = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? {} + : arguments[2] + return ( + null == r.separator && + ((r.separator = ","), + this.format.compact || (r.separator += " ")), + this.printJoin(e, t, r) + ) + }), + (t.prototype._printNewline = function(e, t, r, n) { + if (n.statement || h.isUserWhitespacable(t, r)) { + var i = 0 + if ( + null != t.start && + !t._ignoreUserWhitespace && + this.tokens.length + ) + i = e + ? this.whitespace.getNewlinesBefore(t) + : this.whitespace.getNewlinesAfter(t) + else { + e || i++, n.addNewlines && (i += n.addNewlines(e, t) || 0) + var s = h.needsWhitespaceAfter + e && (s = h.needsWhitespaceBefore), + s(t, r) && i++, + this.buf || (i = 0) + } + this.newline(i) + } + }), + (t.prototype.getComments = function(e, t) { + return (t && t[e]) || [] + }), + (t.prototype.shouldPrintComment = function(e) { + return this.format.shouldPrintComment + ? this.format.shouldPrintComment(e.value) + : !this.format.minified && + (e.value.indexOf("@license") >= 0 || + e.value.indexOf("@preserve") >= 0) + ? !0 + : this.format.comments + }), + (t.prototype.printComment = function(e) { + if (this.shouldPrintComment(e) && !e.ignore) { + if (((e.ignore = !0), null != e.start)) { + if (this.printedCommentStarts[e.start]) return + this.printedCommentStarts[e.start] = !0 + } + this.catchUp(e), + this.newline(this.whitespace.getNewlinesBefore(e)) + var t = this.position.column, + r = this.generateComment(e) + if ( + (t && + !this.isLast(["\n", " ", "[", "{"]) && + (this._push(" "), t++), + "CommentBlock" === e.type && + this.format.indent.adjustMultilineComment) + ) { + var n = e.loc && e.loc.start.column + if (n) { + var i = new RegExp("\\n\\s{1," + n + "}", "g") + r = r.replace(i, "\n") + } + var s = Math.max(this.indentSize(), t) + r = r.replace(/\n/g, "\n" + l["default"](" ", s)) + } + 0 === t && (r = this.getIndent() + r), + (this.format.compact || + this.format.concise || + this.format.retainLines) && + "CommentLine" === e.type && + (r += "\n"), + this._push(r), + this.newline(this.whitespace.getNewlinesAfter(e)) + } + }), + (t.prototype.printComments = function(e) { + if (e && e.length) + for (var t = 0; t < e.length; t++) { + var r = e[t] + this.printComment(r) + } + }), + t + ) + })(p["default"]) + t["default"] = y + for ( + var v = [ + r(2543), + r(2537), + r(2542), + r(2536), + r(2540), + r(2541), + r(1371), + r(2538), + r(2535), + r(2539) + ], + g = 0; + g < v.length; + g++ + ) { + var E = v[g] + s(y.prototype, E) + } + e.exports = t["default"] + }, + function(e, t, r) { + "use strict" + function n(e, t) { + return e.line === t.line && e.column === t.column + } + var i = r(80)["default"], + s = r(5)["default"], + a = r(3)["default"] + t.__esModule = !0 + var o = r(1425), + u = s(o), + l = r(16), + c = a(l), + p = (function() { + function e(t, r, n) { + i(this, e), + (this.position = t), + (this.opts = r), + (this.last = { generated: {}, original: {} }), + r.sourceMaps + ? ((this.map = new u["default"].SourceMapGenerator({ + file: r.sourceMapTarget, + sourceRoot: r.sourceRoot + })), + this.map.setSourceContent(r.sourceFileName, n)) + : (this.map = null) + } + return ( + (e.prototype.get = function() { + var e = this.map + return e ? e.toJSON() : e + }), + (e.prototype.mark = function(e) { + var t = e.loc + if (t) { + var r = this.map + if (r && !c.isProgram(e) && !c.isFile(e)) { + var i = this.position, + s = { line: i.line, column: i.column }, + a = t.start + n(a, this.last.original) || + n(s, this.last.generated) || + ((this.last = { + source: this.opts.sourceFileName, + generated: s, + original: a + }), + r.addMapping(this.last)) + } + } + }), + e + ) + })() + ;(t["default"] = p), (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(80)["default"] + t.__esModule = !0 + var i = (function() { + function e(t) { + n(this, e), (this.tokens = t), (this.used = {}) + } + return ( + (e.prototype.getNewlinesBefore = function(e) { + var t = void 0, + r = void 0, + n = this.tokens, + i = this._findToken( + function(t) { + return t.start - e.start + }, + 0, + n.length + ) + if (i >= 0) { + for (; i && e.start === n[i - 1].start; ) --i + ;(t = n[i - 1]), (r = n[i]) + } + return this.getNewlinesBetween(t, r) + }), + (e.prototype.getNewlinesAfter = function(e) { + var t = void 0, + r = void 0, + n = this.tokens, + i = this._findToken( + function(t) { + return t.end - e.end + }, + 0, + n.length + ) + if (i >= 0) { + for (; i && e.end === n[i - 1].end; ) --i + ;(t = n[i]), (r = n[i + 1]), "," === r.type.label && (r = n[i + 2]) + } + if (r && "eof" === r.type.label) return 1 + var s = this.getNewlinesBetween(t, r) + return "CommentLine" !== e.type || s ? s : 1 + }), + (e.prototype.getNewlinesBetween = function(e, t) { + if (!t || !t.loc) return 0 + for ( + var r = e ? e.loc.end.line : 1, n = t.loc.start.line, i = 0, s = r; + n > s; + s++ + ) + "undefined" == typeof this.used[s] && ((this.used[s] = !0), i++) + return i + }), + (e.prototype._findToken = function(e, t, r) { + if (t >= r) return -1 + var n = (t + r) >>> 1, + i = e(this.tokens[n]) + return 0 > i + ? this._findToken(e, n + 1, r) + : i > 0 + ? this._findToken(e, t, n) + : 0 === i + ? n + : -1 + }), + e + ) + })() + ;(t["default"] = i), (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = 0, + r = 0, + n = 0 + for (var i in e) { + var s = e[i], + a = s[0], + o = s[1] + ;(a > r || (a === r && o > n)) && ((r = a), (n = o), (t = +i)) + } + return t + } + var i = r(554), + s = /^(?:( )+|\t+)/ + e.exports = function(e) { + if ("string" != typeof e) throw new TypeError("Expected a string") + var t, + r, + a = 0, + o = 0, + u = 0, + l = {} + e.split(/\n/g).forEach(function(e) { + if (e) { + var n, + i = e.match(s) + i ? ((n = i[0].length), i[1] ? o++ : a++) : (n = 0) + var c = n - u + ;(u = n), + c + ? ((r = c > 0), + (t = l[r ? c : -c]), + t ? t[0]++ : (t = l[c] = [1, 0])) + : t && (t[1] += +r) + } + }) + var c, + p, + f = n(l) + return ( + f + ? o >= a + ? ((c = "space"), (p = i(" ", f))) + : ((c = "tab"), (p = i(" ", f))) + : ((c = null), (p = "")), + { amount: f, type: c, indent: p } + ) + } + }, + function(e, t, r) { + var n = r(2552) + e.exports = + Number.isInteger || + function(e) { + return "number" == typeof e && n(e) && Math.floor(e) === e + } + }, + [7329, 2553], + 2533, + [7329, 2555], + 2533, + function(e, t) { + "use strict" + e.exports = function(e) { + for (var t = e.length; /[\s\uFEFF\u00A0]/.test(e[t - 1]); ) t-- + return e.slice(0, t) + } + }, + function(e, t, r) { + "use strict" + var n = r(5)["default"] + t.__esModule = !0 + var i = r(807), + s = n(i), + a = {} + ;(t["default"] = a), + (a["typeof"] = s["default"]( + '\n (typeof Symbol === "function" && typeof Symbol.iterator === "symbol")\n ? function (obj) { return typeof obj; }\n : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };\n' + )), + (a.jsx = s["default"]( + '\n (function () {\n var REACT_ELEMENT_TYPE = (typeof Symbol === "function" && Symbol.for && Symbol.for("react.element")) || 0xeac7;\n\n return function createRawReactElement (type, props, key, children) {\n var defaultProps = type && type.defaultProps;\n var childrenLength = arguments.length - 3;\n\n if (!props && childrenLength !== 0) {\n // If we\'re going to assign props.children, we create a new object now\n // to avoid mutating defaultProps.\n props = {};\n }\n if (props && defaultProps) {\n for (var propName in defaultProps) {\n if (props[propName] === void 0) {\n props[propName] = defaultProps[propName];\n }\n }\n } else if (!props) {\n props = defaultProps || {};\n }\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 3];\n }\n props.children = childArray;\n }\n\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key === undefined ? null : \'\' + key,\n ref: null,\n props: props,\n _owner: null,\n };\n };\n\n })()\n' + )), + (a.asyncToGenerator = s["default"]( + '\n (function (fn) {\n return function () {\n var gen = fn.apply(this, arguments);\n return new Promise(function (resolve, reject) {\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n return Promise.resolve(value).then(function (value) {\n return step("next", value);\n }, function (err) {\n return step("throw", err);\n });\n }\n }\n\n return step("next");\n });\n };\n })\n' + )), + (a.classCallCheck = s["default"]( + '\n (function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError("Cannot call a class as a function");\n }\n });\n' + )), + (a.createClass = s["default"]( + '\n (function() {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i ++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ("value" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n })()\n' + )), + (a.defineEnumerableProperties = s["default"]( + '\n (function (obj, descs) {\n for (var key in descs) {\n var desc = descs[key];\n desc.configurable = desc.enumerable = true;\n if ("value" in desc) desc.writable = true;\n Object.defineProperty(obj, key, desc);\n }\n return obj;\n })\n' + )), + (a.defaults = s["default"]( + "\n (function (obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n })\n" + )), + (a.defineProperty = s["default"]( + "\n (function (obj, key, value) {\n // Shortcircuit the slow defineProperty path when possible.\n // We are trying to avoid issues where setters defined on the\n // prototype cause side effects under the fast path of simple\n // assignment. By checking for existence of the property with\n // the in operator, we can optimize most of this overhead away.\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n });\n" + )), + (a["extends"] = s["default"]( + "\n Object.assign || (function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n })\n" + )), + (a.get = s["default"]( + '\n (function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if ("value" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n });\n' + )), + (a.inherits = s["default"]( + '\n (function (subClass, superClass) {\n if (typeof superClass !== "function" && superClass !== null) {\n throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n })\n' + )), + (a["instanceof"] = s["default"]( + '\n (function (left, right) {\n if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {\n return right[Symbol.hasInstance](left);\n } else {\n return left instanceof right;\n }\n });\n' + )), + (a.interopRequireDefault = s["default"]( + "\n (function (obj) {\n return obj && obj.__esModule ? obj : { default: obj };\n })\n" + )), + (a.interopRequireWildcard = s["default"]( + "\n (function (obj) {\n if (obj && obj.__esModule) {\n return obj;\n } else {\n var newObj = {};\n if (obj != null) {\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];\n }\n }\n newObj.default = obj;\n return newObj;\n }\n })\n" + )), + (a.newArrowCheck = s["default"]( + '\n (function (innerThis, boundThis) {\n if (innerThis !== boundThis) {\n throw new TypeError("Cannot instantiate an arrow function");\n }\n });\n' + )), + (a.objectDestructuringEmpty = s["default"]( + '\n (function (obj) {\n if (obj == null) throw new TypeError("Cannot destructure undefined");\n });\n' + )), + (a.objectWithoutProperties = s["default"]( + "\n (function (obj, keys) {\n var target = {};\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n return target;\n })\n" + )), + (a.possibleConstructorReturn = s["default"]( + '\n (function (self, call) {\n if (!self) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n return call && (typeof call === "object" || typeof call === "function") ? call : self;\n });\n' + )), + (a.selfGlobal = s["default"]( + '\n typeof global === "undefined" ? self : global\n' + )), + (a.set = s["default"]( + '\n (function set(object, property, value, receiver) {\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent !== null) {\n set(parent, property, value, receiver);\n }\n } else if ("value" in desc && desc.writable) {\n desc.value = value;\n } else {\n var setter = desc.set;\n\n if (setter !== undefined) {\n setter.call(receiver, value);\n }\n }\n\n return value;\n });\n' + )), + (a.slicedToArray = s["default"]( + '\n (function () {\n // Broken out into a separate function to avoid deoptimizations due to the try/catch for the\n // array iterator case.\n function sliceIterator(arr, i) {\n // this is an expanded form of `for...of` that properly supports abrupt completions of\n // iterators etc. variable names have been minimised to reduce the size of this massive\n // helper. sometimes spec compliancy is annoying :(\n //\n // _n = _iteratorNormalCompletion\n // _d = _didIteratorError\n // _e = _iteratorError\n // _i = _iterator\n // _s = _step\n\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i["return"]) _i["return"]();\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n\n return function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n return sliceIterator(arr, i);\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n };\n })();\n' + )), + (a.slicedToArrayLoose = s["default"]( + '\n (function (arr, i) {\n if (Array.isArray(arr)) {\n return arr;\n } else if (Symbol.iterator in Object(arr)) {\n var _arr = [];\n for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {\n _arr.push(_step.value);\n if (i && _arr.length === i) break;\n }\n return _arr;\n } else {\n throw new TypeError("Invalid attempt to destructure non-iterable instance");\n }\n });\n' + )), + (a.taggedTemplateLiteral = s["default"]( + "\n (function (strings, raw) {\n return Object.freeze(Object.defineProperties(strings, {\n raw: { value: Object.freeze(raw) }\n }));\n });\n" + )), + (a.taggedTemplateLiteralLoose = s["default"]( + "\n (function (strings, raw) {\n strings.raw = raw;\n return strings;\n });\n" + )), + (a.temporalRef = s["default"]( + '\n (function (val, name, undef) {\n if (val === undef) {\n throw new ReferenceError(name + " is not defined - temporal dead zone");\n } else {\n return val;\n }\n })\n' + )), + (a.temporalUndefined = s["default"]("\n ({})\n")), + (a.toArray = s["default"]( + "\n (function (arr) {\n return Array.isArray(arr) ? arr : Array.from(arr);\n });\n" + )), + (a.toConsumableArray = s["default"]( + "\n (function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n return arr2;\n } else {\n return Array.from(arr);\n }\n });\n" + )), + (e.exports = t["default"]) + }, + function(e, t, r) { + e.exports = { default: r(2569), __esModule: !0 } + }, + [7332, 2570], + [7336, 2574], + [7337, 2575], + [7338, 2576], + [7340, 2578], + [7342, 2579], + [7343, 1375], + [7344, 2561, 2560, 1375], + 1937, + [7346, 1389, 1388, 2597], + function(e, t, r) { + r(1387), r(1388), r(1389), r(2599), r(2606), (e.exports = r(98).Map) + }, + [7347, 2600], + [7348, 2601, 98], + [7349, 81], + [7350, 81], + [7351, 81, 2602], + [7352, 81, 2603], + [7353, 806, 98], + [7354, 2604, 98], + [7355, 2605, 98], + [7356, 806, 98], + [7357, 806, 1387, 98], + function(e, t) { + e.exports = function(e) { + if ("function" != typeof e) throw TypeError(e + " is not a function!") + return e + } + }, + function(e, t) { + e.exports = function() {} + }, + function(e, t, r) { + "use strict" + var n = r(81), + i = r(467), + s = r(1381), + a = r(556), + o = r(1383), + u = r(557), + l = r(800), + c = r(801), + p = r(1379), + f = r(805)("id"), + h = r(558), + d = r(559), + m = r(2594), + y = r(464), + v = Object.isExtensible || d, + g = y ? "_s" : "size", + E = 0, + b = function(e, t) { + if (!d(e)) + return "symbol" == typeof e ? e : ("string" == typeof e ? "S" : "P") + e + if (!h(e, f)) { + if (!v(e)) return "F" + if (!t) return "E" + i(e, f, ++E) + } + return "O" + e[f] + }, + x = function(e, t) { + var r, + n = b(t) + if ("F" !== n) return e._i[n] + for (r = e._f; r; r = r.n) if (r.k == t) return r + } + e.exports = { + getConstructor: function(e, t, r, i) { + var c = e(function(e, s) { + o(e, c, t), + (e._i = n.create(null)), + (e._f = void 0), + (e._l = void 0), + (e[g] = 0), + void 0 != s && l(s, r, e[i], e) + }) + return ( + s(c.prototype, { + clear: function() { + for (var e = this, t = e._i, r = e._f; r; r = r.n) + (r.r = !0), r.p && (r.p = r.p.n = void 0), delete t[r.i] + ;(e._f = e._l = void 0), (e[g] = 0) + }, + delete: function(e) { + var t = this, + r = x(t, e) + if (r) { + var n = r.n, + i = r.p + delete t._i[r.i], + (r.r = !0), + i && (i.n = n), + n && (n.p = i), + t._f == r && (t._f = n), + t._l == r && (t._l = i), + t[g]-- + } + return !!r + }, + forEach: function(e) { + for ( + var t, + r = a( + e, + arguments.length > 1 ? arguments[1] : void 0, + 3 + ); + (t = t ? t.n : this._f); + + ) + for (r(t.v, t.k, this); t && t.r; ) t = t.p + }, + has: function(e) { + return !!x(this, e) + } + }), + y && + n.setDesc(c.prototype, "size", { + get: function() { + return u(this[g]) + } + }), + c + ) + }, + def: function(e, t, r) { + var n, + i, + s = x(e, t) + return ( + s + ? (s.v = r) + : ((e._l = s = { + i: (i = b(t, !0)), + k: t, + v: r, + p: (n = e._l), + n: void 0, + r: !1 + }), + e._f || (e._f = s), + n && (n.n = s), + e[g]++, + "F" !== i && (e._i[i] = s)), + e + ) + }, + getEntry: x, + setStrong: function(e, t, r) { + c( + e, + t, + function(e, t) { + ;(this._t = e), (this._k = t), (this._l = void 0) + }, + function() { + for (var e = this, t = e._k, r = e._l; r && r.r; ) r = r.p + return e._t && (e._l = r = r ? r.n : e._t._f) + ? "keys" == t + ? p(0, r.k) + : "values" == t + ? p(0, r.v) + : p(0, [r.k, r.v]) + : ((e._t = void 0), p(1)) + }, + r ? "entries" : "values", + !r, + !0 + ), + m(t) + } + } + }, + function(e, t, r) { + var n = r(800), + i = r(1376) + e.exports = function(e) { + return function() { + if (i(this) != e) throw TypeError(e + "#toJSON isn't generic") + var t = [] + return n(this, !1, t.push, t), t + } + } + }, + function(e, t, r) { + "use strict" + var n = r(81), + i = r(466), + s = r(177), + a = r(465), + o = r(467), + u = r(1381), + l = r(800), + c = r(1383), + p = r(559), + f = r(560), + h = r(464) + e.exports = function(e, t, r, d, m, y) { + var v = i[e], + g = v, + E = m ? "set" : "add", + b = g && g.prototype, + x = {} + return ( + h && + "function" == typeof g && + (y || + (b.forEach && + !a(function() { + new g().entries().next() + }))) + ? ((g = t(function(t, r) { + c(t, g, e), (t._c = new v()), void 0 != r && l(r, m, t[E], t) + })), + n.each.call( + "add,clear,delete,forEach,get,has,set,keys,values,entries".split( + "," + ), + function(e) { + var t = "add" == e || "set" == e + e in b && + (!y || "clear" != e) && + o(g.prototype, e, function(r, n) { + if (!t && y && !p(r)) return "get" == e ? void 0 : !1 + var i = this._c[e](0 === r ? 0 : r, n) + return t ? this : i + }) + } + ), + "size" in b && + n.setDesc(g.prototype, "size", { + get: function() { + return this._c.size + } + })) + : ((g = d.getConstructor(t, e, m, E)), u(g.prototype, r)), + f(g, e), + (x[e] = g), + s(s.G + s.W + s.F, x), + y || d.setStrong(g, e, m), + g + ) + } + }, + [7362, 81], + function(e, t, r) { + var n = r(468), + i = r(178)("iterator"), + s = Array.prototype + e.exports = function(e) { + return void 0 !== e && (n.Array === e || s[i] === e) + } + }, + [7367, 799], + function(e, t, r) { + var n = r(463) + e.exports = function(e, t, r, i) { + try { + return i ? t(n(r)[0], r[1]) : t(r) + } catch (s) { + var a = e["return"] + throw (void 0 !== a && n(a.call(e)), s) + } + } + }, + [7368, 81, 803, 560, 467, 178], + [7370, 81, 469], + [7371, 81, 1385, 1378, 465], + [7374, 81, 559, 463, 556], + function(e, t, r) { + "use strict" + var n = r(98), + i = r(81), + s = r(464), + a = r(178)("species") + e.exports = function(e) { + var t = n[e] + s && + t && + !t[a] && + i.setDesc(t, a, { + configurable: !0, + get: function() { + return this + } + }) + } + }, + [7377, 1384, 557], + function(e, t, r) { + var n = r(1384), + i = Math.min + e.exports = function(e) { + return e > 0 ? i(n(e), 9007199254740991) : 0 + } + }, + [7382, 463, 1386, 98], + [7383, 2582, 1379, 468, 469, 801], + function(e, t, r) { + "use strict" + var n = r(2583) + r(2585)( + "Map", + function(e) { + return function() { + return e(this, arguments.length > 0 ? arguments[0] : void 0) + } + }, + { + get: function(e) { + var t = n.getEntry(this, e) + return t && t.v + }, + set: function(e, t) { + return n.def(this, 0 === e ? 0 : e, t) + } + }, + n, + !0 + ) + }, + [7384, 177], + [7385, 177, 2592], + [7386, 469, 802], + [7387, 802, 1377], + [7388, 1385, 802], + [7389, 177, 2593], + function(e, t, r) { + var n = r(177) + n(n.P, "Map", { toJSON: r(2584)("Map") }) + }, + [7394, 80, 146, 5, 3, 308, 16], + [7397, 3, 5, 16, 308], + function(e, t) { + "use strict" + function r() { + var e = this.node + if (e) { + var t = e.trailingComments, + r = e.leadingComments + if (t || r) { + var n = this.getSibling(this.key - 1), + i = this.getSibling(this.key + 1) + n.node || (n = i), + i.node || (i = n), + n.addComments("trailing", r), + i.addComments("leading", t) + } + } + } + function n(e, t, r) { + this.addComments(e, [{ type: r ? "CommentLine" : "CommentBlock", value: t }]) + } + function i(e, t) { + if (t) { + var r = this.node + if (r) { + var n = e + "Comments" + r[n] ? (r[n] = r[n].concat(t)) : (r[n] = t) + } + } + } + ;(t.__esModule = !0), + (t.shareCommentsWithSiblings = r), + (t.addComment = n), + (t.addComments = i) + }, + [7398, 146, 5, 147], + [7399, 3, 16], + function(e, t) { + ;(function(e) { + "use strict" + function r() { + var e = this.evaluate() + return e.confident ? !!e.value : void 0 + } + function n() { + function t(e) { + n && ((a = e), (n = !1)) + } + function r(a) { + if (n) { + var o = a.node + if (a.isSequenceExpression()) { + var u = a.get("expressions") + return r(u[u.length - 1]) + } + if ( + a.isStringLiteral() || + a.isNumericLiteral() || + a.isBooleanLiteral() + ) + return o.value + if (a.isNullLiteral()) return null + if (a.isTemplateLiteral()) { + for ( + var l = "", + c = 0, + u = a.get("expressions"), + p = o.quasis, + f = 0; + f < p.length; + f++ + ) { + var h = p[f] + if (!n) break + l += h.value.cooked + var d = u[c++] + d && (l += String(r(d))) + } + if (!n) return + return l + } + if (a.isConditionalExpression()) { + var m = r(a.get("test")) + if (!n) return + return r(m ? a.get("consequent") : a.get("alternate")) + } + if (a.isExpressionWrapper()) return r(a.get("expression")) + if ( + a.isMemberExpression() && + !a.parentPath.isCallExpression({ callee: o }) + ) { + var y = a.get("property"), + v = a.get("object") + if (v.isLiteral() && y.isIdentifier()) { + var g = v.node.value, + E = typeof g + if ("number" === E || "string" === E) return g[y.node.name] + } + } + if (a.isReferencedIdentifier()) { + var b = a.scope.getBinding(o.name) + if (b && b.hasValue) return b.value + if ("undefined" === o.name) return + if ("Infinity" === o.name) return 1 / 0 + if ("NaN" === o.name) return NaN + var x = a.resolve() + return x === a ? t(a) : r(x) + } + if (a.isUnaryExpression({ prefix: !0 })) { + if ("void" === o.operator) return + var A = a.get("argument") + if ("typeof" === o.operator && (A.isFunction() || A.isClass())) + return "function" + var D = r(A) + if (!n) return + switch (o.operator) { + case "!": + return !D + case "+": + return +D + case "-": + return -D + case "~": + return ~D + case "typeof": + return typeof D + } + } + if (a.isArrayExpression()) { + for ( + var C = [], S = a.get("elements"), F = 0; + F < S.length; + F++ + ) { + var h = S[F] + if (((h = h.evaluate()), !h.confident)) return t(h) + C.push(h.value) + } + return C + } + if ((a.isObjectExpression(), a.isLogicalExpression())) { + var w = n, + _ = r(a.get("left")), + T = n + n = w + var P = r(a.get("right")), + B = n + switch (((n = T && B), o.operator)) { + case "||": + if (_ && T) return (n = !0), _ + if (!n) return + return _ || P + case "&&": + if ((((!_ && T) || (!P && B)) && (n = !0), !n)) return + return _ && P + } + } + if (a.isBinaryExpression()) { + var _ = r(a.get("left")) + if (!n) return + var P = r(a.get("right")) + if (!n) return + switch (o.operator) { + case "-": + return _ - P + case "+": + return _ + P + case "/": + return _ / P + case "*": + return _ * P + case "%": + return _ % P + case "**": + return Math.pow(_, P) + case "<": + return P > _ + case ">": + return _ > P + case "<=": + return P >= _ + case ">=": + return _ >= P + case "==": + return _ == P + case "!=": + return _ != P + case "===": + return _ === P + case "!==": + return _ !== P + case "|": + return _ | P + case "&": + return _ & P + case "^": + return _ ^ P + case "<<": + return _ << P + case ">>": + return _ >> P + case ">>>": + return _ >>> P + } + } + if (a.isCallExpression()) { + var k = a.get("callee"), + I = void 0, + O = void 0 + if ( + (k.isIdentifier() && + !a.scope.getBinding(k.node.name, !0) && + i.indexOf(k.node.name) >= 0 && + (O = e[o.callee.name]), + k.isMemberExpression()) + ) { + var v = k.get("object"), + y = k.get("property") + if ( + (v.isIdentifier() && + y.isIdentifier() && + i.indexOf(v.node.name) >= 0 && + s.indexOf(y.node.name) < 0 && + ((I = e[v.node.name]), (O = I[y.node.name])), + v.isLiteral() && y.isIdentifier()) + ) { + var E = typeof v.node.value + ;("string" !== E && "number" !== E) || + ((I = v.node.value), (O = I[y.node.name])) + } + } + if (O) { + var M = a.get("arguments").map(r) + if (!n) return + return O.apply(I, M) + } + } + t(a) + } + } + var n = !0, + a = void 0, + o = r(this) + return n || (o = void 0), { confident: n, deopt: a, value: o } + } + ;(t.__esModule = !0), (t.evaluateTruthy = r), (t.evaluate = n) + var i = ["String", "Number", "Math"], + s = ["random"] + }.call( + t, + (function() { + return this + })() + )) + }, + [7400, 5, 3, 308, 16], + [7402, 3, 2616, 16], + [7403, 3, 16], + [7404, 3, 798, 16, 2615], + [7405, 5, 3, 561, 16], + [7406, 80, 3, 16], + function(e, t) { + "use strict" + t.__esModule = !0 + var r = [ + function(e, t) { + return "body" === e.key && t.isArrowFunctionExpression() + ? (e.replaceWith(e.scope.buildUndefinedNode()), !0) + : void 0 + }, + function(e, t) { + var r = !1 + return ( + (r = r || ("test" === e.key && (t.isWhile() || t.isSwitchCase()))), + (r = r || ("declaration" === e.key && t.isExportDeclaration())), + (r = r || ("body" === e.key && t.isLabeledStatement())), + (r = + r || + ("declarations" === e.listKey && + t.isVariableDeclaration() && + 1 === t.node.declarations.length)), + (r = r || ("expression" === e.key && t.isExpressionStatement())), + r ? (t.remove(), !0) : void 0 + ) + }, + function(e, t) { + return t.isSequenceExpression() && 1 === t.node.expressions.length + ? (t.replaceWith(t.node.expressions[0]), !0) + : void 0 + }, + function(e, t) { + return t.isBinary() + ? ("left" === e.key + ? t.replaceWith(t.node.right) + : t.replaceWith(t.node.left), + !0) + : void 0 + } + ] + t.hooks = r + }, + [7408, 146, 5, 3, 1391, 2618, 308, 16], + [7409, 2619], + [7410, 5, 3, 1368, 147, 308, 810, 16], + [7413, 80, 5, 3, 1393, 16], + [7414, 462, 146, 3, 5, 1392, 176, 16, 564], + [7415, 7278], + function(e, t, r) { + "use strict" + var n = function(e, t, r, n, i, s, a, o) { + if (!e) { + var u + if (void 0 === t) + u = new Error( + "Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings." + ) + else { + var l = [r, n, i, s, a, o], + c = 0 + ;(u = new Error( + t.replace(/%s/g, function() { + return l[c++] + }) + )), + (u.name = "Invariant Violation") + } + throw ((u.framesToPop = 1), u) + } + } + e.exports = n + }, + [7328, 2628], + [7329, 2629], + 2533, + [7417, 2559, 5, 3, 1417, 1416, 1418, 819, 147, 16], + [7418, 3, 5, 16, 809, 179], + [7419, 5, 179], + [7420, 5, 179], + [7421, 5, 179], + [7423, 179, 2631, 2632, 2634, 2636, 2637, 2633], + [7424, 5, 179], + [7425, 5, 179], + [7426, 3, 16], + [7428, 3, 16], + [7430, 5, 3, 1394, 2643, 16, 809], + 2525, + [7325, 1395], + [7326, 2641, 1395, 2642], + function(e, t) { + "use strict" + e.exports = function r(e) { + function t() {} + ;(t.prototype = e), new t() + } + }, + function(e, t, r) { + ;(function(e) { + "use strict" + function n(t) { + return new e(t, "base64").toString() + } + function i(e) { + return e.split(",").pop() + } + function s(e, t) { + var r = p.exec(e) + p.lastIndex = 0 + var n = r[1] || r[2], + i = l.join(t, n) + try { + return u.readFileSync(i, "utf8") + } catch (s) { + throw new Error( + "An error occurred while trying to read the map file at " + + i + + "\n" + + s + ) + } + } + function a(e, t) { + ;(t = t || {}), + t.isFileComment && (e = s(e, t.commentFileDir)), + t.hasComment && (e = i(e)), + t.isEncoded && (e = n(e)), + (t.isJSON || t.isEncoded) && (e = JSON.parse(e)), + (this.sourcemap = e) + } + function o(e) { + for (var r, n = e.split("\n"), i = n.length - 1; i > 0; i--) + if (((r = n[i]), ~r.indexOf("sourceMappingURL=data:"))) + return t.fromComment(r) + } + var u = r(373), + l = r(175), + c = /^\s*\/(?:\/|\*)[@#]\s+sourceMappingURL=data:(?:application|text)\/json;(?:charset[:=]\S+;)?base64,(.*)$/gm, + p = /(?:\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+?)[ \t]*$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^\*]+?)[ \t]*(?:\*\/){1}[ \t]*$)/gm + ;(a.prototype.toJSON = function(e) { + return JSON.stringify(this.sourcemap, null, e) + }), + (a.prototype.toBase64 = function() { + var t = this.toJSON() + return new e(t).toString("base64") + }), + (a.prototype.toComment = function(e) { + var t = this.toBase64(), + r = "sourceMappingURL=data:application/json;base64," + t + return e && e.multiline ? "/*# " + r + " */" : "//# " + r + }), + (a.prototype.toObject = function() { + return JSON.parse(this.toJSON()) + }), + (a.prototype.addProperty = function(e, t) { + if (this.sourcemap.hasOwnProperty(e)) + throw new Error( + "property %s already exists on the sourcemap, use set property instead" + ) + return this.setProperty(e, t) + }), + (a.prototype.setProperty = function(e, t) { + return (this.sourcemap[e] = t), this + }), + (a.prototype.getProperty = function(e) { + return this.sourcemap[e] + }), + (t.fromObject = function(e) { + return new a(e) + }), + (t.fromJSON = function(e) { + return new a(e, { isJSON: !0 }) + }), + (t.fromBase64 = function(e) { + return new a(e, { isEncoded: !0 }) + }), + (t.fromComment = function(e) { + return ( + (e = e.replace(/^\/\*/g, "//").replace(/\*\/$/g, "")), + new a(e, { isEncoded: !0, hasComment: !0 }) + ) + }), + (t.fromMapFileComment = function(e, t) { + return new a(e, { commentFileDir: t, isFileComment: !0, isJSON: !0 }) + }), + (t.fromSource = function(e, r) { + if (r) { + var n = o(e) + return n ? n : null + } + var i = e.match(c) + return (c.lastIndex = 0), i ? t.fromComment(i.pop()) : null + }), + (t.fromMapFileSource = function(e, r) { + var n = e.match(p) + return (p.lastIndex = 0), n ? t.fromMapFileComment(n.pop(), r) : null + }), + (t.removeComments = function(e) { + return (c.lastIndex = 0), e.replace(c, "") + }), + (t.removeMapFileComments = function(e) { + return (p.lastIndex = 0), e.replace(p, "") + }), + (t.generateMapFileComment = function(e, t) { + var r = "sourceMappingURL=" + e + return t && t.multiline ? "/*# " + r + " */" : "//# " + r + }), + Object.defineProperty(t, "commentRegex", { + get: function() { + return (c.lastIndex = 0), c + } + }), + Object.defineProperty(t, "mapFileCommentRegex", { + get: function() { + return (p.lastIndex = 0), p + } + }) + }.call(t, r(2502).Buffer)) + }, + [7431, 1396], + function(e, t, r) { + ;(function(n) { + function i() { + var e = (n.env.DEBUG_COLORS || "").trim().toLowerCase() + return 0 === e.length + ? c.isatty(f) + : "0" !== e && "no" !== e && "false" !== e && "disabled" !== e + } + function s() { + var e = arguments, + r = this.useColors, + n = this.namespace + if (r) { + var i = this.color + e[0] = + " [3" + + i + + ";1m" + + n + + " " + + e[0] + + "[3" + + i + + "m +" + + t.humanize(this.diff) + + "" + } else e[0] = new Date().toUTCString() + " " + n + " " + e[0] + return e + } + function a() { + return h.write(p.format.apply(this, arguments) + "\n") + } + function o(e) { + null == e ? delete n.env.DEBUG : (n.env.DEBUG = e) + } + function u() { + return n.env.DEBUG + } + function l(e) { + var t, + i = n.binding("tty_wrap") + switch (i.guessHandleType(e)) { + case "TTY": + ;(t = new c.WriteStream(e)), + (t._type = "tty"), + t._handle && t._handle.unref && t._handle.unref() + break + case "FILE": + var s = r(373) + ;(t = new s.SyncWriteStream(e, { autoClose: !1 })), (t._type = "fs") + break + case "PIPE": + case "TCP": + var a = r(373) + ;(t = new a.Socket({ fd: e, readable: !1, writable: !0 })), + (t.readable = !1), + (t.read = null), + (t._type = "pipe"), + t._handle && t._handle.unref && t._handle.unref() + break + default: + throw new Error("Implement me. Unknown stream file type!") + } + return (t.fd = e), (t._isStdio = !0), t + } + var c = r(7314), + p = r(22) + ;(t = e.exports = r(1396)), + (t.log = a), + (t.formatArgs = s), + (t.save = o), + (t.load = u), + (t.useColors = i), + (t.colors = [6, 2, 3, 4, 5, 1]) + var f = parseInt(n.env.DEBUG_FD, 10) || 2, + h = 1 === f ? n.stdout : 2 === f ? n.stderr : l(f), + d = + 4 === p.inspect.length + ? function(e, t) { + return p.inspect(e, void 0, void 0, t) + } + : function(e, t) { + return p.inspect(e, { colors: t }) + } + ;(t.formatters.o = function(e) { + return d(e, this.useColors).replace(/\s*\n\s*/g, " ") + }), + t.enable(u()) + }.call(t, r(1))) + }, + function(e, t) { + function r(e) { + if (((e = "" + e), !(e.length > 1e4))) { + var t = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + e + ) + if (t) { + var r = parseFloat(t[1]), + n = (t[2] || "ms").toLowerCase() + switch (n) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return r * c + case "days": + case "day": + case "d": + return r * l + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return r * u + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return r * o + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return r * a + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return r + } + } + } + } + function n(e) { + return e >= l + ? Math.round(e / l) + "d" + : e >= u + ? Math.round(e / u) + "h" + : e >= o + ? Math.round(e / o) + "m" + : e >= a + ? Math.round(e / a) + "s" + : e + "ms" + } + function i(e) { + return ( + s(e, l, "day") || + s(e, u, "hour") || + s(e, o, "minute") || + s(e, a, "second") || + e + " ms" + ) + } + function s(e, t, r) { + return t > e + ? void 0 + : 1.5 * t > e + ? Math.floor(e / t) + " " + r + : Math.ceil(e / t) + " " + r + "s" + } + var a = 1e3, + o = 60 * a, + u = 60 * o, + l = 24 * u, + c = 365.25 * l + e.exports = function(e, t) { + return (t = t || {}), "string" == typeof e ? r(e) : t["long"] ? i(e) : n(e) + } + }, + function(e, t, r) { + var n = t + ;(n.parse = (function() { + "use strict" + var e, + t, + r, + n, + i = { + "'": "'", + '"': '"', + "\\": "\\", + "/": "/", + "\n": "", + b: "\b", + f: "\f", + n: "\n", + r: "\r", + t: " " + }, + s = [" ", " ", "\r", "\n", "\x0B", "\f", " ", "\ufeff"], + a = function(t) { + var n = new SyntaxError() + throw ((n.message = t), (n.at = e), (n.text = r), n) + }, + o = function(n) { + return ( + n && n !== t && a("Expected '" + n + "' instead of '" + t + "'"), + (t = r.charAt(e)), + (e += 1), + t + ) + }, + u = function() { + return r.charAt(e) + }, + l = function() { + var e = t + for ( + "_" !== t && + "$" !== t && + ("a" > t || t > "z") && + ("A" > t || t > "Z") && + a("Bad identifier"); + o() && + ("_" === t || + "$" === t || + (t >= "a" && "z" >= t) || + (t >= "A" && "Z" >= t) || + (t >= "0" && "9" >= t)); + + ) + e += t + return e + }, + c = function() { + var e, + r = "", + n = "", + i = 10 + if ((("-" !== t && "+" !== t) || ((r = t), o(t)), "I" === t)) + return ( + (e = y()), + ("number" != typeof e || isNaN(e)) && + a("Unexpected word for number"), + "-" === r ? -e : e + ) + if ("N" === t) + return (e = y()), isNaN(e) || a("expected word to be NaN"), e + switch ( + ("0" === t && + ((n += t), + o(), + "x" === t || "X" === t + ? ((n += t), o(), (i = 16)) + : t >= "0" && "9" >= t && a("Octal literal")), + i) + ) { + case 10: + for (; t >= "0" && "9" >= t; ) (n += t), o() + if ("." === t) + for (n += "."; o() && t >= "0" && "9" >= t; ) n += t + if ("e" === t || "E" === t) + for ( + n += t, + o(), + ("-" !== t && "+" !== t) || ((n += t), o()); + t >= "0" && "9" >= t; + + ) + (n += t), o() + break + case 16: + for ( + ; + (t >= "0" && "9" >= t) || + (t >= "A" && "F" >= t) || + (t >= "a" && "f" >= t); + + ) + (n += t), o() + } + return (e = "-" === r ? -n : +n), isFinite(e) ? e : void a("Bad number") + }, + p = function() { + var e, + r, + n, + s, + l = "" + if ('"' === t || "'" === t) + for (n = t; o(); ) { + if (t === n) return o(), l + if ("\\" === t) + if ((o(), "u" === t)) { + for ( + s = 0, r = 0; + 4 > r && ((e = parseInt(o(), 16)), isFinite(e)); + r += 1 + ) + s = 16 * s + e + l += String.fromCharCode(s) + } else if ("\r" === t) "\n" === u() && o() + else { + if ("string" != typeof i[t]) break + l += i[t] + } + else { + if ("\n" === t) break + l += t + } + } + a("Bad string") + }, + f = function() { + "/" !== t && a("Not an inline comment") + do if ((o(), "\n" === t || "\r" === t)) return void o() + while (t) + }, + h = function() { + "*" !== t && a("Not a block comment") + do for (o(); "*" === t; ) if ((o("*"), "/" === t)) return void o("/") + while (t) + a("Unterminated block comment") + }, + d = function() { + "/" !== t && a("Not a comment"), + o("/"), + "/" === t ? f() : "*" === t ? h() : a("Unrecognized comment") + }, + m = function() { + for (; t; ) + if ("/" === t) d() + else { + if (!(s.indexOf(t) >= 0)) return + o() + } + }, + y = function() { + switch (t) { + case "t": + return o("t"), o("r"), o("u"), o("e"), !0 + case "f": + return o("f"), o("a"), o("l"), o("s"), o("e"), !1 + case "n": + return o("n"), o("u"), o("l"), o("l"), null + case "I": + return ( + o("I"), + o("n"), + o("f"), + o("i"), + o("n"), + o("i"), + o("t"), + o("y"), + 1 / 0 + ) + case "N": + return o("N"), o("a"), o("N"), NaN + } + a("Unexpected '" + t + "'") + }, + v = function() { + var e = [] + if ("[" === t) + for (o("["), m(); t; ) { + if ("]" === t) return o("]"), e + if ( + ("," === t ? a("Missing array element") : e.push(n()), + m(), + "," !== t) + ) + return o("]"), e + o(","), m() + } + a("Bad array") + }, + g = function() { + var e, + r = {} + if ("{" === t) + for (o("{"), m(); t; ) { + if ("}" === t) return o("}"), r + if ( + ((e = '"' === t || "'" === t ? p() : l()), + m(), + o(":"), + (r[e] = n()), + m(), + "," !== t) + ) + return o("}"), r + o(","), m() + } + a("Bad object") + } + return ( + (n = function() { + switch ((m(), t)) { + case "{": + return g() + case "[": + return v() + case '"': + case "'": + return p() + case "-": + case "+": + case ".": + return c() + default: + return t >= "0" && "9" >= t ? c() : y() + } + }), + function(i, s) { + var o + return ( + (r = String(i)), + (e = 0), + (t = " "), + (o = n()), + m(), + t && a("Syntax error"), + "function" == typeof s + ? (function u(e, t) { + var r, + n, + i = e[t] + if (i && "object" == typeof i) + for (r in i) + Object.prototype.hasOwnProperty.call(i, r) && + ((n = u(i, r)), + void 0 !== n ? (i[r] = n) : delete i[r]) + return s.call(e, t, i) + })({ "": o }, "") + : o + ) + } + ) + })()), + (n.stringify = function(e, t, r) { + function i(e) { + return ( + (e >= "a" && "z" >= e) || + (e >= "A" && "Z" >= e) || + (e >= "0" && "9" >= e) || + "_" === e || + "$" === e + ) + } + function s(e) { + return ( + (e >= "a" && "z" >= e) || + (e >= "A" && "Z" >= e) || + "_" === e || + "$" === e + ) + } + function a(e) { + if ("string" != typeof e) return !1 + if (!s(e[0])) return !1 + for (var t = 1, r = e.length; r > t; ) { + if (!i(e[t])) return !1 + t++ + } + return !0 + } + function o(e) { + return Array.isArray + ? Array.isArray(e) + : "[object Array]" === Object.prototype.toString.call(e) + } + function u(e) { + return "[object Date]" === Object.prototype.toString.call(e) + } + function l(e) { + for (var t = 0; t < m.length; t++) + if (m[t] === e) + throw new TypeError("Converting circular structure to JSON") + } + function c(e, t, r) { + if (!e) return "" + e.length > 10 && (e = e.substring(0, 10)) + for (var n = r ? "" : "\n", i = 0; t > i; i++) n += e + return n + } + function p(e) { + return ( + (y.lastIndex = 0), + y.test(e) + ? '"' + + e.replace(y, function(e) { + var t = v[e] + return "string" == typeof t + ? t + : "\\u" + + ("0000" + e.charCodeAt(0).toString(16)).slice( + -4 + ) + }) + + '"' + : '"' + e + '"' + ) + } + function f(e, t, r) { + var n, + i, + s = h(e, t, r) + switch ((s && !u(s) && (s = s.valueOf()), typeof s)) { + case "boolean": + return s.toString() + case "number": + return isNaN(s) || !isFinite(s) ? "null" : s.toString() + case "string": + return p(s.toString()) + case "object": + if (null === s) return "null" + if (o(s)) { + l(s), (n = "["), m.push(s) + for (var y = 0; y < s.length; y++) + (i = f(s, y, !1)), + (n += c(d, m.length)), + (n += + null === i || "undefined" == typeof i + ? "null" + : i), + y < s.length - 1 ? (n += ",") : d && (n += "\n") + m.pop(), (n += c(d, m.length, !0) + "]") + } else { + l(s), (n = "{") + var v = !1 + m.push(s) + for (var g in s) + if (s.hasOwnProperty(g)) { + var E = f(s, g, !1) + if ( + ((r = !1), + "undefined" != typeof E && null !== E) + ) { + ;(n += c(d, m.length)), (v = !0) + var t = a(g) ? g : p(g) + n += t + ":" + (d ? " " : "") + E + "," + } + } + m.pop(), + (n = v + ? n.substring(0, n.length - 1) + + c(d, m.length) + + "}" + : "{}") + } + return n + default: + return + } + } + if (t && "function" != typeof t && !o(t)) + throw new Error("Replacer must be a function or an array") + var h = function(e, r, n) { + var i = e[r] + return ( + i && i.toJSON && "function" == typeof i.toJSON && (i = i.toJSON()), + "function" == typeof t + ? t.call(e, r, i) + : t + ? n || o(e) || t.indexOf(r) >= 0 + ? i + : void 0 + : i + ) + } + ;(n.isWord = a), + (isNaN = + isNaN || + function(e) { + return "number" == typeof e && e !== e + }) + var d, + m = [] + r && + ("string" == typeof r + ? (d = r) + : "number" == typeof r && r >= 0 && (d = c(" ", r, !0))) + var y = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + v = { + "\b": "\\b", + " ": "\\t", + "\n": "\\n", + "\f": "\\f", + "\r": "\\r", + '"': '\\"', + "\\": "\\\\" + }, + g = { "": e } + return void 0 === e ? h(g, "", !0) : f(g, "", !0) + }) + }, + function(e, t) { + function r(e) { + for (var t = -1, r = e ? e.length : 0, n = -1, i = []; ++t < r; ) { + var s = e[t] + s && (i[++n] = s) + } + return i + } + e.exports = r + }, + [7433, 813, 2671, 471, 2692], + function(e, t, r) { + e.exports = r(561) + }, + [7435, 812, 1403, 2681], + function(e, t, r) { + function n(e, t, r) { + var n = o(e) ? i : a + return (t = s(t, r, 3)), n(e, t) + } + var i = r(2657), + s = r(813), + a = r(1408), + o = r(94) + e.exports = n + }, + function(e, t, r) { + function n(e, t, r) { + if (null == e) return [] + r && u(e, t, r) && (t = void 0) + var n = -1 + t = i(t, r, 3) + var l = s(e, function(e, r, i) { + return { criteria: t(e, r, i), index: ++n, value: e } + }) + return a(l, o) + } + var i = r(813), + s = r(1408), + a = r(2670), + o = r(2676), + u = r(471) + e.exports = n + }, + [7437, 2675, 562], + function(e, t) { + function r(e, t) { + for (var r = -1, n = e.length, i = Array(n); ++r < n; ) i[r] = t(e[r], r, e) + return i + } + e.exports = r + }, + function(e, t) { + function r(e, t) { + for (var r = -1, n = e.length; ++r < n; ) if (t(e[r], r, e)) return !0 + return !1 + } + e.exports = r + }, + function(e, t) { + function r(e, t) { + return void 0 === e ? t : e + } + e.exports = r + }, + [7438, 309], + function(e, t) { + function r(e, t) { + if (e !== t) { + var r = null === e, + n = void 0 === e, + i = e === e, + s = null === t, + a = void 0 === t, + o = t === t + if ((e > t && !s) || !i || (r && !a && o) || (n && o)) return 1 + if ((t > e && !r) || !o || (s && !n && i) || (a && i)) return -1 + } + return 0 + } + e.exports = r + }, + [7444, 1404, 821], + [7449, 2682, 2683, 2684, 94, 820], + [7450, 1407, 181], + [7451, 2664, 2686, 181], + [7452, 814, 1407, 1410, 94, 817, 1412, 1397, 181, 818], + function(e, t, r) { + function n(e, t, r, f, h) { + if (!u(e)) return e + var d = o(t) && (a(t) || c(t)), + m = d ? void 0 : p(t) + return ( + i(m || t, function(i, a) { + if ((m && ((a = i), (i = t[a])), l(i))) + f || (f = []), h || (h = []), s(e, t, a, n, r, f, h) + else { + var o = e[a], + u = r ? r(o, i, a, e, t) : void 0, + c = void 0 === u + c && (u = i), + (void 0 === u && (!d || a in e)) || + (!c && (u === u ? u === o : o !== o)) || + (e[a] = u) + } + }), + e + ) + } + var i = r(812), + s = r(2668), + a = r(94), + o = r(375), + u = r(99), + l = r(148), + c = r(820), + p = r(309) + e.exports = n + }, + function(e, t, r) { + function n(e, t, r, n, p, f, h) { + for (var d = f.length, m = t[r]; d--; ) if (f[d] == m) return void (e[r] = h[d]) + var y = e[r], + v = p ? p(y, m, r, e, t) : void 0, + g = void 0 === v + g && + ((v = m), + o(m) && (a(m) || l(m)) + ? (v = a(y) ? y : o(y) ? i(y) : []) + : u(m) || s(m) + ? (v = s(y) ? c(y) : u(y) ? y : {}) + : (g = !1)), + f.push(m), + h.push(v), + g ? (e[r] = n(v, m, p, f, h)) : (v === v ? v !== y : y === y) && (e[r] = v) + } + var i = r(1399), + s = r(472), + a = r(94), + o = r(375), + u = r(1417), + l = r(820), + c = r(2694) + e.exports = n + }, + [7453, 814, 818], + function(e, t) { + function r(e, t) { + var r = e.length + for (e.sort(t); r--; ) e[r] = e[r].value + return e + } + e.exports = r + }, + [7454, 1406, 2674, 2679], + function(e, t) { + function r(e, t) { + for (var r = -1, n = t.length, i = Array(n); ++r < n; ) i[r] = e[t[r]] + return i + } + e.exports = r + }, + function(e, t) { + ;(function(t) { + function r(e) { + var t = new n(e.byteLength), + r = new i(t) + return r.set(new i(e)), t + } + var n = t.ArrayBuffer, + i = t.Uint8Array + e.exports = r + }.call( + t, + (function() { + return this + })() + )) + }, + [7456, 99], + [7457, 99], + function(e, t, r) { + function n(e, t) { + return i(e.criteria, t.criteria) || e.index - t.index + } + var i = r(2661) + e.exports = n + }, + [7459, 816, 180, 181], + [7460, 181], + [7461, 2656, 562], + [7462, 1398], + [7463, 470, 94], + [7464, 2658], + function(e, t) { + function r(e, t, r) { + switch (r) { + case n: + case i: + return +e == +t + case s: + return e.name == t.name && e.message == t.message + case a: + return e != +e ? t != +t : e == +t + case o: + case u: + return e == t + "" + } + return !1 + } + var n = "[object Boolean]", + i = "[object Date]", + s = "[object Error]", + a = "[object Number]", + o = "[object RegExp]", + u = "[object String]" + e.exports = r + }, + [7465, 309], + function(e, t) { + function r(e, t, r) { + return t ? (e = n[e]) : r && (e = i[e]), "\\" + e + } + var n = { + 0: "x30", + 1: "x31", + 2: "x32", + 3: "x33", + 4: "x34", + 5: "x35", + 6: "x36", + 7: "x37", + 8: "x38", + 9: "x39", + A: "x41", + B: "x42", + C: "x43", + D: "x44", + E: "x45", + F: "x46", + a: "x61", + b: "x62", + c: "x63", + d: "x64", + e: "x65", + f: "x66", + n: "x6e", + r: "x72", + t: "x74", + u: "x75", + v: "x76", + x: "x78" + }, + i = { + "\\": "\\", + "'": "'", + "\n": "n", + "\r": "r", + "\u2028": "u2028", + "\u2029": "u2029" + } + e.exports = r + }, + [7467, 1412, 2697], + function(e, t) { + function r(e, t, r) { + for (var n = e.length, i = t + (r ? 0 : -1); r ? i-- : ++i < n; ) { + var s = e[i] + if (s !== s) return i + } + return -1 + } + e.exports = r + }, + function(e, t) { + function r(e) { + var t = e.length, + r = new e.constructor(t) + return ( + t && + "string" == typeof e[0] && + i.call(e, "index") && + ((r.index = e.index), (r.input = e.input)), + r + ) + } + var n = Object.prototype, + i = n.hasOwnProperty + e.exports = r + }, + [7469, 2673], + function(e, t) { + function r(e) { + var t = e.constructor + return ("function" == typeof t && t instanceof t) || (t = Object), new t() + } + e.exports = r + }, + [7474, 472, 94, 563, 180, 821], + function(e, t) { + function r(e, t) { + for (var r, n = -1, i = e.length, s = -1, a = []; ++n < i; ) { + var o = e[n], + u = t ? t(o, n, e) : o + ;(n && r === u) || ((r = u), (a[++s] = o)) + } + return a + } + e.exports = r + }, + [7482, 1415, 148], + function(e, t, r) { + function n(e) { + return i(e, s(e)) + } + var i = r(1402), + s = r(821) + e.exports = n + }, + [7490, 814, 1410, 472, 94, 563, 817, 180, 1397, 818], + function(e, t, r) { + var n = r(2667), + i = r(1411), + s = i(n) + e.exports = s + }, + [7493, 309, 181], + [7494, 2672, 309], + function(e, t, r) { + function n(e) { + return (e = i(e)), e && o.test(e) ? e.replace(a, s) : e || "(?:)" + } + var i = r(815), + s = r(2685), + a = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g, + o = RegExp(a.source) + e.exports = n + }, + function(e, t, r) { + function n(e, t, r) { + return ( + (e = i(e)), + (r = null == r ? 0 : s(0 > r ? 0 : +r || 0, e.length)), + e.lastIndexOf(t, r) == r + ) + } + var i = r(815), + s = Math.min + e.exports = n + }, + [7495, 1409, 2669, 817], + function(e, t, r) { + function n(e) { + return e.split("").reduce(function(e, t) { + return (e[t] = !0), e + }, {}) + } + function i(e, t) { + return ( + (t = t || {}), + function(r, n, i) { + return a(r, e, t) + } + ) + } + function s(e, t) { + ;(e = e || {}), (t = t || {}) + var r = {} + return ( + Object.keys(t).forEach(function(e) { + r[e] = t[e] + }), + Object.keys(e).forEach(function(t) { + r[t] = e[t] + }), + r + ) + } + function a(e, t, r) { + if ("string" != typeof t) throw new TypeError("glob pattern string required") + return ( + r || (r = {}), + r.nocomment || "#" !== t.charAt(0) + ? "" === t.trim() + ? "" === e + : new o(t, r).match(e) + : !1 + ) + } + function o(e, t) { + if (!(this instanceof o)) return new o(e, t) + if ("string" != typeof e) throw new TypeError("glob pattern string required") + t || (t = {}), + (e = e.trim()), + "/" !== y.sep && (e = e.split(y.sep).join("/")), + (this.options = t), + (this.set = []), + (this.pattern = e), + (this.regexp = null), + (this.negate = !1), + (this.comment = !1), + (this.empty = !1), + this.make() + } + function u() { + if (!this._made) { + var e = this.pattern, + t = this.options + if (!t.nocomment && "#" === e.charAt(0)) return void (this.comment = !0) + if (!e) return void (this.empty = !0) + this.parseNegate() + var r = (this.globSet = this.braceExpand()) + t.debug && (this.debug = console.error), + this.debug(this.pattern, r), + (r = this.globParts = r.map(function(e) { + return e.split(S) + })), + this.debug(this.pattern, r), + (r = r.map(function(e, t, r) { + return e.map(this.parse, this) + }, this)), + this.debug(this.pattern, r), + (r = r.filter(function(e) { + return -1 === e.indexOf(!1) + })), + this.debug(this.pattern, r), + (this.set = r) + } + } + function l() { + var e = this.pattern, + t = !1, + r = this.options, + n = 0 + if (!r.nonegate) { + for (var i = 0, s = e.length; s > i && "!" === e.charAt(i); i++) + (t = !t), n++ + n && (this.pattern = e.substr(n)), (this.negate = t) + } + } + function c(e, t) { + if ( + (t || (t = this instanceof o ? this.options : {}), + (e = "undefined" == typeof e ? this.pattern : e), + "undefined" == typeof e) + ) + throw new Error("undefined pattern") + return t.nobrace || !e.match(/\{.*\}/) ? [e] : E(e) + } + function p(e, t) { + function r() { + if (s) { + switch (s) { + case "*": + ;(o += x), (u = !0) + break + case "?": + ;(o += b), (u = !0) + break + default: + o += "\\" + s + } + v.debug("clearStateChar %j %j", s, o), (s = !1) + } + } + var n = this.options + if (!n.noglobstar && "**" === e) return g + if ("" === e) return "" + for ( + var i, + s, + a, + o = "", + u = !!n.nocase, + l = !1, + c = [], + p = [], + f = !1, + h = -1, + m = -1, + y = + "." === e.charAt(0) + ? "" + : n.dot + ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" + : "(?!\\.)", + v = this, + E = 0, + A = e.length; + A > E && (a = e.charAt(E)); + E++ + ) + if ((this.debug("%s %s %s %j", e, E, o, a), l && C[a])) + (o += "\\" + a), (l = !1) + else + switch (a) { + case "/": + return !1 + case "\\": + r(), (l = !0) + continue + case "?": + case "*": + case "+": + case "@": + case "!": + if ((this.debug("%s %s %s %j <-- stateChar", e, E, o, a), f)) { + this.debug(" in class"), + "!" === a && E === m + 1 && (a = "^"), + (o += a) + continue + } + v.debug("call clearStateChar %j", s), + r(), + (s = a), + n.noext && r() + continue + case "(": + if (f) { + o += "(" + continue + } + if (!s) { + o += "\\(" + continue + } + ;(i = s), + c.push({ type: i, start: E - 1, reStart: o.length }), + (o += "!" === s ? "(?:(?!(?:" : "(?:"), + this.debug("plType %j %j", s, o), + (s = !1) + continue + case ")": + if (f || !c.length) { + o += "\\)" + continue + } + r(), (u = !0), (o += ")") + var D = c.pop() + switch ((i = D.type)) { + case "!": + p.push(D), (o += ")[^/]*?)"), (D.reEnd = o.length) + break + case "?": + case "+": + case "*": + o += i + break + case "@": + } + continue + case "|": + if (f || !c.length || l) { + ;(o += "\\|"), (l = !1) + continue + } + r(), (o += "|") + continue + case "[": + if ((r(), f)) { + o += "\\" + a + continue + } + ;(f = !0), (m = E), (h = o.length), (o += a) + continue + case "]": + if (E === m + 1 || !f) { + ;(o += "\\" + a), (l = !1) + continue + } + if (f) { + var S = e.substring(m + 1, E) + try { + RegExp("[" + S + "]") + } catch (w) { + var _ = this.parse(S, F) + ;(o = o.substr(0, h) + "\\[" + _[0] + "\\]"), + (u = u || _[1]), + (f = !1) + continue + } + } + ;(u = !0), (f = !1), (o += a) + continue + default: + r(), + l ? (l = !1) : !C[a] || ("^" === a && f) || (o += "\\"), + (o += a) + } + for ( + f && + ((S = e.substr(m + 1)), + (_ = this.parse(S, F)), + (o = o.substr(0, h) + "\\[" + _[0]), + (u = u || _[1])), + D = c.pop(); + D; + D = c.pop() + ) { + var T = o.slice(D.reStart + 3) + ;(T = T.replace(/((?:\\{2})*)(\\?)\|/g, function(e, t, r) { + return r || (r = "\\"), t + t + r + "|" + })), + this.debug("tail=%j\n %s", T, T) + var P = "*" === D.type ? x : "?" === D.type ? b : "\\" + D.type + ;(u = !0), (o = o.slice(0, D.reStart) + P + "\\(" + T) + } + r(), l && (o += "\\\\") + var B = !1 + switch (o.charAt(0)) { + case ".": + case "[": + case "(": + B = !0 + } + for (var k = p.length - 1; k > -1; k--) { + var I = p[k], + O = o.slice(0, I.reStart), + M = o.slice(I.reStart, I.reEnd - 8), + R = o.slice(I.reEnd - 8, I.reEnd), + L = o.slice(I.reEnd) + R += L + var N = O.split("(").length - 1, + j = L + for (E = 0; N > E; E++) j = j.replace(/\)[+*?]?/, "") + L = j + var U = "" + "" === L && t !== F && (U = "$") + var V = O + M + L + U + R + o = V + } + if (("" !== o && u && (o = "(?=.)" + o), B && (o = y + o), t === F)) + return [o, u] + if (!u) return d(e) + var G = n.nocase ? "i" : "", + W = new RegExp("^" + o + "$", G) + return (W._glob = e), (W._src = o), W + } + function f() { + if (this.regexp || this.regexp === !1) return this.regexp + var e = this.set + if (!e.length) return (this.regexp = !1), this.regexp + var t = this.options, + r = t.noglobstar ? x : t.dot ? A : D, + n = t.nocase ? "i" : "", + i = e + .map(function(e) { + return e + .map(function(e) { + return e === g ? r : "string" == typeof e ? m(e) : e._src + }) + .join("\\/") + }) + .join("|") + ;(i = "^(?:" + i + ")$"), this.negate && (i = "^(?!" + i + ").*$") + try { + this.regexp = new RegExp(i, n) + } catch (s) { + this.regexp = !1 + } + return this.regexp + } + function h(e, t) { + if ((this.debug("match", e, this.pattern), this.comment)) return !1 + if (this.empty) return "" === e + if ("/" === e && t) return !0 + var r = this.options + "/" !== y.sep && (e = e.split(y.sep).join("/")), + (e = e.split(S)), + this.debug(this.pattern, "split", e) + var n = this.set + this.debug(this.pattern, "set", n) + var i, s + for (s = e.length - 1; s >= 0 && !(i = e[s]); s--); + for (s = 0; s < n.length; s++) { + var a = n[s], + o = e + r.matchBase && 1 === a.length && (o = [i]) + var u = this.matchOne(o, a, t) + if (u) return r.flipNegate ? !0 : !this.negate + } + return r.flipNegate ? !1 : this.negate + } + function d(e) { + return e.replace(/\\(.)/g, "$1") + } + function m(e) { + return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") + } + ;(e.exports = a), (a.Minimatch = o) + var y = { sep: "/" } + try { + y = r(175) + } catch (v) {} + var g = (a.GLOBSTAR = o.GLOBSTAR = {}), + E = r(2703), + b = "[^/]", + x = b + "*?", + A = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?", + D = "(?:(?!(?:\\/|^)\\.).)*?", + C = n("().*{}+?[]^$\\!"), + S = /\/+/ + ;(a.filter = i), + (a.defaults = function(e) { + if (!e || !Object.keys(e).length) return a + var t = a, + r = function(r, n, i) { + return t.minimatch(r, n, s(e, i)) + } + return ( + (r.Minimatch = function(r, n) { + return new t.Minimatch(r, s(e, n)) + }), + r + ) + }), + (o.defaults = function(e) { + return e && Object.keys(e).length ? a.defaults(e).Minimatch : o + }), + (o.prototype.debug = function() {}), + (o.prototype.make = u), + (o.prototype.parseNegate = l), + (a.braceExpand = function(e, t) { + return c(e, t) + }), + (o.prototype.braceExpand = c), + (o.prototype.parse = p) + var F = {} + ;(a.makeRe = function(e, t) { + return new o(e, t || {}).makeRe() + }), + (o.prototype.makeRe = f), + (a.match = function(e, t, r) { + r = r || {} + var n = new o(t, r) + return ( + (e = e.filter(function(e) { + return n.match(e) + })), + n.options.nonull && !e.length && e.push(t), + e + ) + }), + (o.prototype.match = h), + (o.prototype.matchOne = function(e, t, r) { + var n = this.options + this.debug("matchOne", { this: this, file: e, pattern: t }), + this.debug("matchOne", e.length, t.length) + for ( + var i = 0, s = 0, a = e.length, o = t.length; + a > i && o > s; + i++, s++ + ) { + this.debug("matchOne loop") + var u = t[s], + l = e[i] + if ((this.debug(t, u, l), u === !1)) return !1 + if (u === g) { + this.debug("GLOBSTAR", [t, u, l]) + var c = i, + p = s + 1 + if (p === o) { + for (this.debug("** at the end"); a > i; i++) + if ( + "." === e[i] || + ".." === e[i] || + (!n.dot && "." === e[i].charAt(0)) + ) + return !1 + return !0 + } + for (; a > c; ) { + var f = e[c] + if ( + (this.debug("\nglobstar while", e, c, t, p, f), + this.matchOne(e.slice(c), t.slice(p), r)) + ) + return this.debug("globstar found match!", c, a, f), !0 + if ( + "." === f || + ".." === f || + (!n.dot && "." === f.charAt(0)) + ) { + this.debug("dot detected!", e, c, t, p) + break + } + this.debug("globstar swallow a segment, and continue"), c++ + } + return !( + !r || + (this.debug("\n>>> no match, partial?", e, c, t, p), c !== a) + ) + } + var h + if ( + ("string" == typeof u + ? ((h = n.nocase + ? l.toLowerCase() === u.toLowerCase() + : l === u), + this.debug("string match", u, l, h)) + : ((h = l.match(u)), this.debug("pattern match", u, l, h)), + !h) + ) + return !1 + } + if (i === a && s === o) return !0 + if (i === a) return r + if (s === o) { + var d = i === a - 1 && "" === e[i] + return d + } + throw new Error("wtf?") + }) + }, + function(e, t, r) { + function n(e) { + return parseInt(e, 10) == e ? parseInt(e, 10) : e.charCodeAt(0) + } + function i(e) { + return e + .split("\\\\") + .join(m) + .split("\\{") + .join(y) + .split("\\}") + .join(v) + .split("\\,") + .join(g) + .split("\\.") + .join(E) + } + function s(e) { + return e + .split(m) + .join("\\") + .split(y) + .join("{") + .split(v) + .join("}") + .split(g) + .join(",") + .split(E) + .join(".") + } + function a(e) { + if (!e) return [""] + var t = [], + r = d("{", "}", e) + if (!r) return e.split(",") + var n = r.pre, + i = r.body, + s = r.post, + o = n.split(",") + o[o.length - 1] += "{" + i + "}" + var u = a(s) + return ( + s.length && ((o[o.length - 1] += u.shift()), o.push.apply(o, u)), + t.push.apply(t, o), + t + ) + } + function o(e) { + return e ? f(i(e), !0).map(s) : [] + } + function u(e) { + return "{" + e + "}" + } + function l(e) { + return /^-?0\d/.test(e) + } + function c(e, t) { + return t >= e + } + function p(e, t) { + return e >= t + } + function f(e, t) { + var r = [], + i = d("{", "}", e) + if (!i || /\$$/.test(i.pre)) return [e] + var s = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(i.body), + o = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(i.body), + m = s || o, + y = /^(.*,)+(.+)?$/.test(i.body) + if (!m && !y) + return i.post.match(/,.*\}/) + ? ((e = i.pre + "{" + i.body + v + i.post), f(e)) + : [e] + var g + if (m) g = i.body.split(/\.\./) + else if ( + ((g = a(i.body)), + 1 === g.length && ((g = f(g[0], !1).map(u)), 1 === g.length)) + ) { + var E = i.post.length ? f(i.post, !1) : [""] + return E.map(function(e) { + return i.pre + g[0] + e + }) + } + var b, + x = i.pre, + E = i.post.length ? f(i.post, !1) : [""] + if (m) { + var A = n(g[0]), + D = n(g[1]), + C = Math.max(g[0].length, g[1].length), + S = 3 == g.length ? Math.abs(n(g[2])) : 1, + F = c, + w = A > D + w && ((S *= -1), (F = p)) + var _ = g.some(l) + b = [] + for (var T = A; F(T, D); T += S) { + var P + if (o) (P = String.fromCharCode(T)), "\\" === P && (P = "") + else if (((P = String(T)), _)) { + var B = C - P.length + if (B > 0) { + var k = new Array(B + 1).join("0") + P = 0 > T ? "-" + k + P.slice(1) : k + P + } + } + b.push(P) + } + } else + b = h(g, function(e) { + return f(e, !1) + }) + for (var I = 0; I < b.length; I++) + for (var O = 0; O < E.length; O++) { + var M = x + b[I] + E[O] + ;(!t || m || M) && r.push(M) + } + return r + } + var h = r(2705), + d = r(2704) + e.exports = o + var m = "\x00SLASH" + Math.random() + "\x00", + y = "\x00OPEN" + Math.random() + "\x00", + v = "\x00CLOSE" + Math.random() + "\x00", + g = "\x00COMMA" + Math.random() + "\x00", + E = "\x00PERIOD" + Math.random() + "\x00" + }, + function(e, t) { + function r(e, t, r) { + var i = n(e, t, r) + return ( + i && { + start: i[0], + end: i[1], + pre: r.slice(0, i[0]), + body: r.slice(i[0] + e.length, i[1]), + post: r.slice(i[1] + t.length) + } + ) + } + function n(e, t, r) { + var n, + i, + s, + a, + o, + u = r.indexOf(e), + l = r.indexOf(t, u + 1), + c = u + if (u >= 0 && l > 0) { + for (n = [], s = r.length; c < r.length && c >= 0 && !o; ) + c == u + ? (n.push(c), (u = r.indexOf(e, c + 1))) + : 1 == n.length + ? (o = [n.pop(), l]) + : ((i = n.pop()), + s > i && ((s = i), (a = l)), + (l = r.indexOf(t, c + 1))), + (c = l > u && u >= 0 ? u : l) + n.length && (o = [s, a]) + } + return o + } + ;(e.exports = r), (r.range = n) + }, + function(e, t) { + e.exports = function(e, t) { + for (var n = [], i = 0; i < e.length; i++) { + var s = t(e[i], i) + r(s) ? n.push.apply(n, s) : n.push(s) + } + return n + } + var r = + Array.isArray || + function(e) { + return "[object Array]" === Object.prototype.toString.call(e) + } + }, + function(e, t, r) { + "use strict" + var n = r(373) + ;(e.exports = function(e, t) { + var r = "function" == typeof n.access ? n.access : n.stat + r(e, function(e) { + t(null, !e) + }) + }), + (e.exports.sync = function(e) { + var t = "function" == typeof n.accessSync ? n.accessSync : n.statSync + try { + return t(e), !0 + } catch (r) { + return !1 + } + }) + }, + function(e, t, r) { + ;(function(t) { + "use strict" + function r(e) { + return "/" === e.charAt(0) + } + function n(e) { + var t = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/, + r = t.exec(e), + n = r[1] || "", + i = !!n && ":" !== n.charAt(1) + return !!r[2] || i + } + ;(e.exports = "win32" === t.platform ? n : r), + (e.exports.posix = r), + (e.exports.win32 = n) + }.call(t, r(1))) + }, + function(e, t) { + "use strict" + e.exports = /^#!.*/ + }, + function(e, t) { + var r = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("") + ;(t.encode = function(e) { + if (e >= 0 && e < r.length) return r[e] + throw new TypeError("Must be between 0 and 63: " + e) + }), + (t.decode = function(e) { + var t = 65, + r = 90, + n = 97, + i = 122, + s = 48, + a = 57, + o = 43, + u = 47, + l = 26, + c = 52 + return e >= t && r >= e + ? e - t + : e >= n && i >= e + ? e - n + l + : e >= s && a >= e + ? e - s + c + : e == o + ? 62 + : e == u + ? 63 + : -1 + }) + }, + function(e, t) { + function r(e, n, i, s, a, o) { + var u = Math.floor((n - e) / 2) + e, + l = a(i, s[u], !0) + return 0 === l + ? u + : l > 0 + ? n - u > 1 + ? r(u, n, i, s, a, o) + : o == t.LEAST_UPPER_BOUND + ? n < s.length + ? n + : -1 + : u + : u - e > 1 + ? r(e, u, i, s, a, o) + : o == t.LEAST_UPPER_BOUND + ? u + : 0 > e + ? -1 + : e + } + ;(t.GREATEST_LOWER_BOUND = 1), + (t.LEAST_UPPER_BOUND = 2), + (t.search = function(e, n, i, s) { + if (0 === n.length) return -1 + var a = r(-1, n.length, e, n, i, s || t.GREATEST_LOWER_BOUND) + if (0 > a) return -1 + for (; a - 1 >= 0 && 0 === i(n[a], n[a - 1], !0); ) --a + return a + }) + }, + function(e, t, r) { + function n(e, t) { + var r = e.generatedLine, + n = t.generatedLine, + i = e.generatedColumn, + a = t.generatedColumn + return ( + n > r || + (n == r && a >= i) || + s.compareByGeneratedPositionsInflated(e, t) <= 0 + ) + } + function i() { + ;(this._array = []), + (this._sorted = !0), + (this._last = { generatedLine: -1, generatedColumn: 0 }) + } + var s = r(473) + ;(i.prototype.unsortedForEach = function(e, t) { + this._array.forEach(e, t) + }), + (i.prototype.add = function(e) { + n(this._last, e) + ? ((this._last = e), this._array.push(e)) + : ((this._sorted = !1), this._array.push(e)) + }), + (i.prototype.toArray = function() { + return ( + this._sorted || + (this._array.sort(s.compareByGeneratedPositionsInflated), + (this._sorted = !0)), + this._array + ) + }), + (t.MappingList = i) + }, + function(e, t) { + function r(e, t, r) { + var n = e[t] + ;(e[t] = e[r]), (e[r] = n) + } + function n(e, t) { + return Math.round(e + Math.random() * (t - e)) + } + function i(e, t, s, a) { + if (a > s) { + var o = n(s, a), + u = s - 1 + r(e, o, a) + for (var l = e[a], c = s; a > c; c++) + t(e[c], l) <= 0 && ((u += 1), r(e, u, c)) + r(e, u + 1, c) + var p = u + 1 + i(e, t, s, p - 1), i(e, t, p + 1, a) + } + } + t.quickSort = function(e, t) { + i(e, t, 0, e.length - 1) + } + }, + function(e, t, r) { + function n(e) { + var t = e + return ( + "string" == typeof e && (t = JSON.parse(e.replace(/^\)\]\}'/, ""))), + null != t.sections ? new a(t) : new i(t) + ) + } + function i(e) { + var t = e + "string" == typeof e && (t = JSON.parse(e.replace(/^\)\]\}'/, ""))) + var r = o.getArg(t, "version"), + n = o.getArg(t, "sources"), + i = o.getArg(t, "names", []), + s = o.getArg(t, "sourceRoot", null), + a = o.getArg(t, "sourcesContent", null), + u = o.getArg(t, "mappings"), + c = o.getArg(t, "file", null) + if (r != this._version) throw new Error("Unsupported version: " + r) + ;(n = n.map(o.normalize).map(function(e) { + return s && o.isAbsolute(s) && o.isAbsolute(e) ? o.relative(s, e) : e + })), + (this._names = l.fromArray(i, !0)), + (this._sources = l.fromArray(n, !0)), + (this.sourceRoot = s), + (this.sourcesContent = a), + (this._mappings = u), + (this.file = c) + } + function s() { + ;(this.generatedLine = 0), + (this.generatedColumn = 0), + (this.source = null), + (this.originalLine = null), + (this.originalColumn = null), + (this.name = null) + } + function a(e) { + var t = e + "string" == typeof e && (t = JSON.parse(e.replace(/^\)\]\}'/, ""))) + var r = o.getArg(t, "version"), + i = o.getArg(t, "sections") + if (r != this._version) throw new Error("Unsupported version: " + r) + ;(this._sources = new l()), (this._names = new l()) + var s = { line: -1, column: 0 } + this._sections = i.map(function(e) { + if (e.url) + throw new Error("Support for url field in sections not implemented.") + var t = o.getArg(e, "offset"), + r = o.getArg(t, "line"), + i = o.getArg(t, "column") + if (r < s.line || (r === s.line && i < s.column)) + throw new Error("Section offsets must be ordered and non-overlapping.") + return ( + (s = t), + { + generatedOffset: { generatedLine: r + 1, generatedColumn: i + 1 }, + consumer: new n(o.getArg(e, "map")) + } + ) + }) + } + var o = r(473), + u = r(2710), + l = r(1422).ArraySet, + c = r(1423), + p = r(2712).quickSort + ;(n.fromSourceMap = function(e) { + return i.fromSourceMap(e) + }), + (n.prototype._version = 3), + (n.prototype.__generatedMappings = null), + Object.defineProperty(n.prototype, "_generatedMappings", { + get: function() { + return ( + this.__generatedMappings || + this._parseMappings(this._mappings, this.sourceRoot), + this.__generatedMappings + ) + } + }), + (n.prototype.__originalMappings = null), + Object.defineProperty(n.prototype, "_originalMappings", { + get: function() { + return ( + this.__originalMappings || + this._parseMappings(this._mappings, this.sourceRoot), + this.__originalMappings + ) + } + }), + (n.prototype._charIsMappingSeparator = function(e, t) { + var r = e.charAt(t) + return ";" === r || "," === r + }), + (n.prototype._parseMappings = function(e, t) { + throw new Error("Subclasses must implement _parseMappings") + }), + (n.GENERATED_ORDER = 1), + (n.ORIGINAL_ORDER = 2), + (n.GREATEST_LOWER_BOUND = 1), + (n.LEAST_UPPER_BOUND = 2), + (n.prototype.eachMapping = function(e, t, r) { + var i, + s = t || null, + a = r || n.GENERATED_ORDER + switch (a) { + case n.GENERATED_ORDER: + i = this._generatedMappings + break + case n.ORIGINAL_ORDER: + i = this._originalMappings + break + default: + throw new Error("Unknown order of iteration.") + } + var u = this.sourceRoot + i.map(function(e) { + var t = null === e.source ? null : this._sources.at(e.source) + return ( + null != t && null != u && (t = o.join(u, t)), + { + source: t, + generatedLine: e.generatedLine, + generatedColumn: e.generatedColumn, + originalLine: e.originalLine, + originalColumn: e.originalColumn, + name: null === e.name ? null : this._names.at(e.name) + } + ) + }, this).forEach(e, s) + }), + (n.prototype.allGeneratedPositionsFor = function(e) { + var t = o.getArg(e, "line"), + r = { + source: o.getArg(e, "source"), + originalLine: t, + originalColumn: o.getArg(e, "column", 0) + } + if ( + (null != this.sourceRoot && + (r.source = o.relative(this.sourceRoot, r.source)), + !this._sources.has(r.source)) + ) + return [] + r.source = this._sources.indexOf(r.source) + var n = [], + i = this._findMapping( + r, + this._originalMappings, + "originalLine", + "originalColumn", + o.compareByOriginalPositions, + u.LEAST_UPPER_BOUND + ) + if (i >= 0) { + var s = this._originalMappings[i] + if (void 0 === e.column) + for (var a = s.originalLine; s && s.originalLine === a; ) + n.push({ + line: o.getArg(s, "generatedLine", null), + column: o.getArg(s, "generatedColumn", null), + lastColumn: o.getArg(s, "lastGeneratedColumn", null) + }), + (s = this._originalMappings[++i]) + else + for ( + var l = s.originalColumn; + s && s.originalLine === t && s.originalColumn == l; + + ) + n.push({ + line: o.getArg(s, "generatedLine", null), + column: o.getArg(s, "generatedColumn", null), + lastColumn: o.getArg(s, "lastGeneratedColumn", null) + }), + (s = this._originalMappings[++i]) + } + return n + }), + (t.SourceMapConsumer = n), + (i.prototype = Object.create(n.prototype)), + (i.prototype.consumer = n), + (i.fromSourceMap = function(e) { + var t = Object.create(i.prototype), + r = (t._names = l.fromArray(e._names.toArray(), !0)), + n = (t._sources = l.fromArray(e._sources.toArray(), !0)) + ;(t.sourceRoot = e._sourceRoot), + (t.sourcesContent = e._generateSourcesContent( + t._sources.toArray(), + t.sourceRoot + )), + (t.file = e._file) + for ( + var a = e._mappings.toArray().slice(), + u = (t.__generatedMappings = []), + c = (t.__originalMappings = []), + f = 0, + h = a.length; + h > f; + f++ + ) { + var d = a[f], + m = new s() + ;(m.generatedLine = d.generatedLine), + (m.generatedColumn = d.generatedColumn), + d.source && + ((m.source = n.indexOf(d.source)), + (m.originalLine = d.originalLine), + (m.originalColumn = d.originalColumn), + d.name && (m.name = r.indexOf(d.name)), + c.push(m)), + u.push(m) + } + return p(t.__originalMappings, o.compareByOriginalPositions), t + }), + (i.prototype._version = 3), + Object.defineProperty(i.prototype, "sources", { + get: function() { + return this._sources.toArray().map(function(e) { + return null != this.sourceRoot ? o.join(this.sourceRoot, e) : e + }, this) + } + }), + (i.prototype._parseMappings = function(e, t) { + for ( + var r, + n, + i, + a, + u, + l = 1, + f = 0, + h = 0, + d = 0, + m = 0, + y = 0, + v = e.length, + g = 0, + E = {}, + b = {}, + x = [], + A = []; + v > g; + + ) + if (";" === e.charAt(g)) l++, g++, (f = 0) + else if ("," === e.charAt(g)) g++ + else { + for ( + r = new s(), r.generatedLine = l, a = g; + v > a && !this._charIsMappingSeparator(e, a); + a++ + ); + if (((n = e.slice(g, a)), (i = E[n]))) g += n.length + else { + for (i = []; a > g; ) + c.decode(e, g, b), (u = b.value), (g = b.rest), i.push(u) + if (2 === i.length) + throw new Error("Found a source, but no line and column") + if (3 === i.length) + throw new Error("Found a source and line, but no column") + E[n] = i + } + ;(r.generatedColumn = f + i[0]), + (f = r.generatedColumn), + i.length > 1 && + ((r.source = m + i[1]), + (m += i[1]), + (r.originalLine = h + i[2]), + (h = r.originalLine), + (r.originalLine += 1), + (r.originalColumn = d + i[3]), + (d = r.originalColumn), + i.length > 4 && ((r.name = y + i[4]), (y += i[4]))), + A.push(r), + "number" == typeof r.originalLine && x.push(r) + } + p(A, o.compareByGeneratedPositionsDeflated), + (this.__generatedMappings = A), + p(x, o.compareByOriginalPositions), + (this.__originalMappings = x) + }), + (i.prototype._findMapping = function(e, t, r, n, i, s) { + if (e[r] <= 0) + throw new TypeError( + "Line must be greater than or equal to 1, got " + e[r] + ) + if (e[n] < 0) + throw new TypeError( + "Column must be greater than or equal to 0, got " + e[n] + ) + return u.search(e, t, i, s) + }), + (i.prototype.computeColumnSpans = function() { + for (var e = 0; e < this._generatedMappings.length; ++e) { + var t = this._generatedMappings[e] + if (e + 1 < this._generatedMappings.length) { + var r = this._generatedMappings[e + 1] + if (t.generatedLine === r.generatedLine) { + t.lastGeneratedColumn = r.generatedColumn - 1 + continue + } + } + t.lastGeneratedColumn = 1 / 0 + } + }), + (i.prototype.originalPositionFor = function(e) { + var t = { + generatedLine: o.getArg(e, "line"), + generatedColumn: o.getArg(e, "column") + }, + r = this._findMapping( + t, + this._generatedMappings, + "generatedLine", + "generatedColumn", + o.compareByGeneratedPositionsDeflated, + o.getArg(e, "bias", n.GREATEST_LOWER_BOUND) + ) + if (r >= 0) { + var i = this._generatedMappings[r] + if (i.generatedLine === t.generatedLine) { + var s = o.getArg(i, "source", null) + null !== s && + ((s = this._sources.at(s)), + null != this.sourceRoot && (s = o.join(this.sourceRoot, s))) + var a = o.getArg(i, "name", null) + return ( + null !== a && (a = this._names.at(a)), + { + source: s, + line: o.getArg(i, "originalLine", null), + column: o.getArg(i, "originalColumn", null), + name: a + } + ) + } + } + return { source: null, line: null, column: null, name: null } + }), + (i.prototype.hasContentsOfAllSources = function() { + return this.sourcesContent + ? this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function(e) { + return null == e + }) + : !1 + }), + (i.prototype.sourceContentFor = function(e, t) { + if (!this.sourcesContent) return null + if ( + (null != this.sourceRoot && (e = o.relative(this.sourceRoot, e)), + this._sources.has(e)) + ) + return this.sourcesContent[this._sources.indexOf(e)] + var r + if (null != this.sourceRoot && (r = o.urlParse(this.sourceRoot))) { + var n = e.replace(/^file:\/\//, "") + if ("file" == r.scheme && this._sources.has(n)) + return this.sourcesContent[this._sources.indexOf(n)] + if ((!r.path || "/" == r.path) && this._sources.has("/" + e)) + return this.sourcesContent[this._sources.indexOf("/" + e)] + } + if (t) return null + throw new Error('"' + e + '" is not in the SourceMap.') + }), + (i.prototype.generatedPositionFor = function(e) { + var t = o.getArg(e, "source") + if ( + (null != this.sourceRoot && (t = o.relative(this.sourceRoot, t)), + !this._sources.has(t)) + ) + return { line: null, column: null, lastColumn: null } + t = this._sources.indexOf(t) + var r = { + source: t, + originalLine: o.getArg(e, "line"), + originalColumn: o.getArg(e, "column") + }, + i = this._findMapping( + r, + this._originalMappings, + "originalLine", + "originalColumn", + o.compareByOriginalPositions, + o.getArg(e, "bias", n.GREATEST_LOWER_BOUND) + ) + if (i >= 0) { + var s = this._originalMappings[i] + if (s.source === r.source) + return { + line: o.getArg(s, "generatedLine", null), + column: o.getArg(s, "generatedColumn", null), + lastColumn: o.getArg(s, "lastGeneratedColumn", null) + } + } + return { line: null, column: null, lastColumn: null } + }), + (t.BasicSourceMapConsumer = i), + (a.prototype = Object.create(n.prototype)), + (a.prototype.constructor = n), + (a.prototype._version = 3), + Object.defineProperty(a.prototype, "sources", { + get: function() { + for (var e = [], t = 0; t < this._sections.length; t++) + for (var r = 0; r < this._sections[t].consumer.sources.length; r++) + e.push(this._sections[t].consumer.sources[r]) + return e + } + }), + (a.prototype.originalPositionFor = function(e) { + var t = { + generatedLine: o.getArg(e, "line"), + generatedColumn: o.getArg(e, "column") + }, + r = u.search(t, this._sections, function(e, t) { + var r = e.generatedLine - t.generatedOffset.generatedLine + return r ? r : e.generatedColumn - t.generatedOffset.generatedColumn + }), + n = this._sections[r] + return n + ? n.consumer.originalPositionFor({ + line: t.generatedLine - (n.generatedOffset.generatedLine - 1), + column: + t.generatedColumn - + (n.generatedOffset.generatedLine === t.generatedLine + ? n.generatedOffset.generatedColumn - 1 + : 0), + bias: e.bias + }) + : { source: null, line: null, column: null, name: null } + }), + (a.prototype.hasContentsOfAllSources = function() { + return this._sections.every(function(e) { + return e.consumer.hasContentsOfAllSources() + }) + }), + (a.prototype.sourceContentFor = function(e, t) { + for (var r = 0; r < this._sections.length; r++) { + var n = this._sections[r], + i = n.consumer.sourceContentFor(e, !0) + if (i) return i + } + if (t) return null + throw new Error('"' + e + '" is not in the SourceMap.') + }), + (a.prototype.generatedPositionFor = function(e) { + for (var t = 0; t < this._sections.length; t++) { + var r = this._sections[t] + if (-1 !== r.consumer.sources.indexOf(o.getArg(e, "source"))) { + var n = r.consumer.generatedPositionFor(e) + if (n) { + var i = { + line: n.line + (r.generatedOffset.generatedLine - 1), + column: + n.column + + (r.generatedOffset.generatedLine === n.line + ? r.generatedOffset.generatedColumn - 1 + : 0) + } + return i + } + } + } + return { line: null, column: null } + }), + (a.prototype._parseMappings = function(e, t) { + ;(this.__generatedMappings = []), (this.__originalMappings = []) + for (var r = 0; r < this._sections.length; r++) + for ( + var n = this._sections[r], i = n.consumer._generatedMappings, s = 0; + s < i.length; + s++ + ) { + var a = i[s], + u = n.consumer._sources.at(a.source) + null !== n.consumer.sourceRoot && + (u = o.join(n.consumer.sourceRoot, u)), + this._sources.add(u), + (u = this._sources.indexOf(u)) + var l = n.consumer._names.at(a.name) + this._names.add(l), (l = this._names.indexOf(l)) + var c = { + source: u, + generatedLine: + a.generatedLine + (n.generatedOffset.generatedLine - 1), + generatedColumn: + a.generatedColumn + + (n.generatedOffset.generatedLine === a.generatedLine + ? n.generatedOffset.generatedColumn - 1 + : 0), + originalLine: a.originalLine, + originalColumn: a.originalColumn, + name: l + } + this.__generatedMappings.push(c), + "number" == typeof c.originalLine && + this.__originalMappings.push(c) + } + p(this.__generatedMappings, o.compareByGeneratedPositionsDeflated), + p(this.__originalMappings, o.compareByOriginalPositions) + }), + (t.IndexedSourceMapConsumer = a) + }, + function(e, t, r) { + function n(e, t, r, n, i) { + ;(this.children = []), + (this.sourceContents = {}), + (this.line = null == e ? null : e), + (this.column = null == t ? null : t), + (this.source = null == r ? null : r), + (this.name = null == i ? null : i), + (this[u] = !0), + null != n && this.add(n) + } + var i = r(1424).SourceMapGenerator, + s = r(473), + a = /(\r?\n)/, + o = 10, + u = "$$$isSourceNode$$$" + ;(n.fromStringWithSourceMap = function(e, t, r) { + function i(e, t) { + if (null === e || void 0 === e.source) o.add(t) + else { + var i = r ? s.join(r, e.source) : e.source + o.add(new n(e.originalLine, e.originalColumn, i, t, e.name)) + } + } + var o = new n(), + u = e.split(a), + l = function() { + var e = u.shift(), + t = u.shift() || "" + return e + t + }, + c = 1, + p = 0, + f = null + return ( + t.eachMapping(function(e) { + if (null !== f) { + if (!(c < e.generatedLine)) { + var t = u[0], + r = t.substr(0, e.generatedColumn - p) + return ( + (u[0] = t.substr(e.generatedColumn - p)), + (p = e.generatedColumn), + i(f, r), + void (f = e) + ) + } + i(f, l()), c++, (p = 0) + } + for (; c < e.generatedLine; ) o.add(l()), c++ + if (p < e.generatedColumn) { + var t = u[0] + o.add(t.substr(0, e.generatedColumn)), + (u[0] = t.substr(e.generatedColumn)), + (p = e.generatedColumn) + } + f = e + }, this), + u.length > 0 && (f && i(f, l()), o.add(u.join(""))), + t.sources.forEach(function(e) { + var n = t.sourceContentFor(e) + null != n && (null != r && (e = s.join(r, e)), o.setSourceContent(e, n)) + }), + o + ) + }), + (n.prototype.add = function(e) { + if (Array.isArray(e)) + e.forEach(function(e) { + this.add(e) + }, this) + else { + if (!e[u] && "string" != typeof e) + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + + e + ) + e && this.children.push(e) + } + return this + }), + (n.prototype.prepend = function(e) { + if (Array.isArray(e)) + for (var t = e.length - 1; t >= 0; t--) this.prepend(e[t]) + else { + if (!e[u] && "string" != typeof e) + throw new TypeError( + "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + + e + ) + this.children.unshift(e) + } + return this + }), + (n.prototype.walk = function(e) { + for (var t, r = 0, n = this.children.length; n > r; r++) + (t = this.children[r]), + t[u] + ? t.walk(e) + : "" !== t && + e(t, { + source: this.source, + line: this.line, + column: this.column, + name: this.name + }) + }), + (n.prototype.join = function(e) { + var t, + r, + n = this.children.length + if (n > 0) { + for (t = [], r = 0; n - 1 > r; r++) t.push(this.children[r]), t.push(e) + t.push(this.children[r]), (this.children = t) + } + return this + }), + (n.prototype.replaceRight = function(e, t) { + var r = this.children[this.children.length - 1] + return ( + r[u] + ? r.replaceRight(e, t) + : "string" == typeof r + ? (this.children[this.children.length - 1] = r.replace(e, t)) + : this.children.push("".replace(e, t)), + this + ) + }), + (n.prototype.setSourceContent = function(e, t) { + this.sourceContents[s.toSetString(e)] = t + }), + (n.prototype.walkSourceContents = function(e) { + for (var t = 0, r = this.children.length; r > t; t++) + this.children[t][u] && this.children[t].walkSourceContents(e) + for ( + var n = Object.keys(this.sourceContents), t = 0, r = n.length; + r > t; + t++ + ) + e(s.fromSetString(n[t]), this.sourceContents[n[t]]) + }), + (n.prototype.toString = function() { + var e = "" + return ( + this.walk(function(t) { + e += t + }), + e + ) + }), + (n.prototype.toStringWithSourceMap = function(e) { + var t = { code: "", line: 1, column: 0 }, + r = new i(e), + n = !1, + s = null, + a = null, + u = null, + l = null + return ( + this.walk(function(e, i) { + ;(t.code += e), + null !== i.source && null !== i.line && null !== i.column + ? ((s === i.source && + a === i.line && + u === i.column && + l === i.name) || + r.addMapping({ + source: i.source, + original: { line: i.line, column: i.column }, + generated: { line: t.line, column: t.column }, + name: i.name + }), + (s = i.source), + (a = i.line), + (u = i.column), + (l = i.name), + (n = !0)) + : n && + (r.addMapping({ + generated: { line: t.line, column: t.column } + }), + (s = null), + (n = !1)) + for (var c = 0, p = e.length; p > c; c++) + e.charCodeAt(c) === o + ? (t.line++, + (t.column = 0), + c + 1 === p + ? ((s = null), (n = !1)) + : n && + r.addMapping({ + source: i.source, + original: { line: i.line, column: i.column }, + generated: { line: t.line, column: t.column }, + name: i.name + })) + : t.column++ + }), + this.walkSourceContents(function(e, t) { + r.setSourceContent(e, t) + }), + { code: t.code, map: r } + ) + }), + (t.SourceNode = n) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + pre: function(e) { + e.set("helpersNamespace", t.identifier("babelHelpers")) + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + manipulateOptions: function(e, t) { + t.plugins.push("asyncGenerators") + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { inherits: r(567) } + }), + (e.exports = t["default"]) + }, + [7496, 2892, 48, 29, 2719, 1436, 33], + [7497, 48, 29, 2720, 1436, 33], + [7498, 29, 33], + 810, + 1397, + 1398, + 1399, + 812, + [7438, 828], + [7441, 2724, 2725, 1437, 2730, 2739, 2740, 2741, 376, 377], + 1402, + [7443, 2737], + [7445, 2729, 828], + [7446, 826], + 1409, + 1410, + 815, + 2673, + [7458, 1438, 2742, 2723], + [7460, 826], + [7466, 2732], + 2688, + [7469, 2735], + 2690, + [7471, 824, 568, 377], + [7472, 376, 826], + [7474, 827, 376, 568, 474, 2751], + [7476, 2734, 376], + [7478, 2727, 1438], + [7481, 377], + [7482, 2747, 825], + [7488, 2726, 1437, 2736], + [7490, 2731, 2733, 827, 376, 568, 2743, 474, 2722, 2745], + [7492, 827, 376, 568, 474, 377], + 1420, + [7394, 311, 186, 48, 29, 310, 33], + [7397, 29, 48, 33, 310], + 2609, + [7398, 186, 48, 378], + [7399, 29, 33], + 2612, + [7400, 48, 29, 310, 33], + [7402, 29, 2762, 33], + [7403, 29, 33], + [7404, 29, 1471, 33, 2761], + [7405, 48, 29, 831, 33], + [7406, 311, 29, 33], + 2619, + [7408, 186, 48, 29, 1441, 2764, 310, 33], + [7409, 2765], + [7410, 48, 29, 2771, 378, 310, 2789, 33], + [7413, 311, 48, 29, 1443, 33], + [7414, 840, 186, 29, 48, 1442, 830, 33, 2816], + [7317, 48, 2787, 1453, 2786, 2785, 2772], + [7318, 2777, 2773, 2780, 2778, 2782], + [7319, 2775], + 2516, + [7321, 1444, 2776], + [7322, 1444], + 2519, + [7323, 2779], + 2521, + [7324, 2781], + 2521, + 2524, + 2525, + [7325, 1445], + [7326, 2783, 1445, 2784], + 2528, + [7327, 2788], + 2530, + 810, + [7431, 2791], + [7432, 2792], + 2648, + [7415, 7280], + 2626, + 1399, + 812, + 2659, + [7438, 571], + [7441, 2795, 2796, 1447, 2802, 2811, 2812, 2813, 570, 379], + 1402, + [7443, 2808], + [7445, 2801, 571], + [7447, 2810], + 1409, + 2672, + 2673, + [7458, 1448, 834, 1446], + [7460, 2815], + [7462, 1446], + 2687, + 2688, + [7469, 2806], + 2690, + [7474, 1451, 570, 833, 475, 2821], + [7475, 379], + [7477, 2799, 1448, 834], + [7481, 379], + [7482, 2817, 569], + [7486, 569], + [7489, 1452, 2797, 2809], + [7492, 1451, 570, 833, 475, 379], + [7494, 2805, 571], + 1420, + [7329, 2825], + 2533, + [7417, 2891, 48, 29, 2884, 2883, 2885, 2886, 378, 33], + [7418, 29, 48, 33, 835, 182], + [7419, 48, 182], + [7420, 48, 182], + [7421, 48, 182], + [7423, 182, 2827, 2828, 2830, 2832, 2833, 2829], + [7424, 48, 182], + [7425, 48, 182], + [7426, 29, 33], + [7428, 29, 33], + [7430, 48, 29, 1454, 2839, 33, 835], + 2525, + [7325, 1455], + [7326, 2837, 1455, 2838], + 2650, + 1397, + [7433, 2849, 2862, 1463, 2879], + [7434, 2844], + [7435, 1456, 2852, 2869], + [7437, 2865, 572], + 1399, + 2658, + [7439, 2851, 573], + [7440, 2857, 2858, 836, 1468, 2889], + [7441, 2846, 1456, 2848, 1458, 2875, 2876, 2877, 185, 121], + 1402, + [7442, 1458, 2866], + [7444, 1457, 1467], + [7447, 2874], + [7449, 2870, 2871, 2872, 185, 2887], + [7450, 1460, 184], + [7451, 2856, 2873, 184], + [7452, 1459, 1460, 2860, 185, 1464, 1465, 2841, 184, 1466], + [7453, 1459, 1466], + 1410, + 815, + [7454, 2854, 2864, 2868], + 2673, + [7456, 121], + [7457, 121], + [7459, 1462, 380, 184], + [7460, 184], + [7461, 2845, 572], + [7463, 836, 185], + [7464, 2847], + 2683, + [7465, 573], + [7467, 1465, 2888], + 2687, + 2688, + [7469, 2863], + 2690, + [7474, 839, 185, 838, 380, 1467], + 2692, + [7477, 2850, 836, 1463], + [7481, 121], + [7482, 2881, 183], + [7483, 183], + [7484, 2853, 839, 183], + [7485, 121], + [7486, 183], + [7487, 380, 183], + [7493, 573, 184], + [7495, 1461, 2859, 1464], + 2644, + [7332, 2901], + [7333, 2902], + [7336, 2905], + [7337, 2906], + [7338, 2907], + [7342, 2909], + [7343, 1470], + [7344, 2894, 2893, 1470], + 1937, + [7346, 2934, 2933, 2925], + [7347, 2927], + [7348, 2928, 157], + [7349, 95], + [7350, 95], + [7351, 95, 2929], + [7352, 95, 2930], + [7353, 849, 157], + [7354, 2931, 157], + [7356, 849, 157], + [7357, 849, 2932, 157], + 2581, + 2582, + [7359, 842, 381], + [7360, 2911], + [7362, 95], + [7367, 842], + 559, + [7368, 95, 847, 848, 845, 381], + 1379, + [7370, 95, 477], + [7371, 95, 1480, 1475, 574], + [7377, 2923, 843], + 1384, + [7381, 2913, 381, 576, 157], + [7382, 1472, 2924, 157], + [7383, 2912, 2919, 576, 477, 1476], + [7384, 476], + [7385, 476, 2921], + [7386, 477, 846], + [7387, 846, 1474], + [7388, 1480, 846], + 373, + [7390, 2922, 1476], + [7392, 2926, 576], + function(e, t, r) { + "use strict" + var n = r(17)["default"] + t.__esModule = !0 + var i = r(2936), + s = n(i) + ;(t["default"] = function() { + return { + inherits: r(567), + visitor: { + Function: function(e, t) { + e.node.async && + !e.node.generator && + s["default"](e, t.addImport(t.opts.module, t.opts.method)) + } + } + } + }), + (e.exports = t["default"]) + }, + [7496, 3045, 17, 6, 2937, 1482, 11], + [7497, 17, 6, 2938, 1482, 11], + [7498, 6, 11], + 810, + 1397, + 1398, + 1399, + 812, + [7438, 854], + [7441, 2942, 2943, 1483, 2948, 2957, 2958, 2959, 382, 383], + 1402, + [7443, 2955], + [7445, 2947, 854], + [7446, 852], + 1409, + 1410, + 815, + 2673, + [7458, 1484, 2960, 2941], + [7460, 852], + [7466, 2950], + 2688, + [7469, 2953], + 2690, + [7471, 850, 577, 383], + [7472, 382, 852], + [7474, 853, 382, 577, 478, 2969], + [7476, 2952, 382], + [7478, 2945, 1484], + [7481, 383], + [7482, 2965, 851], + [7488, 2944, 1483, 2954], + [7490, 2949, 2951, 853, 382, 577, 2961, 478, 2940, 2963], + [7492, 853, 382, 577, 478, 383], + 1420, + [7394, 86, 85, 17, 6, 312, 11], + [7397, 6, 17, 11, 312], + 2609, + [7398, 85, 17, 479], + [7399, 6, 11], + 2612, + [7400, 17, 6, 312, 11], + [7402, 6, 2980, 11], + [7403, 6, 11], + [7404, 6, 581, 11, 2979], + [7405, 17, 6, 857, 11], + [7406, 86, 6, 11], + 2619, + [7408, 85, 17, 6, 1487, 2982, 312, 11], + [7409, 2983], + [7410, 17, 6, 2989, 479, 312, 3007, 11], + [7413, 86, 17, 6, 1489, 11], + [7414, 481, 85, 6, 17, 1488, 856, 11, 3034], + [7317, 17, 3005, 1499, 3004, 3003, 2990], + [7318, 2995, 2991, 2998, 2996, 3e3], + [7319, 2993], + 2516, + [7321, 1490, 2994], + [7322, 1490], + 2519, + [7323, 2997], + 2521, + [7324, 2999], + 2521, + 2524, + 2525, + [7325, 1491], + [7326, 3001, 1491, 3002], + 2528, + [7327, 3006], + 2530, + 810, + [7431, 3009], + [7432, 3010], + 2648, + [7415, 7281], + 2626, + 1399, + 812, + 2659, + [7438, 580], + [7441, 3013, 3014, 1493, 3020, 3029, 3030, 3031, 579, 384], + 1402, + [7443, 3026], + [7445, 3019, 580], + [7447, 3028], + 1409, + 2672, + 2673, + [7458, 1494, 860, 1492], + [7460, 3033], + [7462, 1492], + 2687, + 2688, + [7469, 3024], + 2690, + [7474, 1497, 579, 859, 480, 3039], + [7475, 384], + [7477, 3017, 1494, 860], + [7481, 384], + [7482, 3035, 578], + [7486, 578], + [7489, 1498, 3015, 3027], + [7492, 1497, 579, 859, 480, 384], + [7494, 3023, 580], + 1420, + [7329, 3043], + 2533, + [7332, 3052], + [7333, 3053], + [7336, 3056], + [7337, 3057], + [7342, 3060], + [7344, 3047, 3046, 1500], + 1937, + [7346, 3085, 3084, 3076], + [7347, 3078], + [7348, 3079, 158], + [7349, 96], + [7350, 96], + [7351, 96, 3080], + [7352, 96, 3081], + [7353, 869, 158], + [7354, 3082, 158], + [7356, 869, 158], + [7357, 869, 3083, 158], + 2581, + 2582, + [7359, 862, 385], + [7360, 3062], + [7362, 96], + [7367, 862], + 559, + [7368, 96, 867, 868, 865, 385], + 1379, + [7370, 96, 484], + [7371, 96, 1511, 1506, 582], + [7377, 3074, 863], + 1384, + [7381, 3064, 385, 584, 158], + [7382, 1503, 3075, 158], + [7383, 3063, 3070, 584, 484, 1507], + [7384, 483], + [7385, 483, 3072], + [7386, 484, 866], + [7387, 866, 1505], + [7388, 1511, 866], + 373, + [7390, 3073, 1507], + [7392, 3077, 584], + [7417, 3044, 17, 6, 3186, 3185, 3187, 1535, 485, 11], + [7418, 6, 17, 11, 870, 187], + [7419, 17, 187], + [7420, 17, 187], + [7421, 17, 187], + [7423, 187, 3087, 3088, 3090, 3092, 3093, 3089], + [7424, 17, 187], + [7425, 17, 187], + [7426, 6, 11], + [7428, 6, 11], + [7430, 17, 6, 1513, 1521, 11, 870], + [7394, 86, 85, 17, 6, 313, 11], + [7397, 6, 17, 11, 313], + 2609, + [7398, 85, 17, 485], + [7399, 6, 11], + 2612, + [7400, 17, 6, 313, 11], + [7402, 6, 3106, 11], + [7403, 6, 11], + [7404, 6, 581, 11, 3105], + [7405, 17, 6, 873, 11], + [7406, 86, 6, 11], + 2619, + [7408, 85, 17, 6, 1515, 3108, 313, 11], + [7409, 3109], + [7410, 17, 6, 3115, 485, 313, 3130, 11], + [7413, 86, 17, 6, 1517, 11], + [7414, 481, 85, 6, 17, 1516, 872, 11, 1534], + [7317, 17, 3128, 1519, 3127, 1521, 3116], + [7318, 3121, 3117, 3124, 3122, 3126], + [7319, 3119], + 2516, + [7321, 1518, 3120], + [7322, 1518], + 2519, + [7323, 3123], + 2521, + [7324, 3125], + 2521, + 2524, + 2528, + [7327, 3129], + 2530, + 810, + [7431, 3132], + [7432, 3133], + 2648, + [7415, 7282], + 2626, + [7329, 3137], + 2533, + 2525, + [7325, 1520], + 2650, + 1397, + [7433, 3150, 3162, 587, 3182], + [7434, 3144], + [7435, 1523, 3153, 3172], + [7437, 3166, 586], + 1399, + 2658, + 2659, + [7438, 386], + [7440, 3157, 3158, 585, 1538, 3192], + [7441, 3146, 1523, 1524, 1526, 3178, 3179, 3180, 159, 122], + 1402, + [7442, 1526, 3168], + [7444, 1525, 1537], + [7449, 3173, 3174, 3175, 159, 3188], + [7450, 1529, 189], + [7451, 3156, 3176, 189], + [7452, 1527, 1529, 3160, 159, 1531, 1532, 3141, 189, 1533], + [7453, 1527, 1533], + 1410, + 815, + [7454, 1528, 3165, 3170], + 2672, + 2673, + [7456, 122], + [7457, 122], + [7458, 585, 587, 1522], + [7459, 874, 314, 189], + [7460, 189], + [7461, 3145, 586], + [7462, 1522], + [7463, 585, 159], + [7464, 3147], + 2683, + [7465, 386], + [7467, 1532, 3190], + 2687, + 2688, + [7469, 3164], + 2690, + [7474, 877, 159, 876, 314, 1537], + 2692, + [7481, 122], + [7482, 3183, 188], + [7483, 188], + [7484, 3154, 877, 188], + [7485, 122], + [7487, 314, 188], + [7489, 1536, 3148, 3171], + [7493, 386, 189], + [7494, 3163, 386], + [7495, 1530, 3159, 1531], + 2644, + [7332, 3203], + [7336, 3206], + [7337, 3207], + [7338, 3208], + [7342, 3210], + [7343, 1541], + [7344, 3196, 3195, 1541], + 1937, + [7346, 3235, 3234, 3227], + [7347, 3229], + [7349, 100], + [7350, 100], + [7351, 100, 3230], + [7352, 100, 3231], + [7353, 887, 191], + [7354, 3232, 191], + [7356, 887, 191], + [7357, 887, 3233, 191], + 2581, + 2582, + [7359, 879, 387], + [7360, 3212], + [7362, 100], + [7366, 879], + [7367, 879], + 559, + [7368, 100, 885, 886, 883, 387], + 1379, + [7370, 100, 486], + [7377, 3224, 880], + 1384, + [7379, 880], + [7381, 3214, 387, 591, 191], + [7382, 1543, 3226, 191], + [7383, 3213, 3221, 591, 486, 1546], + [7384, 589], + [7386, 486, 884], + [7387, 884, 1545], + [7388, 3225, 884], + 373, + [7390, 3223, 1546], + [7392, 3228, 591], + [7393, 588, 66, 38, 3335, 897, 3343, 388, 1560, 54], + [7394, 315, 190, 66, 38, 316, 54], + [7397, 38, 66, 54, 316], + 2609, + [7398, 190, 66, 388], + [7399, 38, 54], + 2612, + [7400, 66, 38, 316, 54], + [7402, 38, 3246, 54], + [7403, 38, 54], + [7404, 38, 1542, 54, 3245], + [7405, 66, 38, 891, 54], + [7406, 315, 38, 54], + 2619, + [7408, 190, 66, 38, 1552, 3248, 316, 54], + [7409, 3249], + [7410, 66, 38, 3255, 388, 316, 1560, 54], + [7413, 315, 66, 38, 1554, 54], + [7414, 878, 190, 38, 66, 1553, 889, 54, 1573], + [7317, 66, 3271, 1557, 3270, 3269, 3256], + [7318, 3261, 3257, 3264, 3262, 3266], + [7319, 3259], + 2516, + [7321, 1555, 3260], + [7322, 1555], + 2519, + [7323, 3263], + 2521, + [7324, 3265], + 2521, + 2524, + 2525, + [7325, 1556], + [7326, 3267, 1556, 3268], + 2528, + [7327, 3272], + 2530, + [7431, 3274], + [7432, 3275], + 2648, + [7415, 7283], + 2626, + [7329, 3279], + 2533, + [7417, 3194, 66, 38, 3339, 3338, 3340, 1574, 388, 54], + [7418, 38, 66, 54, 890, 192], + [7419, 66, 192], + [7420, 66, 192], + [7421, 66, 192], + [7423, 192, 3281, 3282, 3284, 3286, 3287, 3283], + [7424, 66, 192], + [7425, 66, 192], + [7426, 38, 54], + [7428, 38, 54], + [7430, 66, 38, 1558, 3293, 54, 890], + 2525, + [7325, 1559], + [7326, 3291, 1559, 3292], + 2644, + 2650, + [7433, 3304, 3314, 594, 3334], + [7434, 3298], + [7435, 1563, 3306, 3324], + [7437, 3318, 592], + 1399, + 2658, + 2659, + [7438, 389], + [7440, 3310, 3311, 487, 1576, 3346], + 1402, + [7442, 1567, 3320], + [7444, 1566, 1575], + [7449, 3325, 3326, 3327, 149, 3341], + [7450, 1569, 195], + [7451, 3309, 3328, 195], + [7452, 892, 1569, 1571, 149, 895, 1572, 1561, 195, 896], + [7453, 892, 896], + 815, + [7454, 1568, 3317, 3322], + 2672, + 2673, + [7456, 123], + [7457, 123], + [7458, 487, 594, 1562], + [7459, 893, 193, 195], + [7460, 195], + [7461, 3299, 592], + [7462, 1562], + [7463, 487, 149], + [7464, 3301], + 2683, + [7465, 389], + [7467, 1572, 3344], + 2687, + 2688, + [7469, 3316], + 2690, + [7474, 595, 149, 593, 193, 1575], + 2692, + [7478, 1565, 487], + [7481, 123], + [7482, 3336, 194], + [7483, 194], + [7484, 3307, 595, 194], + [7485, 123], + [7487, 193, 194], + [7489, 897, 3302, 3323], + [7490, 892, 1571, 595, 149, 593, 895, 193, 1561, 896], + [7493, 389, 195], + [7494, 3315, 389], + [7495, 1570, 3312, 895], + [7331, 3348], + [7346, 3372, 3371, 3369], + 2581, + 2582, + [7358, 3358], + [7359, 1578, 488], + [7360, 3349], + [7361, 3356], + [7363, 899, 898, 3353], + 465, + [7366, 1578], + 559, + [7368, 597, 1582, 1583, 900, 488], + 1379, + 1380, + [7373, 900], + [7376, 899], + [7377, 3365, 1579], + 1384, + [7378, 3357, 1579], + 805, + [7381, 3352, 488, 596, 898], + [7382, 3351, 3368, 898], + [7383, 3350, 3360, 596, 3366, 1581], + [7390, 3364, 1581], + [7392, 3370, 596], + function(e, t, r) { + "use strict" + function n(e) { + return e && e.__esModule ? e : { default: e } + } + Object.defineProperty(t, "__esModule", { value: !0 }), + (t["default"] = function(e) { + function t(e, t) { + if (!t.applyDecoratedDescriptor) { + t.applyDecoratedDescriptor = e.scope.generateUidIdentifier( + "applyDecoratedDescriptor" + ) + var r = f({ NAME: t.applyDecoratedDescriptor }) + e.scope.getProgramParent().path.unshiftContainer("body", r) + } + return t.applyDecoratedDescriptor + } + function n(e, t) { + if (!t.initializerDefineProp) { + t.initializerDefineProp = e.scope.generateUidIdentifier( + "initDefineProp" + ) + var r = p({ NAME: t.initializerDefineProp }) + e.scope.getProgramParent().path.unshiftContainer("body", r) + } + return t.initializerDefineProp + } + function i(e, t) { + if (!t.initializerWarningHelper) { + t.initializerWarningHelper = e.scope.generateUidIdentifier( + "initializerWarningHelper" + ) + var r = c({ NAME: t.initializerWarningHelper }) + e.scope.getProgramParent().path.unshiftContainer("body", r) + } + return t.initializerWarningHelper + } + function s(e) { + var t = (e.isClass() + ? [e].concat(e.get("body.body")) + : e.get("properties") + ).reduce(function(e, t) { + return e.concat(t.node.decorators || []) + }, []), + r = t.filter(function(e) { + return !v.isIdentifier(e.expression) + }) + return 0 !== r.length + ? v.sequenceExpression( + r + .map(function(t) { + var r = t.expression, + n = (t.expression = e.scope.generateDeclaredUidIdentifier( + "dec" + )) + return v.assignmentExpression("=", n, r) + }) + .concat([e.node]) + ) + : void 0 + } + function h(e, t) { + var r = e.node.decorators || [] + if (((e.node.decorators = null), 0 !== r.length)) { + var n = e.scope.generateDeclaredUidIdentifier("class") + return r + .map(function(e) { + return e.expression + }) + .reverse() + .reduce(function(e, t) { + return a({ + CLASS_REF: n, + DECORATOR: t, + INNER: e + }).expression + }, e.node) + } + } + function d(e, t) { + var r = e.node.body.body.some(function(e) { + return (e.decorators || []).length > 0 + }) + if (r) return y(e, t, e.node.body.body) + } + function m(e, t) { + var r = e.node.properties.some(function(e) { + return (e.decorators || []).length > 0 + }) + if (r) return y(e, t, e.node.properties) + } + function y(e, r, n) { + var s = (e.scope.generateDeclaredUidIdentifier("desc"), + e.scope.generateDeclaredUidIdentifier("value"), + e.scope.generateDeclaredUidIdentifier( + e.isClass() ? "class" : "obj" + )), + a = n.reduce(function(n, a) { + var c = a.decorators || [] + if (((a.decorators = null), 0 === c.length)) return n + if (a.computed) + throw e.buildCodeFrameError( + "Computed method/property decorators are not yet supported." + ) + var p = v.isLiteral(a.key) + ? a.key + : v.stringLiteral(a.key.name), + f = + e.isClass() && !a["static"] + ? o({ CLASS_REF: s }).expression + : s + if (v.isClassProperty(a, { static: !1 })) { + var h = e.scope.generateDeclaredUidIdentifier("descriptor"), + d = a.value + ? v.functionExpression( + null, + [], + v.blockStatement([v.returnStatement(a.value)]) + ) + : v.nullLiteral() + ;(a.value = v.callExpression(i(e, r), [ + h, + v.thisExpression() + ])), + (n = n.concat([ + v.assignmentExpression( + "=", + h, + v.callExpression(t(e, r), [ + f, + p, + v.arrayExpression( + c.map(function(e) { + return e.expression + }) + ), + v.objectExpression([ + v.objectProperty( + v.identifier("enumerable"), + v.booleanLiteral(!0) + ), + v.objectProperty( + v.identifier("initializer"), + d + ) + ]) + ]) + ) + ])) + } else + n = n.concat( + v.callExpression(t(e, r), [ + f, + p, + v.arrayExpression( + c.map(function(e) { + return e.expression + }) + ), + v.isObjectProperty(a) || + v.isClassProperty(a, { static: !0 }) + ? l({ + TEMP: e.scope.generateDeclaredUidIdentifier( + "init" + ), + TARGET: f, + PROPERTY: p + }).expression + : u({ TARGET: f, PROPERTY: p }).expression, + f + ]) + ) + return n + }, []) + return v.sequenceExpression([ + v.assignmentExpression("=", s, e.node), + v.sequenceExpression(a), + s + ]) + } + var v = e.types + return { + inherits: r(3374), + visitor: { + ExportDefaultDeclaration: function(e) { + if (e.get("declaration").isClassDeclaration()) { + var t = e.node, + r = + t.declaration.id || + e.scope.generateUidIdentifier("default") + ;(t.declaration.id = r), + e.replaceWith(t.declaration), + e.insertAfter( + v.exportNamedDeclaration(null, [ + v.exportSpecifier(r, v.identifier("default")) + ]) + ) + } + }, + ClassDeclaration: function(e) { + var t = e.node, + r = t.id || e.scope.generateUidIdentifier("class") + e.replaceWith( + v.variableDeclaration("let", [ + v.variableDeclarator(r, v.toExpression(t)) + ]) + ) + }, + ClassExpression: function(e, t) { + var r = s(e) || h(e, t) || d(e, t) + r && e.replaceWith(r) + }, + ObjectExpression: function(e, t) { + var r = s(e) || m(e, t) + r && e.replaceWith(r) + }, + AssignmentExpression: function(e, t) { + t.initializerWarningHelper && + e.get("left").isMemberExpression() && + e.get("left.property").isIdentifier() && + e.get("right").isCallExpression() && + e + .get("right.callee") + .isIdentifier({ + name: t.initializerWarningHelper.name + }) && + e.replaceWith( + v.callExpression(n(e, t), [ + e.get("left.object").node, + v.stringLiteral(e.get("left.property").node.name), + e.get("right.arguments")[0].node, + e.get("right.arguments")[1].node + ]) + ) + } + } + } + }) + var i = r(3375), + s = n(i), + a = (0, s["default"])("\n DECORATOR(CLASS_REF = INNER) || CLASS_REF;\n"), + o = (0, s["default"])("\n CLASS_REF.prototype;\n"), + u = (0, s["default"])( + "\n Object.getOwnPropertyDescriptor(TARGET, PROPERTY);\n" + ), + l = (0, s["default"])( + "\n (TEMP = Object.getOwnPropertyDescriptor(TARGET, PROPERTY), (TEMP = TEMP ? TEMP.value : undefined), {\n enumerable: true,\n configurable: true,\n writable: true,\n initializer: function(){\n return TEMP;\n }\n })\n" + ), + c = (0, s["default"])( + "\n function NAME(descriptor, context){\n throw new Error('Decorating class property failed. Please ensure that transform-class-properties is enabled.');\n }\n" + ), + p = (0, s["default"])( + "\n function NAME(target, property, descriptor, context){\n if (!descriptor) return;\n\n Object.defineProperty(target, property, {\n enumerable: descriptor.enumerable,\n configurable: descriptor.configurable,\n writable: descriptor.writable,\n value: descriptor.initializer ? descriptor.initializer.call(context) : void 0,\n });\n }\n" + ), + f = (0, s["default"])( + "\n function NAME(target, property, decorators, descriptor, context){\n var desc = {};\n Object['ke' + 'ys'](descriptor).forEach(function(key){\n desc[key] = descriptor[key];\n });\n desc.enumerable = !!desc.enumerable;\n desc.configurable = !!desc.configurable;\n if ('value' in desc || desc.initializer){\n desc.writable = true;\n }\n\n desc = decorators.slice().reverse().reduce(function(desc, decorator){\n return decorator(target, property, desc) || desc;\n }, desc);\n\n if (context && desc.initializer !== void 0){\n desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n desc.initializer = undefined;\n }\n\n if (desc.initializer === void 0){\n // This is a hack to avoid this being processed by 'transform-runtime'.\n // See issue #9.\n Object['define' + 'Property'](target, property, desc);\n desc = null;\n }\n\n return desc;\n }\n" + ) + }, + 1428, + [7393, 902, 73, 39, 3516, 921, 3524, 391, 1604, 55], + [7332, 3385], + [7336, 3388], + [7337, 3389], + [7338, 3390], + [7342, 3392], + [7343, 1585], + [7344, 3378, 3377, 1585], + 1937, + [7346, 3417, 3416, 3409], + [7347, 3411], + [7349, 101], + [7350, 101], + [7351, 101, 3412], + [7352, 101, 3413], + [7353, 911, 197], + [7354, 3414, 197], + [7356, 911, 197], + [7357, 911, 3415, 197], + 2581, + 2582, + [7359, 903, 390], + [7360, 3394], + [7362, 101], + [7366, 903], + [7367, 903], + 559, + [7368, 101, 909, 910, 907, 390], + 1379, + [7370, 101, 489], + [7377, 3406, 904], + 1384, + [7379, 904], + [7381, 3396, 390, 600, 197], + [7382, 1587, 3408, 197], + [7383, 3395, 3403, 600, 489, 1590], + [7384, 598], + [7386, 489, 908], + [7387, 908, 1589], + [7388, 3407, 908], + 373, + [7390, 3405, 1590], + [7392, 3410, 600], + [7394, 317, 196, 73, 39, 318, 55], + [7397, 39, 73, 55, 318], + 2609, + [7398, 196, 73, 391], + [7399, 39, 55], + 2612, + [7400, 73, 39, 318, 55], + [7402, 39, 3427, 55], + [7403, 39, 55], + [7404, 39, 1586, 55, 3426], + [7405, 73, 39, 915, 55], + [7406, 317, 39, 55], + 2619, + [7408, 196, 73, 39, 1596, 3429, 318, 55], + [7409, 3430], + [7410, 73, 39, 3436, 391, 318, 1604, 55], + [7413, 317, 73, 39, 1598, 55], + [7414, 901, 196, 39, 73, 1597, 913, 55, 1617], + [7317, 73, 3452, 1601, 3451, 3450, 3437], + [7318, 3442, 3438, 3445, 3443, 3447], + [7319, 3440], + 2516, + [7321, 1599, 3441], + [7322, 1599], + 2519, + [7323, 3444], + 2521, + [7324, 3446], + 2521, + 2524, + 2525, + [7325, 1600], + [7326, 3448, 1600, 3449], + 2528, + [7327, 3453], + 2530, + [7431, 3455], + [7432, 3456], + 2648, + [7415, 7284], + 2626, + [7329, 3460], + 2533, + [7417, 3376, 73, 39, 3520, 3519, 3521, 1618, 391, 55], + [7418, 39, 73, 55, 914, 198], + [7419, 73, 198], + [7420, 73, 198], + [7421, 73, 198], + [7423, 198, 3462, 3463, 3465, 3467, 3468, 3464], + [7424, 73, 198], + [7425, 73, 198], + [7426, 39, 55], + [7428, 39, 55], + [7430, 73, 39, 1602, 3474, 55, 914], + 2525, + [7325, 1603], + [7326, 3472, 1603, 3473], + 2644, + 2650, + [7433, 3485, 3495, 603, 3515], + [7434, 3479], + [7435, 1607, 3487, 3505], + [7437, 3499, 601], + 1399, + 2658, + 2659, + [7438, 392], + [7440, 3491, 3492, 490, 1620, 3527], + 1402, + [7442, 1611, 3501], + [7444, 1610, 1619], + [7449, 3506, 3507, 3508, 150, 3522], + [7450, 1613, 201], + [7451, 3490, 3509, 201], + [7452, 916, 1613, 1615, 150, 919, 1616, 1605, 201, 920], + [7453, 916, 920], + 815, + [7454, 1612, 3498, 3503], + 2672, + 2673, + [7456, 124], + [7457, 124], + [7458, 490, 603, 1606], + [7459, 917, 199, 201], + [7460, 201], + [7461, 3480, 601], + [7462, 1606], + [7463, 490, 150], + [7464, 3482], + 2683, + [7465, 392], + [7467, 1616, 3525], + 2687, + 2688, + [7469, 3497], + 2690, + [7474, 604, 150, 602, 199, 1619], + 2692, + [7478, 1609, 490], + [7481, 124], + [7482, 3517, 200], + [7483, 200], + [7484, 3488, 604, 200], + [7485, 124], + [7487, 199, 200], + [7489, 921, 3483, 3504], + [7490, 916, 1615, 604, 150, 602, 919, 199, 1605, 920], + [7493, 392, 201], + [7494, 3496, 392], + [7495, 1614, 3493, 919], + function(e, t, r) { + "use strict" + var n = r(18)["default"], + i = r(7)["default"] + t.__esModule = !0 + var s = r(3529), + a = n(s), + o = r(13), + u = i(o) + ;(t["default"] = function(e) { + function t(t) { + if (t.node && !t.isPure()) { + var r = e.scope.generateDeclaredUidIdentifier() + n.push(u.assignmentExpression("=", r, t.node)), t.replaceWith(r) + } + } + function r(e) { + if (Array.isArray(e) && e.length) { + ;(e = e.reverse()), a["default"](e) + for (var r = 0; r < e.length; r++) { + var n = e[r] + t(n) + } + } + } + e.assertClass() + var n = [] + t(e.get("superClass")), r(e.get("decorators"), !0) + for (var i = e.get("body.body"), s = 0; s < i.length; s++) { + var o = i[s] + o.is("computed") && t(o.get("key")), + o.has("decorators") && r(e.get("decorators")) + } + n && + e.insertBefore( + n.map(function(e) { + return u.expressionStatement(e) + }) + ) + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e) { + for (var t = 0; t < e.length; t++) { + var r = e[t], + n = r.node, + i = n.expression + if (a.isMemberExpression(i)) { + var s = r.scope.maybeGenerateMemoised(i.object), + o = void 0, + u = [] + s + ? ((o = s), u.push(a.assignmentExpression("=", s, i.object))) + : (o = i.object), + u.push( + a.callExpression( + a.memberExpression( + a.memberExpression(o, i.property, i.computed), + a.identifier("bind") + ), + [o] + ) + ), + 1 === u.length + ? (n.expression = u[0]) + : (n.expression = a.sequenceExpression(u)) + } + } + } + var i = r(7)["default"] + ;(t.__esModule = !0), (t["default"] = n) + var s = r(13), + a = i(s) + e.exports = t["default"] + }, + [7332, 3537], + [7336, 3540], + [7337, 3541], + [7342, 3544], + [7344, 3532, 3531, 1622], + 1937, + [7346, 3569, 3568, 3561], + [7347, 3563], + [7349, 102], + [7350, 102], + [7351, 102, 3564], + [7352, 102, 3565], + [7353, 930, 202], + [7354, 3566, 202], + [7356, 930, 202], + [7357, 930, 3567, 202], + 2581, + 2582, + [7359, 922, 393], + [7360, 3546], + [7362, 102], + [7366, 922], + [7367, 922], + 559, + [7368, 102, 928, 929, 926, 393], + 1379, + [7370, 102, 493], + [7377, 3558, 923], + 1384, + [7379, 923], + [7381, 3548, 393, 609, 202], + [7382, 1625, 3560, 202], + [7383, 3547, 3555, 609, 493, 1628], + [7384, 607], + [7386, 493, 927], + [7387, 927, 1627], + [7388, 3559, 927], + 373, + [7390, 3557, 1628], + [7392, 3562, 609], + [7393, 492, 18, 7, 3640, 939, 3645, 494, 1640, 13], + [7394, 87, 83, 18, 7, 319, 13], + [7397, 7, 18, 13, 319], + 2609, + [7398, 83, 18, 494], + [7399, 7, 13], + 2612, + [7400, 18, 7, 319, 13], + [7402, 7, 3580, 13], + [7403, 7, 13], + [7404, 7, 606, 13, 3579], + [7405, 18, 7, 933, 13], + [7406, 87, 7, 13], + 2619, + [7408, 83, 18, 7, 1634, 3582, 319, 13], + [7409, 3583], + [7410, 18, 7, 3589, 494, 319, 1640, 13], + [7413, 87, 18, 7, 1636, 13], + [7414, 491, 83, 7, 18, 1635, 932, 13, 3639], + [7317, 18, 3605, 1639, 3604, 3603, 3590], + [7318, 3595, 3591, 3598, 3596, 3600], + [7319, 3593], + 2516, + [7321, 1637, 3594], + [7322, 1637], + 2519, + [7323, 3597], + 2521, + [7324, 3599], + 2521, + 2524, + 2525, + [7325, 1638], + [7326, 3601, 1638, 3602], + 2528, + [7327, 3606], + 2530, + [7431, 3608], + [7432, 3609], + 2648, + [7415, 7285], + 2626, + [7329, 3613], + 2533, + 1397, + 1399, + 812, + 2659, + [7438, 612], + 1402, + [7443, 3630], + [7445, 3620, 612], + [7446, 937], + [7447, 3632], + 1409, + 1410, + 815, + 2672, + 2673, + [7458, 934, 936, 1641], + [7460, 937], + [7462, 1641], + 2687, + 2688, + [7469, 3628], + 2690, + [7472, 320, 937], + [7474, 938, 320, 610, 394, 3646], + [7476, 3626, 320], + [7477, 1643, 934, 936], + [7478, 1643, 934], + [7481, 395], + [7482, 3641, 611], + [7486, 611], + [7489, 939, 3617, 3631], + [7490, 3622, 3625, 938, 320, 610, 3636, 394, 3614, 3638], + [7492, 938, 320, 610, 394, 395], + [7494, 3627, 612], + 1420, + [7417, 3530, 18, 7, 3749, 3748, 3750, 1668, 495, 13], + [7418, 7, 18, 13, 940, 203], + [7419, 18, 203], + [7420, 18, 203], + [7421, 18, 203], + [7423, 203, 3650, 3651, 3653, 3655, 3656, 3652], + [7424, 18, 203], + [7425, 18, 203], + [7426, 7, 13], + [7428, 7, 13], + [7430, 18, 7, 1646, 1654, 13, 940], + [7394, 87, 83, 18, 7, 321, 13], + [7397, 7, 18, 13, 321], + 2609, + [7398, 83, 18, 495], + [7399, 7, 13], + 2612, + [7400, 18, 7, 321, 13], + [7402, 7, 3669, 13], + [7403, 7, 13], + [7404, 7, 606, 13, 3668], + [7405, 18, 7, 943, 13], + [7406, 87, 7, 13], + 2619, + [7408, 83, 18, 7, 1648, 3671, 321, 13], + [7409, 3672], + [7410, 18, 7, 3678, 495, 321, 3693, 13], + [7413, 87, 18, 7, 1650, 13], + [7414, 491, 83, 7, 18, 1649, 942, 13, 1667], + [7317, 18, 3691, 1652, 3690, 1654, 3679], + [7318, 3684, 3680, 3687, 3685, 3689], + [7319, 3682], + 2516, + [7321, 1651, 3683], + [7322, 1651], + 2519, + [7323, 3686], + 2521, + [7324, 3688], + 2521, + 2524, + 2528, + [7327, 3692], + 2530, + 810, + [7431, 3695], + [7432, 3696], + 2648, + [7415, 7286], + 2626, + [7329, 3700], + 2533, + 2525, + [7325, 1653], + 2650, + 1397, + [7433, 3713, 3725, 615, 3745], + [7434, 3707], + [7435, 1656, 3716, 3735], + [7437, 3729, 614], + 1399, + 2658, + 2659, + [7438, 396], + [7440, 3720, 3721, 613, 1671, 3755], + [7441, 3709, 1656, 1657, 1659, 3741, 3742, 3743, 160, 125], + 1402, + [7442, 1659, 3731], + [7444, 1658, 1670], + [7449, 3736, 3737, 3738, 160, 3751], + [7450, 1662, 205], + [7451, 3719, 3739, 205], + [7452, 1660, 1662, 3723, 160, 1664, 1665, 3704, 205, 1666], + [7453, 1660, 1666], + 1410, + 815, + [7454, 1661, 3728, 3733], + 2672, + 2673, + [7456, 125], + [7457, 125], + [7458, 613, 615, 1655], + [7459, 944, 322, 205], + [7460, 205], + [7461, 3708, 614], + [7462, 1655], + [7463, 613, 160], + [7464, 3710], + 2683, + [7465, 396], + [7467, 1665, 3753], + 2687, + 2688, + [7469, 3727], + 2690, + [7474, 947, 160, 946, 322, 1670], + 2692, + [7481, 125], + [7482, 3746, 204], + [7483, 204], + [7484, 3717, 947, 204], + [7485, 125], + [7487, 322, 204], + [7489, 1669, 3711, 3734], + [7493, 396, 205], + [7494, 3726, 396], + [7495, 1663, 3722, 1664], + 2644, + function(e, t, r) { + "use strict" + function n(e, t) { + var r = t._guessExecutionStatusRelativeTo(e) + return "before" === r ? "inside" : "after" === r ? "outside" : "maybe" + } + function i(e, t) { + return u.callExpression(t.addHelper("temporalRef"), [ + e, + u.stringLiteral(e.name), + t.addHelper("temporalUndefined") + ]) + } + function s(e, t, r) { + var n = r.letReferences[e.name] + return n ? t.getBindingIdentifier(e.name) === n : !1 + } + var a = r(31)["default"] + t.__esModule = !0 + var o = r(40), + u = a(o), + l = { + ReferencedIdentifier: function(e, t) { + if (this.file.opts.tdz) { + var r = e.node, + a = e.parent, + o = e.scope + if (!e.parentPath.isFor({ left: r }) && s(r, o, t)) { + var l = o.getBinding(r.name).path, + c = n(e, l) + if ("inside" !== c) + if ("maybe" === c) { + var p = i(r, t.file) + if ( + ((l.parent._tdzThis = !0), + e.skip(), + e.parentPath.isUpdateExpression()) + ) { + if (a._ignoreBlockScopingTDZ) return + e.parentPath.replaceWith( + u.sequenceExpression([p, a]) + ) + } else e.replaceWith(p) + } else + "outside" === c && + e.replaceWith( + u.throwStatement( + u.inherits( + u.newExpression( + u.identifier("ReferenceError"), + [ + u.stringLiteral( + r.name + + " is not defined - temporal dead zone" + ) + ] + ), + r + ) + ) + ) + } + } + }, + AssignmentExpression: { + exit: function(e, t) { + if (this.file.opts.tdz) { + var r = e.node + if (!r._ignoreBlockScopingTDZ) { + var n = [], + a = e.getBindingIdentifiers() + for (var o in a) { + var l = a[o] + s(l, e.scope, t) && n.push(i(l, t.file)) + } + n.length && + ((r._ignoreBlockScopingTDZ = !0), + n.push(r), + e.replaceWithMultiple(n.map(u.expressionStatement))) + } + } + } + } + } + t.visitor = l + }, + [7332, 3767], + [7336, 3770], + [7337, 3771], + [7338, 3772], + [7342, 3774], + [7343, 1673], + [7344, 3760, 3759, 1673], + 1937, + [7346, 3799, 3798, 3791], + [7347, 3793], + [7349, 103], + [7350, 103], + [7351, 103, 3794], + [7352, 103, 3795], + [7353, 958, 208], + [7354, 3796, 208], + [7356, 958, 208], + [7357, 958, 3797, 208], + 2581, + 2582, + [7359, 950, 397], + [7360, 3776], + [7362, 103], + [7366, 950], + [7367, 950], + 559, + [7368, 103, 956, 957, 954, 397], + 1379, + [7370, 103, 496], + [7377, 3788, 951], + 1384, + [7379, 951], + [7381, 3778, 397, 622, 208], + [7382, 1675, 3790, 208], + [7383, 3777, 3785, 622, 496, 1678], + [7384, 620], + [7386, 496, 955], + [7387, 955, 1677], + [7388, 3789, 955], + 373, + [7390, 3787, 1678], + [7392, 3792, 622], + [7393, 619, 67, 31, 3901, 627, 3910, 323, 3801, 40], + 810, + [7394, 207, 206, 67, 31, 324, 40], + [7397, 31, 67, 40, 324], + 2609, + [7398, 206, 67, 323], + [7399, 31, 40], + 2612, + [7400, 67, 31, 324, 40], + [7402, 31, 3811, 40], + [7403, 31, 40], + [7404, 31, 1674, 40, 3810], + [7405, 67, 31, 962, 40], + [7406, 207, 31, 40], + 2619, + [7408, 206, 67, 31, 1684, 3813, 324, 40], + [7409, 3814], + [7410, 67, 31, 3820, 323, 324, 3838, 40], + [7413, 207, 67, 31, 1686, 40], + [7414, 949, 206, 31, 67, 1685, 960, 40, 1704], + [7317, 67, 3836, 1689, 3835, 3834, 3821], + [7318, 3826, 3822, 3829, 3827, 3831], + [7319, 3824], + 2516, + [7321, 1687, 3825], + [7322, 1687], + 2519, + [7323, 3828], + 2521, + [7324, 3830], + 2521, + 2524, + 2525, + [7325, 1688], + [7326, 3832, 1688, 3833], + 2528, + [7327, 3837], + 2530, + 810, + [7431, 3840], + [7432, 3841], + 2648, + [7415, 7287], + 2626, + [7329, 3845], + 2533, + [7417, 3758, 67, 31, 3905, 3904, 3906, 1705, 323, 40], + [7418, 31, 67, 40, 961, 209], + [7419, 67, 209], + [7420, 67, 209], + [7421, 67, 209], + [7423, 209, 3847, 3848, 3850, 3852, 3853, 3849], + [7424, 67, 209], + [7425, 67, 209], + [7426, 31, 40], + [7428, 31, 40], + [7430, 67, 31, 1690, 3859, 40, 961], + 2525, + [7325, 1691], + [7326, 3857, 1691, 3858], + 2644, + 2650, + [7433, 3870, 3880, 625, 3900], + [7434, 3864], + [7435, 1694, 3872, 3890], + [7437, 3884, 623], + 1399, + 2658, + 2659, + [7438, 398], + [7440, 3876, 3877, 497, 1708, 3912], + 1402, + [7442, 1698, 3886], + [7444, 1697, 1706], + [7449, 3891, 3892, 3893, 151, 3907], + [7450, 1700, 212], + [7451, 3875, 3894, 212], + [7452, 963, 1700, 1702, 151, 966, 1703, 1692, 212, 967], + [7453, 963, 967], + 815, + [7454, 1699, 3883, 3888], + 2672, + 2673, + [7456, 126], + [7457, 126], + [7458, 497, 625, 1693], + [7459, 964, 210, 212], + [7460, 212], + [7461, 3865, 623], + [7462, 1693], + [7463, 497, 151], + [7464, 3867], + 2683, + [7465, 398], + [7467, 1703, 3911], + 2687, + 2688, + [7469, 3882], + 2690, + [7474, 626, 151, 624, 210, 1706], + 2692, + [7478, 1696, 497], + [7481, 126], + [7482, 3902, 211], + [7483, 211], + [7484, 3873, 626, 211], + [7485, 126], + [7487, 210, 211], + [7489, 627, 3868, 3889], + function(e, t, r) { + e.exports = r(627) + }, + [7490, 963, 1702, 626, 151, 624, 966, 210, 1692, 967], + [7493, 398, 212], + [7495, 1701, 3878, 966], + function(e, t, r) { + "use strict" + var n = r(3949)["default"], + i = r(152)["default"], + s = r(32)["default"], + a = r(23)["default"] + t.__esModule = !0 + var o = r(971), + u = s(o), + l = r(1709), + c = s(l), + p = r(26), + f = a(p), + h = (function(e) { + function t() { + i(this, t), e.apply(this, arguments), (this.isLoose = !0) + } + return ( + n(t, e), + (t.prototype._processMethod = function(e, t) { + if (!e.decorators) { + var r = this.classRef + e["static"] || + (r = f.memberExpression(r, f.identifier("prototype"))) + var n = f.memberExpression( + r, + e.key, + e.computed || f.isLiteral(e.key) + ), + i = f.functionExpression( + null, + e.params, + e.body, + e.generator, + e.async + ), + s = f.toComputedKey(e, e.key) + f.isStringLiteral(s) && + (i = u["default"]({ node: i, id: s, scope: t })) + var a = f.expressionStatement(f.assignmentExpression("=", n, i)) + return f.inheritsComments(a, e), this.body.push(a), !0 + } + }), + t + ) + })(c["default"]) + ;(t["default"] = h), (e.exports = t["default"]) + }, + [7499, 32, 23, 971, 3916, 3935, 26], + 1397, + [7434, 3917], + [7435, 3918, 3919, 3929], + 812, + [7442, 3921, 3927], + [7443, 3928], + [7445, 3920, 3936], + [7446, 629], + 1409, + 1410, + 815, + [7455, 3938], + [7459, 1710, 399, 629], + [7460, 629], + [7463, 3926, 400], + [7472, 400, 629], + [7474, 970, 400, 968, 399, 3937], + [7476, 3925, 400], + [7481, 630], + [7482, 3933, 969], + [7490, 3922, 3924, 970, 400, 968, 3930, 399, 3915, 3932], + [7491, 1711, 1712, 630, 3931], + [7492, 970, 400, 968, 399, 630], + 1420, + [7498, 23, 26], + [7501, 152, 498, 32, 23, 1713, 631, 26], + [7332, 3952], + [7336, 3955], + [7337, 3956], + [7338, 3957], + [7340, 3959], + [7342, 3960], + [7343, 1714], + [7344, 3943, 3942, 1714], + [7345, 972, 3945], + 1937, + [7346, 3985, 3984, 3976], + [7347, 3978], + [7349, 97], + [7350, 97], + [7351, 97, 3979], + [7352, 97, 3980], + [7353, 983, 162], + [7354, 3981, 162], + [7355, 3982, 162], + [7356, 983, 162], + [7357, 983, 3983, 162], + 2581, + 2582, + [7359, 975, 401], + [7362, 97], + [7366, 975], + [7367, 975], + [7368, 97, 981, 982, 979, 401], + 1379, + [7370, 97, 500], + [7374, 97, 1719, 974, 1716], + [7377, 3973, 976], + 1384, + [7379, 976], + [7381, 3964, 401, 633, 162], + [7382, 974, 3975, 162], + [7383, 3963, 3969, 633, 500, 1720], + [7384, 499], + [7386, 500, 980], + [7387, 980, 1718], + [7388, 3974, 980], + [7389, 499, 3971], + 373, + [7390, 3972, 1720], + [7392, 3977, 633], + 810, + 1397, + 1398, + 1399, + 812, + [7438, 988], + [7441, 3989, 3990, 1726, 3995, 4004, 4005, 4006, 402, 403], + 1402, + [7443, 4002], + [7445, 3994, 988], + [7446, 986], + 1409, + 1410, + 815, + 2673, + [7458, 1727, 4007, 3988], + [7460, 986], + [7466, 3997], + 2688, + [7469, 4e3], + 2690, + [7471, 984, 634, 403], + [7472, 402, 986], + [7474, 987, 402, 634, 501, 4016], + [7476, 3999, 402], + [7478, 3992, 1727], + [7481, 403], + [7482, 4012, 985], + [7488, 3991, 1726, 4001], + [7490, 3996, 3998, 987, 402, 634, 4008, 501, 3987, 4010], + [7492, 987, 402, 634, 501, 403], + 1420, + [7394, 152, 161, 32, 23, 326, 26], + [7397, 23, 32, 26, 326], + 2609, + [7398, 161, 32, 325], + [7399, 23, 26], + 2612, + [7400, 32, 23, 326, 26], + [7402, 23, 4027, 26], + [7403, 23, 26], + [7404, 23, 1715, 26, 4026], + [7405, 32, 23, 990, 26], + [7406, 152, 23, 26], + 2619, + [7408, 161, 32, 23, 1730, 4029, 326, 26], + [7409, 4030], + [7410, 32, 23, 4036, 325, 326, 4054, 26], + [7413, 152, 32, 23, 1732, 26], + [7414, 973, 161, 23, 32, 1731, 631, 26, 4081], + [7317, 32, 4052, 1742, 4051, 4050, 4037], + [7318, 4042, 4038, 4045, 4043, 4047], + [7319, 4040], + 2516, + [7321, 1733, 4041], + [7322, 1733], + 2519, + [7323, 4044], + 2521, + [7324, 4046], + 2521, + 2524, + 2525, + [7325, 1734], + [7326, 4048, 1734, 4049], + 2528, + [7327, 4053], + 2530, + 810, + [7431, 4056], + [7432, 4057], + 2648, + [7415, 7288], + 2626, + 1399, + 812, + 2659, + [7438, 637], + [7441, 4060, 4061, 1736, 4067, 4076, 4077, 4078, 636, 404], + 1402, + [7443, 4073], + [7445, 4066, 637], + [7447, 4075], + 1409, + 2672, + 2673, + [7458, 1737, 993, 1735], + [7460, 4080], + [7462, 1735], + 2687, + 2688, + [7469, 4071], + 2690, + [7474, 1740, 636, 992, 502, 4086], + [7475, 404], + [7477, 4064, 1737, 993], + [7481, 404], + [7482, 4082, 635], + [7486, 635], + [7489, 1741, 4062, 4074], + [7492, 1740, 636, 992, 502, 404], + [7494, 4070, 637], + 1420, + [7329, 4090], + 2533, + [7417, 3941, 32, 23, 4149, 4148, 4150, 4151, 325, 26], + [7418, 23, 32, 26, 994, 213], + [7419, 32, 213], + [7420, 32, 213], + [7421, 32, 213], + [7423, 213, 4092, 4093, 4095, 4097, 4098, 4094], + [7424, 32, 213], + [7425, 32, 213], + [7426, 23, 26], + [7428, 23, 26], + [7430, 32, 23, 1743, 4104, 26, 994], + 2525, + [7325, 1744], + [7326, 4102, 1744, 4103], + 2650, + 1397, + [7433, 4114, 4127, 1752, 4144], + [7434, 4109], + [7435, 1745, 4117, 4134], + [7437, 4130, 638], + 1399, + 2658, + [7439, 4116, 639], + [7440, 4122, 4123, 995, 1757, 4154], + [7441, 4111, 1745, 4113, 1747, 4140, 4141, 4142, 216, 127], + 1402, + [7442, 1747, 4131], + [7444, 1746, 1756], + [7447, 4139], + [7449, 4135, 4136, 4137, 216, 4152], + [7450, 1749, 215], + [7451, 4121, 4138, 215], + [7452, 1748, 1749, 4125, 216, 1753, 1754, 4106, 215, 1755], + [7453, 1748, 1755], + 1410, + 815, + [7454, 4119, 4129, 4133], + 2673, + [7456, 127], + [7457, 127], + [7459, 1751, 405, 215], + [7460, 215], + [7461, 4110, 638], + [7463, 995, 216], + [7464, 4112], + 2683, + [7465, 639], + [7467, 1754, 4153], + 2687, + 2688, + [7469, 4128], + 2690, + [7474, 998, 216, 997, 405, 1756], + 2692, + [7477, 4115, 995, 1752], + [7481, 127], + [7482, 4146, 214], + [7483, 214], + [7484, 4118, 998, 214], + [7485, 127], + [7486, 214], + [7487, 405, 214], + [7493, 639, 215], + [7495, 1750, 4124, 1753], + 2644, + [7331, 4157], + [7346, 4181, 4180, 4178], + 2581, + 2582, + [7358, 4167], + [7359, 1758, 503], + [7360, 4158], + [7361, 4165], + [7363, 1e3, 999, 4162], + 465, + [7366, 1758], + 559, + [7368, 642, 1762, 1763, 1001, 503], + 1379, + 1380, + [7373, 1001], + [7376, 1e3], + [7377, 4174, 1759], + 1384, + [7378, 4166, 1759], + 805, + [7381, 4161, 503, 641, 999], + [7382, 4160, 4177, 999], + [7383, 4159, 4169, 641, 4175, 1761], + [7390, 4173, 1761], + [7392, 4179, 641], + 80, + [7497, 19, 8, 4184, 4185, 14], + [7498, 8, 14], + [7393, 508, 19, 8, 4211, 4214, 4215, 505, 4186, 14], + 810, + 1397, + 1398, + 1399, + 812, + [7438, 1006], + [7441, 4189, 4190, 1764, 4195, 4204, 4205, 4206, 406, 407], + 1402, + [7443, 4202], + [7445, 4194, 1006], + [7446, 1004], + 1409, + 1410, + 815, + 2673, + [7458, 1765, 4207, 4188], + [7460, 1004], + [7466, 4197], + 2688, + [7469, 4200], + 2690, + [7471, 1002, 646, 407], + [7472, 406, 1004], + [7474, 1005, 406, 646, 504, 4216], + [7476, 4199, 406], + [7478, 4192, 1765], + [7481, 407], + [7482, 4212, 1003], + [7488, 4191, 1764, 4201], + [7490, 4196, 4198, 1005, 406, 646, 4208, 504, 4187, 4210], + [7492, 1005, 406, 646, 504, 407], + 1420, + [7394, 89, 88, 19, 8, 327, 14], + [7397, 8, 19, 14, 327], + 2609, + [7398, 88, 19, 505], + [7399, 8, 14], + 2612, + [7400, 19, 8, 327, 14], + [7402, 8, 4227, 14], + [7403, 8, 14], + [7404, 8, 650, 14, 4226], + [7405, 19, 8, 1009, 14], + [7406, 89, 8, 14], + 2619, + [7408, 88, 19, 8, 1768, 4229, 327, 14], + [7409, 4230], + [7410, 19, 8, 4236, 505, 327, 4254, 14], + [7413, 89, 19, 8, 1770, 14], + [7414, 507, 88, 8, 19, 1769, 1008, 14, 4281], + [7317, 19, 4252, 1780, 4251, 4250, 4237], + [7318, 4242, 4238, 4245, 4243, 4247], + [7319, 4240], + 2516, + [7321, 1771, 4241], + [7322, 1771], + 2519, + [7323, 4244], + 2521, + [7324, 4246], + 2521, + 2524, + 2525, + [7325, 1772], + [7326, 4248, 1772, 4249], + 2528, + [7327, 4253], + 2530, + 810, + [7431, 4256], + [7432, 4257], + 2648, + [7415, 7289], + 2626, + 1399, + 812, + 2659, + [7438, 649], + [7441, 4260, 4261, 1774, 4267, 4276, 4277, 4278, 648, 408], + 1402, + [7443, 4273], + [7445, 4266, 649], + [7447, 4275], + 1409, + 2672, + 2673, + [7458, 1775, 1012, 1773], + [7460, 4280], + [7462, 1773], + 2687, + 2688, + [7469, 4271], + 2690, + [7474, 1778, 648, 1011, 506, 4286], + [7475, 408], + [7477, 4264, 1775, 1012], + [7481, 408], + [7482, 4282, 647], + [7486, 647], + [7489, 1779, 4262, 4274], + [7492, 1778, 648, 1011, 506, 408], + [7494, 4270, 649], + 1420, + [7329, 4290], + 2533, + [7332, 4298], + [7336, 4301], + [7337, 4302], + [7342, 4305], + [7344, 4293, 4292, 1781], + 1937, + [7346, 4330, 4329, 4322], + [7347, 4324], + [7349, 104], + [7350, 104], + [7351, 104, 4325], + [7352, 104, 4326], + [7353, 1022, 217], + [7354, 4327, 217], + [7356, 1022, 217], + [7357, 1022, 4328, 217], + 2581, + 2582, + [7359, 1014, 409], + [7360, 4307], + [7362, 104], + [7366, 1014], + [7367, 1014], + 559, + [7368, 104, 1020, 1021, 1018, 409], + 1379, + [7370, 104, 509], + [7377, 4319, 1015], + 1384, + [7379, 1015], + [7381, 4309, 409, 653, 217], + [7382, 1784, 4321, 217], + [7383, 4308, 4316, 653, 509, 1787], + [7384, 651], + [7386, 509, 1019], + [7387, 1019, 1786], + [7388, 4320, 1019], + 373, + [7390, 4318, 1787], + [7392, 4323, 653], + [7417, 4291, 19, 8, 4431, 4430, 4432, 1814, 510, 14], + [7418, 8, 19, 14, 1023, 218], + [7419, 19, 218], + [7420, 19, 218], + [7421, 19, 218], + [7423, 218, 4332, 4333, 4335, 4337, 4338, 4334], + [7424, 19, 218], + [7425, 19, 218], + [7426, 8, 14], + [7428, 8, 14], + [7430, 19, 8, 1792, 1800, 14, 1023], + [7394, 89, 88, 19, 8, 328, 14], + [7397, 8, 19, 14, 328], + 2609, + [7398, 88, 19, 510], + [7399, 8, 14], + 2612, + [7400, 19, 8, 328, 14], + [7402, 8, 4351, 14], + [7403, 8, 14], + [7404, 8, 650, 14, 4350], + [7405, 19, 8, 1026, 14], + [7406, 89, 8, 14], + 2619, + [7408, 88, 19, 8, 1794, 4353, 328, 14], + [7409, 4354], + [7410, 19, 8, 4360, 510, 328, 4375, 14], + [7413, 89, 19, 8, 1796, 14], + [7414, 507, 88, 8, 19, 1795, 1025, 14, 1813], + [7317, 19, 4373, 1798, 4372, 1800, 4361], + [7318, 4366, 4362, 4369, 4367, 4371], + [7319, 4364], + 2516, + [7321, 1797, 4365], + [7322, 1797], + 2519, + [7323, 4368], + 2521, + [7324, 4370], + 2521, + 2524, + 2528, + [7327, 4374], + 2530, + 810, + [7431, 4377], + [7432, 4378], + 2648, + [7415, 7290], + 2626, + [7329, 4382], + 2533, + 2525, + [7325, 1799], + 2650, + 1397, + [7433, 4395, 4407, 656, 4427], + [7434, 4389], + [7435, 1802, 4398, 4417], + [7437, 4411, 655], + 1399, + 2658, + 2659, + [7438, 410], + [7440, 4402, 4403, 654, 1817, 4437], + [7441, 4391, 1802, 1803, 1805, 4423, 4424, 4425, 163, 128], + 1402, + [7442, 1805, 4413], + [7444, 1804, 1816], + [7449, 4418, 4419, 4420, 163, 4433], + [7450, 1808, 220], + [7451, 4401, 4421, 220], + [7452, 1806, 1808, 4405, 163, 1810, 1811, 4386, 220, 1812], + [7453, 1806, 1812], + 1410, + 815, + [7454, 1807, 4410, 4415], + 2672, + 2673, + [7456, 128], + [7457, 128], + [7458, 654, 656, 1801], + [7459, 1027, 329, 220], + [7460, 220], + [7461, 4390, 655], + [7462, 1801], + [7463, 654, 163], + [7464, 4392], + 2683, + [7465, 410], + [7467, 1811, 4435], + 2687, + 2688, + [7469, 4409], + 2690, + [7474, 1030, 163, 1029, 329, 1816], + 2692, + [7481, 128], + [7482, 4428, 219], + [7483, 219], + [7484, 4399, 1030, 219], + [7485, 128], + [7487, 329, 219], + [7489, 1815, 4393, 4416], + [7493, 410, 220], + [7494, 4408, 410], + [7495, 1809, 4404, 1810], + 2644, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + BinaryExpression: function(e) { + var r = e.node + "instanceof" === r.operator && + e.replaceWith( + t.callExpression(this.addHelper("instanceof"), [ + r.left, + r.right + ]) + ) + } + } + } + }), + (e.exports = t["default"]) + }, + [7332, 4449], + [7336, 4452], + [7337, 4453], + [7338, 4454], + [7342, 4456], + [7343, 1819], + [7344, 4442, 4441, 1819], + 1937, + [7346, 4481, 4480, 4473], + [7347, 4475], + [7349, 105], + [7350, 105], + [7351, 105, 4476], + [7352, 105, 4477], + [7353, 1042, 222], + [7354, 4478, 222], + [7356, 1042, 222], + [7357, 1042, 4479, 222], + 2581, + 2582, + [7359, 1034, 411], + [7360, 4458], + [7362, 105], + [7366, 1034], + [7367, 1034], + 559, + [7368, 105, 1040, 1041, 1038, 411], + 1379, + [7370, 105, 511], + [7377, 4470, 1035], + 1384, + [7379, 1035], + [7381, 4460, 411, 660, 222], + [7382, 1821, 4472, 222], + [7383, 4459, 4467, 660, 511, 1824], + [7384, 658], + [7386, 511, 1039], + [7387, 1039, 1823], + [7388, 4471, 1039], + 373, + [7390, 4469, 1824], + [7392, 4474, 660], + [7393, 1033, 68, 41, 4581, 1052, 4589, 412, 1838, 56], + [7394, 330, 221, 68, 41, 331, 56], + [7397, 41, 68, 56, 331], + 2609, + [7398, 221, 68, 412], + [7399, 41, 56], + 2612, + [7400, 68, 41, 331, 56], + [7402, 41, 4492, 56], + [7403, 41, 56], + [7404, 41, 1820, 56, 4491], + [7405, 68, 41, 1046, 56], + [7406, 330, 41, 56], + 2619, + [7408, 221, 68, 41, 1830, 4494, 331, 56], + [7409, 4495], + [7410, 68, 41, 4501, 412, 331, 1838, 56], + [7413, 330, 68, 41, 1832, 56], + [7414, 1032, 221, 41, 68, 1831, 1044, 56, 1851], + [7317, 68, 4517, 1835, 4516, 4515, 4502], + [7318, 4507, 4503, 4510, 4508, 4512], + [7319, 4505], + 2516, + [7321, 1833, 4506], + [7322, 1833], + 2519, + [7323, 4509], + 2521, + [7324, 4511], + 2521, + 2524, + 2525, + [7325, 1834], + [7326, 4513, 1834, 4514], + 2528, + [7327, 4518], + 2530, + [7431, 4520], + [7432, 4521], + 2648, + [7415, 7291], + 2626, + [7329, 4525], + 2533, + [7417, 4440, 68, 41, 4585, 4584, 4586, 1852, 412, 56], + [7418, 41, 68, 56, 1045, 223], + [7419, 68, 223], + [7420, 68, 223], + [7421, 68, 223], + [7423, 223, 4527, 4528, 4530, 4532, 4533, 4529], + [7424, 68, 223], + [7425, 68, 223], + [7426, 41, 56], + [7428, 41, 56], + [7430, 68, 41, 1836, 4539, 56, 1045], + 2525, + [7325, 1837], + [7326, 4537, 1837, 4538], + 2644, + 2650, + [7433, 4550, 4560, 663, 4580], + [7434, 4544], + [7435, 1841, 4552, 4570], + [7437, 4564, 661], + 1399, + 2658, + 2659, + [7438, 413], + [7440, 4556, 4557, 512, 1854, 4592], + 1402, + [7442, 1845, 4566], + [7444, 1844, 1853], + [7449, 4571, 4572, 4573, 153, 4587], + [7450, 1847, 226], + [7451, 4555, 4574, 226], + [7452, 1047, 1847, 1849, 153, 1050, 1850, 1839, 226, 1051], + [7453, 1047, 1051], + 815, + [7454, 1846, 4563, 4568], + 2672, + 2673, + [7456, 129], + [7457, 129], + [7458, 512, 663, 1840], + [7459, 1048, 224, 226], + [7460, 226], + [7461, 4545, 661], + [7462, 1840], + [7463, 512, 153], + [7464, 4547], + 2683, + [7465, 413], + [7467, 1850, 4590], + 2687, + 2688, + [7469, 4562], + 2690, + [7474, 664, 153, 662, 224, 1853], + 2692, + [7478, 1843, 512], + [7481, 129], + [7482, 4582, 225], + [7483, 225], + [7484, 4553, 664, 225], + [7485, 129], + [7487, 224, 225], + [7489, 1052, 4548, 4569], + [7490, 1047, 1849, 664, 153, 662, 1050, 224, 1839, 1051], + [7493, 413, 226], + [7494, 4561, 413], + [7495, 1848, 4558, 1050], + [7332, 4600], + [7336, 4603], + [7337, 4604], + [7342, 4607], + [7344, 4595, 4594, 1855], + 1937, + [7346, 4632, 4631, 4624], + [7347, 4626], + [7349, 106], + [7350, 106], + [7351, 106, 4627], + [7352, 106, 4628], + [7353, 1062, 227], + [7354, 4629, 227], + [7356, 1062, 227], + [7357, 1062, 4630, 227], + 2581, + 2582, + [7359, 1054, 416], + [7360, 4609], + [7362, 106], + [7366, 1054], + [7367, 1054], + 559, + [7368, 106, 1060, 1061, 1058, 416], + 1379, + [7370, 106, 513], + [7377, 4621, 1055], + 1384, + [7379, 1055], + [7381, 4611, 416, 669, 227], + [7382, 1858, 4623, 227], + [7383, 4610, 4618, 669, 513, 1861], + [7384, 667], + [7386, 513, 1059], + [7387, 1059, 1860], + [7388, 4622, 1059], + 373, + [7390, 4620, 1861], + [7392, 4625, 669], + [7393, 415, 21, 9, 4703, 1071, 4708, 514, 1873, 15], + [7394, 90, 84, 21, 9, 332, 15], + [7397, 9, 21, 15, 332], + 2609, + [7398, 84, 21, 514], + [7399, 9, 15], + 2612, + [7400, 21, 9, 332, 15], + [7402, 9, 4643, 15], + [7403, 9, 15], + [7404, 9, 666, 15, 4642], + [7405, 21, 9, 1065, 15], + [7406, 90, 9, 15], + 2619, + [7408, 84, 21, 9, 1867, 4645, 332, 15], + [7409, 4646], + [7410, 21, 9, 4652, 514, 332, 1873, 15], + [7413, 90, 21, 9, 1869, 15], + [7414, 414, 84, 9, 21, 1868, 1064, 15, 4702], + [7317, 21, 4668, 1872, 4667, 4666, 4653], + [7318, 4658, 4654, 4661, 4659, 4663], + [7319, 4656], + 2516, + [7321, 1870, 4657], + [7322, 1870], + 2519, + [7323, 4660], + 2521, + [7324, 4662], + 2521, + 2524, + 2525, + [7325, 1871], + [7326, 4664, 1871, 4665], + 2528, + [7327, 4669], + 2530, + [7431, 4671], + [7432, 4672], + 2648, + [7415, 7292], + 2626, + [7329, 4676], + 2533, + 1397, + 1399, + 812, + 2659, + [7438, 672], + 1402, + [7443, 4693], + [7445, 4683, 672], + [7446, 1069], + [7447, 4695], + 1409, + 1410, + 815, + 2672, + 2673, + [7458, 1066, 1068, 1874], + [7460, 1069], + [7462, 1874], + 2687, + 2688, + [7469, 4691], + 2690, + [7472, 333, 1069], + [7474, 1070, 333, 670, 417, 4709], + [7476, 4689, 333], + [7477, 1876, 1066, 1068], + [7478, 1876, 1066], + [7481, 418], + [7482, 4704, 671], + [7486, 671], + [7489, 1071, 4680, 4694], + [7490, 4685, 4688, 1070, 333, 670, 4699, 417, 4677, 4701], + [7492, 1070, 333, 670, 417, 418], + [7494, 4690, 672], + 1420, + [7417, 4593, 21, 9, 4812, 4811, 4813, 1901, 515, 15], + [7418, 9, 21, 15, 1072, 228], + [7419, 21, 228], + [7420, 21, 228], + [7421, 21, 228], + [7423, 228, 4713, 4714, 4716, 4718, 4719, 4715], + [7424, 21, 228], + [7425, 21, 228], + [7426, 9, 15], + [7428, 9, 15], + [7430, 21, 9, 1879, 1887, 15, 1072], + [7394, 90, 84, 21, 9, 334, 15], + [7397, 9, 21, 15, 334], + 2609, + [7398, 84, 21, 515], + [7399, 9, 15], + 2612, + [7400, 21, 9, 334, 15], + [7402, 9, 4732, 15], + [7403, 9, 15], + [7404, 9, 666, 15, 4731], + [7405, 21, 9, 1075, 15], + [7406, 90, 9, 15], + 2619, + [7408, 84, 21, 9, 1881, 4734, 334, 15], + [7409, 4735], + [7410, 21, 9, 4741, 515, 334, 4756, 15], + [7413, 90, 21, 9, 1883, 15], + [7414, 414, 84, 9, 21, 1882, 1074, 15, 1900], + [7317, 21, 4754, 1885, 4753, 1887, 4742], + [7318, 4747, 4743, 4750, 4748, 4752], + [7319, 4745], + 2516, + [7321, 1884, 4746], + [7322, 1884], + 2519, + [7323, 4749], + 2521, + [7324, 4751], + 2521, + 2524, + 2528, + [7327, 4755], + 2530, + 810, + [7431, 4758], + [7432, 4759], + 2648, + [7415, 7293], + 2626, + [7329, 4763], + 2533, + 2525, + [7325, 1886], + 2650, + 1397, + [7433, 4776, 4788, 675, 4808], + [7434, 4770], + [7435, 1889, 4779, 4798], + [7437, 4792, 674], + 1399, + 2658, + 2659, + [7438, 419], + [7440, 4783, 4784, 673, 1904, 4818], + [7441, 4772, 1889, 1890, 1892, 4804, 4805, 4806, 164, 130], + 1402, + [7442, 1892, 4794], + [7444, 1891, 1903], + [7449, 4799, 4800, 4801, 164, 4814], + [7450, 1895, 230], + [7451, 4782, 4802, 230], + [7452, 1893, 1895, 4786, 164, 1897, 1898, 4767, 230, 1899], + [7453, 1893, 1899], + 1410, + 815, + [7454, 1894, 4791, 4796], + 2672, + 2673, + [7456, 130], + [7457, 130], + [7458, 673, 675, 1888], + [7459, 1076, 335, 230], + [7460, 230], + [7461, 4771, 674], + [7462, 1888], + [7463, 673, 164], + [7464, 4773], + 2683, + [7465, 419], + [7467, 1898, 4816], + 2687, + 2688, + [7469, 4790], + 2690, + [7474, 1079, 164, 1078, 335, 1903], + 2692, + [7481, 130], + [7482, 4809, 229], + [7483, 229], + [7484, 4780, 1079, 229], + [7485, 130], + [7487, 335, 229], + [7489, 1902, 4774, 4797], + [7493, 419, 230], + [7494, 4789, 419], + [7495, 1896, 4785, 1897], + 2644, + function(e, t, r) { + "use strict" + var n = r(422)["default"], + i = r(82)["default"], + s = r(517)["default"], + a = r(10)["default"] + t.__esModule = !0 + var o = r(4821), + u = a(o), + l = r(4966), + c = a(l), + p = c["default"]( + "\n System.register(MODULE_NAME, [SOURCES], function (EXPORT_IDENTIFIER, CONTEXT_IDENTIFIER) {\n BEFORE_BODY;\n return {\n setters: [SETTERS],\n execute: function () {\n BODY;\n }\n };\n });\n" + ), + f = c["default"]( + '\n for (var KEY in TARGET) {\n if (KEY !== "default") EXPORT_OBJ[KEY] = TARGET[KEY];\n }\n' + ) + ;(t["default"] = function(e) { + var t = e.types, + a = n(), + o = { + "AssignmentExpression|UpdateExpression": function(e) { + if (!e.node[a]) { + e.node[a] = !0 + var t = e.get(e.isAssignmentExpression() ? "left" : "argument") + if (t.isIdentifier()) { + var r = t.node.name + if (this.scope.getBinding(r) === e.scope.getBinding(r)) { + var n = this.exports[r] + if (n) { + for ( + var s = e.node, + o = n, + u = Array.isArray(o), + l = 0, + o = u ? o : i(o); + ; + + ) { + var c + if (u) { + if (l >= o.length) break + c = o[l++] + } else { + if (((l = o.next()), l.done)) break + c = l.value + } + var p = c + s = this.buildCall(p, s).expression + } + e.replaceWith(s) + } + } + } + } + } + } + return { + inherits: r(1328), + visitor: { + ReferencedIdentifier: function(e, r) { + "__moduleName" != e.node.name || + e.scope.hasBinding("__moduleName") || + e.replaceWith( + t.memberExpression(r.contextIdent, t.identifier("id")) + ) + }, + Program: { + enter: function(e, t) { + t.contextIdent = e.scope.generateUidIdentifier("context") + }, + exit: function(e, r) { + function n(e, t) { + ;(d[e] = d[e] || []), d[e].push(t) + } + function a(e, t, r) { + var n = (m[e] = m[e] || { imports: [], exports: [] }) + n[t] = n[t].concat(r) + } + function l(e, r) { + return t.expressionStatement( + t.callExpression(c, [t.stringLiteral(e), r]) + ) + } + for ( + var c = e.scope.generateUidIdentifier("export"), + h = r.contextIdent, + d = s(null), + m = s(null), + y = [], + v = [], + g = [], + E = [], + b = e.get("body"), + x = !0, + A = 0; + A < b.length; + A++ + ) { + var D = b[A] + if ( + (D.isExportDeclaration() && (D = D.get("declaration")), + D.isVariableDeclaration() && "var" !== D.node.kind) + ) { + x = !1 + break + } + } + for (var C = 0; C < b.length; C++) { + var S = b[C] + if (x && S.isFunctionDeclaration()) + y.push(S.node), S.remove() + else if (S.isImportDeclaration()) { + var F = S.node.source.value + a(F, "imports", S.node.specifiers) + for (var w in S.getBindingIdentifiers()) + S.scope.removeBinding(w), E.push(t.identifier(w)) + S.remove() + } else if (S.isExportAllDeclaration()) + a(S.node.source.value, "exports", S.node), S.remove() + else if (S.isExportDefaultDeclaration()) { + var _ = S.get("declaration") + if ( + _.isClassDeclaration() || + _.isFunctionDeclaration() + ) { + var T = _.node.id, + P = [] + T + ? (P.push(_.node), + P.push(l("default", T)), + n(T.name, "default")) + : P.push(l("default", t.toExpression(_.node))), + !x || _.isClassDeclaration() + ? S.replaceWithMultiple(P) + : ((y = y.concat(P)), S.remove()) + } else S.replaceWith(l("default", _.node)) + } else if (S.isExportNamedDeclaration()) { + var _ = S.get("declaration") + if (_.node) { + S.replaceWith(_) + var P = [], + B = void 0 + if (S.isFunction()) { + var k + ;(k = {}), + (k[_.node.id.name] = _.node.id), + (B = k) + } else B = _.getBindingIdentifiers() + for (var I in B) + n(I, I), P.push(l(I, t.identifier(I))) + S.insertAfter(P) + } + var O = S.node.specifiers + if (O && O.length) + if (S.node.source) + a(S.node.source.value, "exports", O), S.remove() + else { + for ( + var P = [], + M = O, + R = Array.isArray(M), + L = 0, + M = R ? M : i(M); + ; + + ) { + var N + if (R) { + if (L >= M.length) break + N = M[L++] + } else { + if (((L = M.next()), L.done)) break + N = L.value + } + var j = N + P.push(l(j.exported.name, j.local)), + n(j.local.name, j.exported.name) + } + S.replaceWithMultiple(P) + } + } + } + for (var F in m) { + for ( + var O = m[F], + U = [], + V = e.scope.generateUidIdentifier(F), + G = O.imports, + W = Array.isArray(G), + q = 0, + G = W ? G : i(G); + ; + + ) { + var H + if (W) { + if (q >= G.length) break + H = G[q++] + } else { + if (((q = G.next()), q.done)) break + H = q.value + } + var j = H + t.isImportNamespaceSpecifier(j) + ? U.push( + t.expressionStatement( + t.assignmentExpression("=", j.local, V) + ) + ) + : t.isImportDefaultSpecifier(j) && + (j = t.importSpecifier( + j.local, + t.identifier("default") + )), + t.isImportSpecifier(j) && + U.push( + t.expressionStatement( + t.assignmentExpression( + "=", + j.local, + t.memberExpression(V, j.imported) + ) + ) + ) + } + if (O.exports.length) { + var Y = e.scope.generateUidIdentifier("exportObj") + U.push( + t.variableDeclaration("var", [ + t.variableDeclarator(Y, t.objectExpression([])) + ]) + ) + for ( + var J = O.exports, + K = Array.isArray(J), + X = 0, + J = K ? J : i(J); + ; + + ) { + var z + if (K) { + if (X >= J.length) break + z = J[X++] + } else { + if (((X = J.next()), X.done)) break + z = X.value + } + var $ = z + t.isExportAllDeclaration($) + ? U.push( + f({ + KEY: e.scope.generateUidIdentifier( + "key" + ), + EXPORT_OBJ: Y, + TARGET: V + }) + ) + : t.isExportSpecifier($) && + U.push( + t.expressionStatement( + t.assignmentExpression( + "=", + t.memberExpression(Y, $.exported), + t.memberExpression(V, $.local) + ) + ) + ) + } + U.push(t.expressionStatement(t.callExpression(c, [Y]))) + } + g.push(t.stringLiteral(F)), + v.push( + t.functionExpression(null, [V], t.blockStatement(U)) + ) + } + var Q = this.getModuleName() + Q && (Q = t.stringLiteral(Q)), + x && + u["default"](e, function(e) { + return E.push(e) + }), + E.length && + y.unshift( + t.variableDeclaration( + "var", + E.map(function(e) { + return t.variableDeclarator(e) + }) + ) + ), + e.traverse(o, { exports: d, buildCall: l, scope: e.scope }), + (e.node.body = [ + p({ + BEFORE_BODY: y, + MODULE_NAME: Q, + SETTERS: v, + SOURCES: g, + BODY: e.node.body, + EXPORT_IDENTIFIER: c, + CONTEXT_IDENTIFIER: h + }) + ]) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7502, 2, 57], + [7417, 1931, 10, 2, 4922, 4921, 4923, 1927, 516, 57], + [7418, 2, 10, 57, 1080, 231], + [7419, 10, 231], + [7420, 10, 231], + [7421, 10, 231], + [7423, 231, 4823, 4824, 4826, 4828, 4829, 4825], + [7424, 10, 231], + [7425, 10, 231], + [7426, 2, 57], + [7428, 2, 57], + [7430, 10, 2, 1905, 1913, 57, 1080], + [7394, 91, 82, 10, 2, 336, 57], + [7397, 2, 10, 57, 336], + 2609, + [7398, 82, 10, 516], + [7399, 2, 57], + 2612, + [7400, 10, 2, 336, 57], + [7402, 2, 4842, 57], + [7403, 2, 57], + [7404, 2, 679, 57, 4841], + [7405, 10, 2, 1083, 57], + [7406, 91, 2, 57], + 2619, + [7408, 82, 10, 2, 1907, 4844, 336, 57], + [7409, 4845], + [7410, 10, 2, 4851, 516, 336, 4866, 57], + [7413, 91, 10, 2, 1909, 57], + [7414, 421, 82, 2, 10, 1908, 1082, 57, 1926], + [7317, 10, 4864, 1911, 4863, 1913, 4852], + [7318, 4857, 4853, 4860, 4858, 4862], + [7319, 4855], + 2516, + [7321, 1910, 4856], + [7322, 1910], + 2519, + [7323, 4859], + 2521, + [7324, 4861], + 2521, + 2524, + 2528, + [7327, 4865], + 2530, + 810, + [7431, 4868], + [7432, 4869], + 2648, + [7415, 7294], + 2626, + [7329, 4873], + 2533, + 2525, + [7325, 1912], + 2650, + 1397, + [7433, 4886, 4898, 678, 4918], + [7434, 4880], + [7435, 1915, 4889, 4908], + [7437, 4902, 677], + 1399, + 2658, + 2659, + [7438, 420], + [7440, 4893, 4894, 676, 1930, 4928], + [7441, 4882, 1915, 1916, 1918, 4914, 4915, 4916, 165, 131], + 1402, + [7442, 1918, 4904], + [7444, 1917, 1929], + [7449, 4909, 4910, 4911, 165, 4924], + [7450, 1921, 233], + [7451, 4892, 4912, 233], + [7452, 1919, 1921, 4896, 165, 1923, 1924, 4877, 233, 1925], + [7453, 1919, 1925], + 1410, + 815, + [7454, 1920, 4901, 4906], + 2672, + 2673, + [7456, 131], + [7457, 131], + [7458, 676, 678, 1914], + [7459, 1084, 337, 233], + [7460, 233], + [7461, 4881, 677], + [7462, 1914], + [7463, 676, 165], + [7464, 4883], + 2683, + [7465, 420], + [7467, 1924, 4926], + 2687, + 2688, + [7469, 4900], + 2690, + [7474, 1087, 165, 1086, 337, 1929], + 2692, + [7481, 131], + [7482, 4919, 232], + [7483, 232], + [7484, 4890, 1087, 232], + [7485, 131], + [7487, 337, 232], + [7489, 1928, 4884, 4907], + [7493, 420, 233], + [7494, 4899, 420], + [7495, 1922, 4895, 1923], + 2644, + [7336, 4936], + [7337, 4937], + [7346, 4965, 4964, 4957], + [7347, 4959], + [7349, 107], + [7350, 107], + [7351, 107, 4960], + [7352, 107, 4961], + [7353, 1096, 234], + [7354, 4962, 234], + [7356, 1096, 234], + [7357, 1096, 4963, 234], + 2581, + 2582, + [7359, 1088, 423], + [7360, 4942], + [7362, 107], + [7366, 1088], + [7367, 1088], + 559, + [7368, 107, 1094, 1095, 1092, 423], + 1379, + [7370, 107, 518], + [7377, 4954, 1089], + 1384, + [7379, 1089], + [7381, 4944, 423, 682, 234], + [7382, 1938, 4956, 234], + [7383, 4943, 4951, 682, 518, 1941], + [7384, 680], + [7386, 518, 1093], + [7387, 1093, 1940], + [7388, 4955, 1093], + 373, + [7390, 4953, 1941], + [7392, 4958, 682], + [7393, 422, 10, 2, 5065, 1106, 5073, 424, 1955, 58], + [7394, 91, 82, 10, 2, 338, 58], + [7397, 2, 10, 58, 338], + 2609, + [7398, 82, 10, 424], + [7399, 2, 58], + 2612, + [7400, 10, 2, 338, 58], + [7402, 2, 4976, 58], + [7403, 2, 58], + [7404, 2, 679, 58, 4975], + [7405, 10, 2, 1100, 58], + [7406, 91, 2, 58], + 2619, + [7408, 82, 10, 2, 1947, 4978, 338, 58], + [7409, 4979], + [7410, 10, 2, 4985, 424, 338, 1955, 58], + [7413, 91, 10, 2, 1949, 58], + [7414, 421, 82, 2, 10, 1948, 1098, 58, 1968], + [7317, 10, 5001, 1952, 5e3, 4999, 4986], + [7318, 4991, 4987, 4994, 4992, 4996], + [7319, 4989], + 2516, + [7321, 1950, 4990], + [7322, 1950], + 2519, + [7323, 4993], + 2521, + [7324, 4995], + 2521, + 2524, + 2525, + [7325, 1951], + [7326, 4997, 1951, 4998], + 2528, + [7327, 5002], + 2530, + [7431, 5004], + [7432, 5005], + 2648, + [7415, 7295], + 2626, + [7329, 5009], + 2533, + [7417, 1931, 10, 2, 5069, 5068, 5070, 1969, 424, 58], + [7418, 2, 10, 58, 1099, 235], + [7419, 10, 235], + [7420, 10, 235], + [7421, 10, 235], + [7423, 235, 5011, 5012, 5014, 5016, 5017, 5013], + [7424, 10, 235], + [7425, 10, 235], + [7426, 2, 58], + [7428, 2, 58], + [7430, 10, 2, 1953, 5023, 58, 1099], + 2525, + [7325, 1954], + [7326, 5021, 1954, 5022], + 2644, + 2650, + [7433, 5034, 5044, 685, 5064], + [7434, 5028], + [7435, 1958, 5036, 5054], + [7437, 5048, 683], + 1399, + 2658, + 2659, + [7438, 425], + [7440, 5040, 5041, 519, 1971, 5076], + 1402, + [7442, 1962, 5050], + [7444, 1961, 1970], + [7449, 5055, 5056, 5057, 154, 5071], + [7450, 1964, 238], + [7451, 5039, 5058, 238], + [7452, 1101, 1964, 1966, 154, 1104, 1967, 1956, 238, 1105], + [7453, 1101, 1105], + 815, + [7454, 1963, 5047, 5052], + 2672, + 2673, + [7456, 132], + [7457, 132], + [7458, 519, 685, 1957], + [7459, 1102, 236, 238], + [7460, 238], + [7461, 5029, 683], + [7462, 1957], + [7463, 519, 154], + [7464, 5031], + 2683, + [7465, 425], + [7467, 1967, 5074], + 2687, + 2688, + [7469, 5046], + 2690, + [7474, 686, 154, 684, 236, 1970], + 2692, + [7478, 1960, 519], + [7481, 132], + [7482, 5066, 237], + [7483, 237], + [7484, 5037, 686, 237], + [7485, 132], + [7487, 236, 237], + [7489, 1106, 5032, 5053], + [7490, 1101, 1966, 686, 154, 684, 1104, 236, 1956, 1105], + [7493, 425, 238], + [7494, 5045, 425], + [7495, 1965, 5042, 1104], + function(e, t, r) { + "use strict" + var n = r(69)["default"] + t.__esModule = !0 + var i = r(175), + s = r(5120), + a = n(s), + o = a["default"]( + '\n (function (global, factory) {\n if (typeof define === "function" && define.amd) {\n define(MODULE_NAME, AMD_ARGUMENTS, factory);\n } else if (typeof exports !== "undefined") {\n factory(COMMON_ARGUMENTS);\n } else {\n var mod = { exports: {} };\n factory(BROWSER_ARGUMENTS);\n global.GLOBAL_ARG = mod.exports;\n }\n })(this, FUNC);\n' + ) + ;(t["default"] = function(e) { + function t(e) { + if (e.isExpressionStatement()) { + var t = e.get("expression") + if (!t.isCallExpression()) return !1 + if (!t.get("callee").isIdentifier({ name: "define" })) return !1 + var r = t.get("arguments") + return 3 !== r.length || r.shift().isStringLiteral() + ? 2 !== r.length + ? !1 + : r.shift().isArrayExpression() + ? !!r.shift().isFunctionExpression() + : !1 + : !1 + } + } + var n = e.types + return { + inherits: r(1818), + visitor: { + Program: { + exit: function(e, r) { + var s = e.get("body").pop() + if (t(s)) { + var a = s.node.expression, + u = a.arguments, + l = 3 === u.length ? u.shift() : null, + c = a.arguments[0], + p = a.arguments[1], + f = r.opts.globals || {}, + h = c.elements.map(function(e) { + return "module" === e.value || "exports" === e.value + ? n.identifier(e.value) + : n.callExpression(n.identifier("require"), [e]) + }), + d = c.elements.map(function(e) { + if ("module" === e.value) return n.identifier("mod") + if ("exports" === e.value) + return n.memberExpression( + n.identifier("mod"), + n.identifier("exports") + ) + var t = i.basename(e.value, i.extname(e.value)), + r = f[t] || t + return n.memberExpression( + n.identifier("global"), + n.identifier(n.toIdentifier(r)) + ) + }), + m = n.identifier( + n.toIdentifier( + l ? l.value : this.file.opts.basename + ) + ) + s.replaceWith( + o({ + MODULE_NAME: l, + BROWSER_ARGUMENTS: d, + AMD_ARGUMENTS: c, + COMMON_ARGUMENTS: h, + GLOBAL_ARG: m, + FUNC: p + }) + ) + } + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7332, 5087], + [7336, 5090], + [7337, 5091], + [7338, 5092], + [7342, 5094], + [7343, 1973], + [7344, 5080, 5079, 1973], + 1937, + [7346, 5119, 5118, 5111], + [7347, 5113], + [7349, 108], + [7350, 108], + [7351, 108, 5114], + [7352, 108, 5115], + [7353, 1117, 240], + [7354, 5116, 240], + [7356, 1117, 240], + [7357, 1117, 5117, 240], + 2581, + 2582, + [7359, 1109, 426], + [7360, 5096], + [7362, 108], + [7366, 1109], + [7367, 1109], + 559, + [7368, 108, 1115, 1116, 1113, 426], + 1379, + [7370, 108, 520], + [7377, 5108, 1110], + 1384, + [7379, 1110], + [7381, 5098, 426, 689, 240], + [7382, 1975, 5110, 240], + [7383, 5097, 5105, 689, 520, 1978], + [7384, 687], + [7386, 520, 1114], + [7387, 1114, 1977], + [7388, 5109, 1114], + 373, + [7390, 5107, 1978], + [7392, 5112, 689], + [7393, 1108, 69, 42, 5219, 1127, 5227, 427, 1992, 59], + [7394, 339, 239, 69, 42, 340, 59], + [7397, 42, 69, 59, 340], + 2609, + [7398, 239, 69, 427], + [7399, 42, 59], + 2612, + [7400, 69, 42, 340, 59], + [7402, 42, 5130, 59], + [7403, 42, 59], + [7404, 42, 1974, 59, 5129], + [7405, 69, 42, 1121, 59], + [7406, 339, 42, 59], + 2619, + [7408, 239, 69, 42, 1984, 5132, 340, 59], + [7409, 5133], + [7410, 69, 42, 5139, 427, 340, 1992, 59], + [7413, 339, 69, 42, 1986, 59], + [7414, 1107, 239, 42, 69, 1985, 1119, 59, 2005], + [7317, 69, 5155, 1989, 5154, 5153, 5140], + [7318, 5145, 5141, 5148, 5146, 5150], + [7319, 5143], + 2516, + [7321, 1987, 5144], + [7322, 1987], + 2519, + [7323, 5147], + 2521, + [7324, 5149], + 2521, + 2524, + 2525, + [7325, 1988], + [7326, 5151, 1988, 5152], + 2528, + [7327, 5156], + 2530, + [7431, 5158], + [7432, 5159], + 2648, + [7415, 7296], + 2626, + [7329, 5163], + 2533, + [7417, 5078, 69, 42, 5223, 5222, 5224, 2006, 427, 59], + [7418, 42, 69, 59, 1120, 241], + [7419, 69, 241], + [7420, 69, 241], + [7421, 69, 241], + [7423, 241, 5165, 5166, 5168, 5170, 5171, 5167], + [7424, 69, 241], + [7425, 69, 241], + [7426, 42, 59], + [7428, 42, 59], + [7430, 69, 42, 1990, 5177, 59, 1120], + 2525, + [7325, 1991], + [7326, 5175, 1991, 5176], + 2644, + 2650, + [7433, 5188, 5198, 692, 5218], + [7434, 5182], + [7435, 1995, 5190, 5208], + [7437, 5202, 690], + 1399, + 2658, + 2659, + [7438, 428], + [7440, 5194, 5195, 521, 2008, 5230], + 1402, + [7442, 1999, 5204], + [7444, 1998, 2007], + [7449, 5209, 5210, 5211, 155, 5225], + [7450, 2001, 244], + [7451, 5193, 5212, 244], + [7452, 1122, 2001, 2003, 155, 1125, 2004, 1993, 244, 1126], + [7453, 1122, 1126], + 815, + [7454, 2e3, 5201, 5206], + 2672, + 2673, + [7456, 133], + [7457, 133], + [7458, 521, 692, 1994], + [7459, 1123, 242, 244], + [7460, 244], + [7461, 5183, 690], + [7462, 1994], + [7463, 521, 155], + [7464, 5185], + 2683, + [7465, 428], + [7467, 2004, 5228], + 2687, + 2688, + [7469, 5200], + 2690, + [7474, 693, 155, 691, 242, 2007], + 2692, + [7478, 1997, 521], + [7481, 133], + [7482, 5220, 243], + [7483, 243], + [7484, 5191, 693, 243], + [7485, 133], + [7487, 242, 243], + [7489, 1127, 5186, 5207], + [7490, 1122, 2003, 693, 155, 691, 1125, 242, 1993, 1126], + [7493, 428, 244], + [7494, 5199, 428], + [7495, 2002, 5196, 1125], + [7501, 250, 701, 70, 34, 5232, 695, 49], + [7500, 34, 49], + [7394, 250, 249, 70, 34, 341, 49], + [7397, 34, 70, 49, 341], + 2609, + [7398, 249, 70, 522], + [7399, 34, 49], + 2612, + [7400, 70, 34, 341, 49], + [7402, 34, 5242, 49], + [7403, 34, 49], + [7404, 34, 2040, 49, 5241], + [7405, 70, 34, 1129, 49], + [7406, 250, 34, 49], + 2619, + [7408, 249, 70, 34, 2010, 5244, 341, 49], + [7409, 5245], + [7410, 70, 34, 5251, 522, 341, 5269, 49], + [7413, 250, 70, 34, 2012, 49], + [7414, 1138, 249, 34, 70, 2011, 695, 49, 5296], + [7317, 70, 5267, 2022, 5266, 5265, 5252], + [7318, 5257, 5253, 5260, 5258, 5262], + [7319, 5255], + 2516, + [7321, 2013, 5256], + [7322, 2013], + 2519, + [7323, 5259], + 2521, + [7324, 5261], + 2521, + 2524, + 2525, + [7325, 2014], + [7326, 5263, 2014, 5264], + 2528, + [7327, 5268], + 2530, + 810, + [7431, 5271], + [7432, 5272], + 2648, + [7415, 7297], + 2626, + 1399, + 812, + 2659, + [7438, 698], + [7441, 5275, 5276, 2016, 5282, 5291, 5292, 5293, 697, 429], + 1402, + [7443, 5288], + [7445, 5281, 698], + [7447, 5290], + 1409, + 2672, + 2673, + [7458, 2017, 1132, 2015], + [7460, 5295], + [7462, 2015], + 2687, + 2688, + [7469, 5286], + 2690, + [7474, 2020, 697, 1131, 523, 5301], + [7475, 429], + [7477, 5279, 2017, 1132], + [7481, 429], + [7482, 5297, 696], + [7486, 696], + [7489, 2021, 5277, 5289], + [7492, 2020, 697, 1131, 523, 429], + [7494, 5285, 698], + 1420, + [7329, 5305], + 2533, + [7417, 5371, 70, 34, 5364, 5363, 5365, 5366, 522, 49], + [7418, 34, 70, 49, 1133, 245], + [7419, 70, 245], + [7420, 70, 245], + [7421, 70, 245], + [7423, 245, 5307, 5308, 5310, 5312, 5313, 5309], + [7424, 70, 245], + [7425, 70, 245], + [7426, 34, 49], + [7428, 34, 49], + [7430, 70, 34, 2023, 5319, 49, 1133], + 2525, + [7325, 2024], + [7326, 5317, 2024, 5318], + 2650, + 1397, + [7433, 5329, 5342, 2032, 5359], + [7434, 5324], + [7435, 2025, 5332, 5349], + [7437, 5345, 699], + 1399, + 2658, + [7439, 5331, 700], + [7440, 5337, 5338, 1134, 2037, 5369], + [7441, 5326, 2025, 5328, 2027, 5355, 5356, 5357, 248, 134], + 1402, + [7442, 2027, 5346], + [7444, 2026, 2036], + [7447, 5354], + [7449, 5350, 5351, 5352, 248, 5367], + [7450, 2029, 247], + [7451, 5336, 5353, 247], + [7452, 2028, 2029, 5340, 248, 2033, 2034, 5321, 247, 2035], + [7453, 2028, 2035], + 1410, + 815, + [7454, 5334, 5344, 5348], + 2673, + [7456, 134], + [7457, 134], + [7459, 2031, 430, 247], + [7460, 247], + [7461, 5325, 699], + [7463, 1134, 248], + [7464, 5327], + 2683, + [7465, 700], + [7467, 2034, 5368], + 2687, + 2688, + [7469, 5343], + 2690, + [7474, 1137, 248, 1136, 430, 2036], + 2692, + [7477, 5330, 1134, 2032], + [7481, 134], + [7482, 5361, 246], + [7483, 246], + [7484, 5333, 1137, 246], + [7485, 134], + [7486, 246], + [7487, 430, 246], + [7493, 700, 247], + [7495, 2030, 5339, 2033], + 2644, + [7332, 5380], + [7336, 5383], + [7337, 5384], + [7338, 5385], + [7342, 5387], + [7343, 2039], + [7344, 5373, 5372, 2039], + 1937, + [7346, 5412, 5411, 5404], + [7347, 5406], + [7349, 109], + [7350, 109], + [7351, 109, 5407], + [7352, 109, 5408], + [7353, 1147, 251], + [7354, 5409, 251], + [7356, 1147, 251], + [7357, 1147, 5410, 251], + 2581, + 2582, + [7359, 1139, 431], + [7360, 5389], + [7362, 109], + [7366, 1139], + [7367, 1139], + 559, + [7368, 109, 1145, 1146, 1143, 431], + 1379, + [7370, 109, 524], + [7377, 5401, 1140], + 1384, + [7379, 1140], + [7381, 5391, 431, 704, 251], + [7382, 2041, 5403, 251], + [7383, 5390, 5398, 704, 524, 2044], + [7384, 702], + [7386, 524, 1144], + [7387, 1144, 2043], + [7388, 5402, 1144], + 373, + [7390, 5400, 2044], + [7392, 5405, 704], + function(e, t, r) { + "use strict" + function n(e) { + for (var t = e.params, r = 0; r < t.length; r++) { + var n = t[r] + if (!h.isIdentifier(n)) return !0 + } + return !1 + } + var i = r(50)["default"], + s = r(24)["default"] + t.__esModule = !0 + var a = r(5418), + o = i(a), + u = r(5416), + l = i(u), + c = r(2060), + p = i(c), + f = r(28), + h = s(f), + d = p["default"]( + "\n let VARIABLE_NAME =\n ARGUMENTS.length <= ARGUMENT_KEY || ARGUMENTS[ARGUMENT_KEY] === undefined ?\n DEFAULT_VALUE\n :\n ARGUMENTS[ARGUMENT_KEY];\n" + ), + m = p["default"]( + "\n if (VARIABLE_NAME === undefined) VARIABLE_NAME = DEFAULT_VALUE;\n" + ), + y = p["default"]("\n let $0 = $1[$2];\n"), + v = { + ReferencedIdentifier: function(e, t) { + var r = e.node.name + ;("eval" === r || + (e.scope.hasOwnBinding(r) && + "param" !== e.scope.getOwnBinding(r).kind)) && + ((t.iife = !0), e.stop()) + }, + Scope: function(e) { + e.skip() + } + }, + g = { + Function: function(e) { + function t(e, t, n) { + var s = void 0 + ;(s = + r(n) || h.isPattern(e) + ? d({ + VARIABLE_NAME: e, + DEFAULT_VALUE: t, + ARGUMENT_KEY: h.numericLiteral(n), + ARGUMENTS: c + }) + : m({ VARIABLE_NAME: e, DEFAULT_VALUE: t })), + (s._blockHoist = i.params.length - n), + u.push(s) + } + function r(e) { + return e + 1 > p + } + var i = e.node, + s = e.scope + if (n(i)) { + e.ensureBlock() + var a = { iife: !1, scope: s }, + u = [], + c = h.identifier("arguments") + c._shadowedFunctionLiteral = e + for ( + var p = o["default"](i), f = e.get("params"), g = 0; + g < f.length; + g++ + ) { + var E = f[g] + if (E.isAssignmentPattern()) { + var b = E.get("left"), + x = E.get("right") + if (r(g) || b.isPattern()) { + var A = s.generateUidIdentifier("x") + ;(A._isDefaultPlaceholder = !0), (i.params[g] = A) + } else i.params[g] = b.node + a.iife || + (x.isIdentifier() && + s.hasOwnBinding(x.node.name) && + "param" !== s.getOwnBinding(x.node.name).kind + ? (a.iife = !0) + : x.traverse(v, a)), + t(b.node, x.node, g) + } else E.isIdentifier() || E.traverse(v, a) + } + for (var g = p + 1; g < i.params.length; g++) { + var E = i.params[g] + if (!E._isDefaultPlaceholder) { + var D = y(E, c, h.numericLiteral(g)) + ;(D._blockHoist = i.params.length - g), u.push(D) + } + } + ;(i.params = i.params.slice(0, p)), + a.iife + ? (u.push(l["default"](e, s)), + e.set("body", h.blockStatement(u))) + : e.get("body").unshiftContainer("body", u) + } + } + } + t.visitor = g + }, + function(e, t, r) { + "use strict" + var n = r(24)["default"] + t.__esModule = !0 + var i = r(28), + s = n(i), + a = { + Function: function(e) { + for ( + var t = e.get("params"), + r = s.isRestElement(t[t.length - 1]) ? 1 : 0, + n = t.length - r, + i = 0; + n > i; + i++ + ) { + var a = t[i] + if (a.isArrayPattern() || a.isObjectPattern()) { + var o = e.scope.generateUidIdentifier("ref"), + u = s.variableDeclaration("let", [ + s.variableDeclarator(a.node, o) + ]) + ;(u._blockHoist = n - i), + e.ensureBlock(), + e.get("body").unshiftContainer("body", u), + a.replaceWith(o) + } + } + } + } + t.visitor = a + }, + function(e, t, r) { + "use strict" + function n(e) { + return p.isRestElement(e.params[e.params.length - 1]) + } + function i(e, t, r) { + var n = void 0 + ;(n = p.isNumericLiteral(e.parent.property) + ? p.numericLiteral(e.parent.property.value + r) + : p.binaryExpression("+", e.parent.property, p.numericLiteral(r))), + e.parentPath.replaceWith(h({ ARGUMENTS: t, INDEX: n })) + } + function s(e, t, r, n) { + n + ? e.parentPath.replaceWith(p.binaryExpression("-", t, p.numericLiteral(n))) + : e.replaceWith(r) + } + var a = r(50)["default"], + o = r(24)["default"] + t.__esModule = !0 + var u = r(2060), + l = a(u), + c = r(28), + p = o(c), + f = l["default"]( + "\n for (var LEN = ARGUMENTS.length,\n ARRAY = Array(ARRAY_LEN),\n KEY = START;\n KEY < LEN;\n KEY++) {\n ARRAY[ARRAY_KEY] = ARGUMENTS[KEY];\n }\n" + ), + h = l["default"]( + "\n ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX]\n" + ), + d = { + Scope: function(e, t) { + e.scope.bindingIdentifierEquals(t.name, t.outerBinding) || e.skip() + }, + Flow: function(e) { + e.skip() + }, + Function: function(e, t) { + var r = t.noOptimise + ;(t.noOptimise = !0), e.traverse(d, t), (t.noOptimise = r), e.skip() + }, + ReferencedIdentifier: function(e, t) { + var r = e.node + if (("arguments" === r.name && (t.deopted = !0), r.name === t.name)) + if (t.noOptimise) t.deopted = !0 + else { + var n = e.parentPath, + i = n.parentPath + if ( + n.isMemberExpression({ computed: !0, object: r }) && + (!i.isAssignmentExpression() || n.node !== i.node.left) + ) { + var s = n.get("property") + if (s.isBaseType("number")) + return void t.candidates.push({ + cause: "indexGetter", + path: e + }) + } + if (n.isMemberExpression({ computed: !1, object: r })) { + var s = n.get("property") + if ("length" === s.node.name) + return void t.candidates.push({ + cause: "lengthGetter", + path: e + }) + } + if (0 === t.offset && n.isSpreadElement()) { + var a = n.parentPath + if (a.isCallExpression() && 1 === a.node.arguments.length) + return void t.candidates.push({ + cause: "argSpread", + path: e + }) + } + t.references.push(e) + } + }, + BindingIdentifier: function(e, t) { + var r = e.node + r.name === t.name && (t.deopted = !0) + } + }, + m = { + Function: function(e) { + var t = e.node, + r = e.scope + if (n(t)) { + var a = t.params.pop().argument, + o = p.identifier("arguments"), + u = p.memberExpression(o, p.identifier("length")) + o._shadowedFunctionLiteral = e + var l = { + references: [], + offset: t.params.length, + argumentsNode: o, + outerBinding: r.getBindingIdentifier(a.name), + candidates: [], + name: a.name, + deopted: !1 + } + if ((e.traverse(d, l), l.deopted || l.references.length)) { + ;(l.references = l.references.concat( + l.candidates.map(function(e) { + var t = e.path + return t + }) + )), + (l.deopted = l.deopted || !!t.shadow) + var c = p.numericLiteral(t.params.length), + h = r.generateUidIdentifier("key"), + m = r.generateUidIdentifier("len"), + y = h, + v = m + t.params.length && + ((y = p.binaryExpression("-", h, c)), + (v = p.conditionalExpression( + p.binaryExpression(">", m, c), + p.binaryExpression("-", m, c), + p.numericLiteral(0) + ))) + var g = f({ + ARGUMENTS: o, + ARRAY_KEY: y, + ARRAY_LEN: v, + START: c, + ARRAY: a, + KEY: h, + LEN: m + }) + if (l.deopted) + (g._blockHoist = t.params.length + 1), + t.body.body.unshift(g) + else { + g._blockHoist = 1 + var E = e + .getEarliestCommonAncestorFrom(l.references) + .getStatementParent() + E.findParent(function(e) { + return e.isLoop() ? void (E = e) : e.isFunction() + }), + E.insertBefore(g) + } + } else + for (var b = l.candidates, x = 0; x < b.length; x++) { + var A = b[x], + D = A.path, + C = A.cause + switch (C) { + case "indexGetter": + i(D, o, l.offset) + break + case "lengthGetter": + s(D, u, o, l.offset) + break + default: + D.replaceWith(o) + } + } + } + } + } + t.visitor = m + }, + function(e, t, r) { + "use strict" + var n = r(50)["default"], + i = r(24)["default"] + t.__esModule = !0 + var s = r(5417), + a = n(s), + o = r(28), + u = i(o), + l = { + enter: function(e, t) { + e.isThisExpression() && (t.foundThis = !0), + e.isReferencedIdentifier({ name: "arguments" }) && + (t.foundArguments = !0) + }, + Function: function(e) { + e.skip() + } + } + ;(t["default"] = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] ? e.scope : arguments[1] + return (function() { + var r = e.node, + n = u.functionExpression(null, [], r.body, r.generator, r.async), + i = n, + s = [] + a["default"](e, function(e) { + return t.push({ id: e }) + }) + var o = { foundThis: !1, foundArguments: !1 } + e.traverse(l, o), + o.foundArguments && + ((i = u.memberExpression(n, u.identifier("apply"))), + (s = []), + o.foundThis && s.push(u.thisExpression()), + o.foundArguments && + (o.foundThis || s.push(u.nullLiteral()), + s.push(u.identifier("arguments")))) + var c = u.callExpression(i, s) + return r.generator && (c = u.yieldExpression(c, !0)), u.returnStatement(c) + })() + }), + (e.exports = t["default"]) + }, + [7502, 24, 28], + [7498, 24, 28], + [7332, 5428], + [7336, 5431], + [7337, 5432], + [7338, 5433], + [7342, 5435], + [7343, 2050], + [7344, 5421, 5420, 2050], + 1937, + [7346, 5460, 5459, 5452], + [7347, 5454], + [7349, 110], + [7350, 110], + [7351, 110, 5455], + [7352, 110, 5456], + [7353, 1158, 253], + [7354, 5457, 253], + [7356, 1158, 253], + [7357, 1158, 5458, 253], + 2581, + 2582, + [7359, 1150, 432], + [7360, 5437], + [7362, 110], + [7366, 1150], + [7367, 1150], + 559, + [7368, 110, 1156, 1157, 1154, 432], + 1379, + [7370, 110, 525], + [7377, 5449, 1151], + 1384, + [7379, 1151], + [7381, 5439, 432, 708, 253], + [7382, 2052, 5451, 253], + [7383, 5438, 5446, 708, 525, 2055], + [7384, 706], + [7386, 525, 1155], + [7387, 1155, 2054], + [7388, 5450, 1155], + 373, + [7390, 5448, 2055], + [7392, 5453, 708], + 810, + 1397, + 1398, + 1399, + 812, + [7438, 1163], + [7441, 5464, 5465, 2061, 5470, 5479, 5480, 5481, 433, 434], + 1402, + [7443, 5477], + [7445, 5469, 1163], + [7446, 1161], + 1409, + 1410, + 815, + 2673, + [7458, 2062, 5482, 5463], + [7460, 1161], + [7466, 5472], + 2688, + [7469, 5475], + 2690, + [7471, 1159, 709, 434], + [7472, 433, 1161], + [7474, 1162, 433, 709, 526, 5491], + [7476, 5474, 433], + [7478, 5467, 2062], + [7481, 434], + [7482, 5487, 1160], + [7488, 5466, 2061, 5476], + [7490, 5471, 5473, 1162, 433, 709, 5483, 526, 5462, 5485], + [7492, 1162, 433, 709, 526, 434], + 1420, + [7394, 342, 252, 50, 24, 344, 28], + [7397, 24, 50, 28, 344], + 2609, + [7398, 252, 50, 343], + [7399, 24, 28], + 2612, + [7400, 50, 24, 344, 28], + [7402, 24, 5502, 28], + [7403, 24, 28], + [7404, 24, 2051, 28, 5501], + [7405, 50, 24, 1166, 28], + [7406, 342, 24, 28], + 2619, + [7408, 252, 50, 24, 2065, 5504, 344, 28], + [7409, 5505], + [7410, 50, 24, 5511, 343, 344, 5529, 28], + [7413, 342, 50, 24, 2067, 28], + [7414, 1148, 252, 24, 50, 2066, 1165, 28, 5556], + [7317, 50, 5527, 2077, 5526, 5525, 5512], + [7318, 5517, 5513, 5520, 5518, 5522], + [7319, 5515], + 2516, + [7321, 2068, 5516], + [7322, 2068], + 2519, + [7323, 5519], + 2521, + [7324, 5521], + 2521, + 2524, + 2525, + [7325, 2069], + [7326, 5523, 2069, 5524], + 2528, + [7327, 5528], + 2530, + 810, + [7431, 5531], + [7432, 5532], + 2648, + [7415, 7298], + 2626, + 1399, + 812, + 2659, + [7438, 712], + [7441, 5535, 5536, 2071, 5542, 5551, 5552, 5553, 711, 435], + 1402, + [7443, 5548], + [7445, 5541, 712], + [7447, 5550], + 1409, + 2672, + 2673, + [7458, 2072, 1169, 2070], + [7460, 5555], + [7462, 2070], + 2687, + 2688, + [7469, 5546], + 2690, + [7474, 2075, 711, 1168, 527, 5561], + [7475, 435], + [7477, 5539, 2072, 1169], + [7481, 435], + [7482, 5557, 710], + [7486, 710], + [7489, 2076, 5537, 5549], + [7492, 2075, 711, 1168, 527, 435], + [7494, 5545, 712], + 1420, + [7329, 5565], + 2533, + [7417, 5419, 50, 24, 5624, 5623, 5625, 5626, 343, 28], + [7418, 24, 50, 28, 1170, 254], + [7419, 50, 254], + [7420, 50, 254], + [7421, 50, 254], + [7423, 254, 5567, 5568, 5570, 5572, 5573, 5569], + [7424, 50, 254], + [7425, 50, 254], + [7426, 24, 28], + [7428, 24, 28], + [7430, 50, 24, 2078, 5579, 28, 1170], + 2525, + [7325, 2079], + [7326, 5577, 2079, 5578], + 2650, + 1397, + [7433, 5589, 5602, 2087, 5619], + [7434, 5584], + [7435, 2080, 5592, 5609], + [7437, 5605, 713], + 1399, + 2658, + [7439, 5591, 714], + [7440, 5597, 5598, 1171, 2092, 5629], + [7441, 5586, 2080, 5588, 2082, 5615, 5616, 5617, 257, 135], + 1402, + [7442, 2082, 5606], + [7444, 2081, 2091], + [7447, 5614], + [7449, 5610, 5611, 5612, 257, 5627], + [7450, 2084, 256], + [7451, 5596, 5613, 256], + [7452, 2083, 2084, 5600, 257, 2088, 2089, 5581, 256, 2090], + [7453, 2083, 2090], + 1410, + 815, + [7454, 5594, 5604, 5608], + 2673, + [7456, 135], + [7457, 135], + [7459, 2086, 436, 256], + [7460, 256], + [7461, 5585, 713], + [7463, 1171, 257], + [7464, 5587], + 2683, + [7465, 714], + [7467, 2089, 5628], + 2687, + 2688, + [7469, 5603], + 2690, + [7474, 1174, 257, 1173, 436, 2091], + 2692, + [7477, 5590, 1171, 2087], + [7481, 135], + [7482, 5621, 255], + [7483, 255], + [7484, 5593, 1174, 255], + [7485, 135], + [7486, 255], + [7487, 436, 255], + [7493, 714, 256], + [7495, 2085, 5599, 2088], + 2644, + [7332, 5640], + [7336, 5643], + [7337, 5644], + [7338, 5645], + [7342, 5647], + [7343, 2094], + [7344, 5633, 5632, 2094], + 1937, + [7346, 5672, 5671, 5664], + [7347, 5666], + [7349, 111], + [7350, 111], + [7351, 111, 5667], + [7352, 111, 5668], + [7353, 1184, 259], + [7354, 5669, 259], + [7356, 1184, 259], + [7357, 1184, 5670, 259], + 2581, + 2582, + [7359, 1176, 437], + [7360, 5649], + [7362, 111], + [7366, 1176], + [7367, 1176], + 559, + [7368, 111, 1182, 1183, 1180, 437], + 1379, + [7370, 111, 528], + [7377, 5661, 1177], + 1384, + [7379, 1177], + [7381, 5651, 437, 718, 259], + [7382, 2097, 5663, 259], + [7383, 5650, 5658, 718, 528, 2100], + [7384, 716], + [7386, 528, 1181], + [7387, 1181, 2099], + [7388, 5662, 1181], + 373, + [7390, 5660, 2100], + [7392, 5665, 718], + [7417, 5631, 77, 43, 5773, 5772, 5774, 2127, 529, 60], + [7418, 43, 77, 60, 1185, 260], + [7419, 77, 260], + [7420, 77, 260], + [7421, 77, 260], + [7423, 260, 5674, 5675, 5677, 5679, 5680, 5676], + [7424, 77, 260], + [7425, 77, 260], + [7426, 43, 60], + [7428, 43, 60], + [7430, 77, 43, 2105, 2113, 60, 1185], + [7394, 345, 258, 77, 43, 346, 60], + [7397, 43, 77, 60, 346], + 2609, + [7398, 258, 77, 529], + [7399, 43, 60], + 2612, + [7400, 77, 43, 346, 60], + [7402, 43, 5693, 60], + [7403, 43, 60], + [7404, 43, 2096, 60, 5692], + [7405, 77, 43, 1188, 60], + [7406, 345, 43, 60], + 2619, + [7408, 258, 77, 43, 2107, 5695, 346, 60], + [7409, 5696], + [7410, 77, 43, 5702, 529, 346, 5717, 60], + [7413, 345, 77, 43, 2109, 60], + [7414, 1175, 258, 43, 77, 2108, 1187, 60, 2126], + [7317, 77, 5715, 2111, 5714, 2113, 5703], + [7318, 5708, 5704, 5711, 5709, 5713], + [7319, 5706], + 2516, + [7321, 2110, 5707], + [7322, 2110], + 2519, + [7323, 5710], + 2521, + [7324, 5712], + 2521, + 2524, + 2528, + [7327, 5716], + 2530, + 810, + [7431, 5719], + [7432, 5720], + 2648, + [7415, 7299], + 2626, + [7329, 5724], + 2533, + 2525, + [7325, 2112], + 2650, + 1397, + [7433, 5737, 5749, 721, 5769], + [7434, 5731], + [7435, 2115, 5740, 5759], + [7437, 5753, 720], + 1399, + 2658, + 2659, + [7438, 438], + [7440, 5744, 5745, 719, 2130, 5779], + [7441, 5733, 2115, 2116, 2118, 5765, 5766, 5767, 166, 136], + 1402, + [7442, 2118, 5755], + [7444, 2117, 2129], + [7449, 5760, 5761, 5762, 166, 5775], + [7450, 2121, 262], + [7451, 5743, 5763, 262], + [7452, 2119, 2121, 5747, 166, 2123, 2124, 5728, 262, 2125], + [7453, 2119, 2125], + 1410, + 815, + [7454, 2120, 5752, 5757], + 2672, + 2673, + [7456, 136], + [7457, 136], + [7458, 719, 721, 2114], + [7459, 1189, 347, 262], + [7460, 262], + [7461, 5732, 720], + [7462, 2114], + [7463, 719, 166], + [7464, 5734], + 2683, + [7465, 438], + [7467, 2124, 5777], + 2687, + 2688, + [7469, 5751], + 2690, + [7474, 1192, 166, 1191, 347, 2129], + 2692, + [7481, 136], + [7482, 5770, 261], + [7483, 261], + [7484, 5741, 1192, 261], + [7485, 136], + [7487, 347, 261], + [7489, 2128, 5735, 5758], + [7493, 438, 262], + [7494, 5750, 438], + [7495, 2122, 5746, 2123], + 2644, + [7503, 74, 35, 5782, 51], + [7504, 5783], + [7447, 5784], + 2687, + [7332, 5794], + [7336, 5797], + [7337, 5798], + [7338, 5799], + [7342, 5801], + [7343, 2132], + [7344, 5787, 5786, 2132], + 1937, + [7346, 5826, 5825, 5818], + [7347, 5820], + [7349, 112], + [7350, 112], + [7351, 112, 5821], + [7352, 112, 5822], + [7353, 1202, 264], + [7354, 5823, 264], + [7356, 1202, 264], + [7357, 1202, 5824, 264], + 2581, + 2582, + [7359, 1194, 439], + [7360, 5803], + [7362, 112], + [7366, 1194], + [7367, 1194], + 559, + [7368, 112, 1200, 1201, 1198, 439], + 1379, + [7370, 112, 530], + [7377, 5815, 1195], + 1384, + [7379, 1195], + [7381, 5805, 439, 726, 264], + [7382, 2135, 5817, 264], + [7383, 5804, 5812, 726, 530, 2138], + [7384, 724], + [7386, 530, 1199], + [7387, 1199, 2137], + [7388, 5816, 1199], + 373, + [7390, 5814, 2138], + [7392, 5819, 726], + [7417, 5785, 74, 35, 5927, 5926, 5928, 2165, 531, 51], + [7418, 35, 74, 51, 1203, 265], + [7419, 74, 265], + [7420, 74, 265], + [7421, 74, 265], + [7423, 265, 5828, 5829, 5831, 5833, 5834, 5830], + [7424, 74, 265], + [7425, 74, 265], + [7426, 35, 51], + [7428, 35, 51], + [7430, 74, 35, 2143, 2151, 51, 1203], + [7394, 348, 263, 74, 35, 349, 51], + [7397, 35, 74, 51, 349], + 2609, + [7398, 263, 74, 531], + [7399, 35, 51], + 2612, + [7400, 74, 35, 349, 51], + [7402, 35, 5847, 51], + [7403, 35, 51], + [7404, 35, 2134, 51, 5846], + [7405, 74, 35, 1206, 51], + [7406, 348, 35, 51], + 2619, + [7408, 263, 74, 35, 2145, 5849, 349, 51], + [7409, 5850], + [7410, 74, 35, 5856, 531, 349, 5871, 51], + [7413, 348, 74, 35, 2147, 51], + [7414, 1193, 263, 35, 74, 2146, 1205, 51, 2164], + [7317, 74, 5869, 2149, 5868, 2151, 5857], + [7318, 5862, 5858, 5865, 5863, 5867], + [7319, 5860], + 2516, + [7321, 2148, 5861], + [7322, 2148], + 2519, + [7323, 5864], + 2521, + [7324, 5866], + 2521, + 2524, + 2528, + [7327, 5870], + 2530, + 810, + [7431, 5873], + [7432, 5874], + 2648, + [7415, 7300], + 2626, + [7329, 5878], + 2533, + 2525, + [7325, 2150], + 2650, + 1397, + [7433, 5891, 5903, 729, 5923], + [7434, 5885], + [7435, 2153, 5894, 5913], + [7437, 5907, 728], + 1399, + 2658, + 2659, + [7438, 440], + [7440, 5898, 5899, 727, 2168, 5933], + [7441, 5887, 2153, 2154, 2156, 5919, 5920, 5921, 167, 137], + 1402, + [7442, 2156, 5909], + [7444, 2155, 2167], + [7449, 5914, 5915, 5916, 167, 5929], + [7450, 2159, 267], + [7451, 5897, 5917, 267], + [7452, 2157, 2159, 5901, 167, 2161, 2162, 5882, 267, 2163], + [7453, 2157, 2163], + 1410, + 815, + [7454, 2158, 5906, 5911], + 2672, + 2673, + [7456, 137], + [7457, 137], + [7458, 727, 729, 2152], + [7459, 1207, 350, 267], + [7460, 267], + [7461, 5886, 728], + [7462, 2152], + [7463, 727, 167], + [7464, 5888], + 2683, + [7465, 440], + [7467, 2162, 5931], + 2687, + 2688, + [7469, 5905], + 2690, + [7474, 1210, 167, 1209, 350, 2167], + 2692, + [7481, 137], + [7482, 5924, 266], + [7483, 266], + [7484, 5895, 1210, 266], + [7485, 137], + [7487, 350, 266], + [7489, 2166, 5889, 5912], + [7493, 440, 267], + [7494, 5904, 440], + [7495, 2160, 5900, 2161], + 2644, + [7341, 5936], + [7357, 5953, 5952, 2170], + 2581, + [7358, 5947], + [7360, 5937], + 557, + [7362, 441], + [7363, 732, 2170, 5939], + [7364, 1211, 441], + [7365, 441, 2174, 2171], + [7366, 2169], + [7367, 2169], + 559, + [7370, 441, 1211], + 1380, + [7373, 5944], + [7375, 441, 2173, 2177], + 373, + [ + 7391, + 441, + 732, + 2173, + 2171, + 5942, + 5950, + 2172, + 2175, + 5951, + 2176, + 2177, + 5948, + 5943, + 5941, + 5946, + 5938, + 1211, + 2174, + 5949 + ], + [7503, 71, 36, 6012, 61], + [7417, 6064, 71, 36, 6057, 6056, 6058, 2199, 532, 61], + [7418, 36, 71, 61, 1212, 268], + [7419, 71, 268], + [7420, 71, 268], + [7421, 71, 268], + [7423, 268, 5956, 5957, 5959, 5961, 5962, 5958], + [7424, 71, 268], + [7425, 71, 268], + [7426, 36, 61], + [7428, 36, 61], + [7430, 71, 36, 2178, 2186, 61, 1212], + [7394, 353, 271, 71, 36, 351, 61], + [7397, 36, 71, 61, 351], + 2609, + [7398, 271, 71, 532], + [7399, 36, 61], + 2612, + [7400, 71, 36, 351, 61], + [7402, 36, 5975, 61], + [7403, 36, 61], + [7404, 36, 2206, 61, 5974], + [7405, 71, 36, 1215, 61], + [7406, 353, 36, 61], + 2619, + [7408, 271, 71, 36, 2180, 5977, 351, 61], + [7409, 5978], + [7410, 71, 36, 5984, 532, 351, 5999, 61], + [7413, 353, 71, 36, 2182, 61], + [7414, 1221, 271, 36, 71, 2181, 1214, 61, 2198], + [7317, 71, 5997, 2184, 5996, 2186, 5985], + [7318, 5990, 5986, 5993, 5991, 5995], + [7319, 5988], + 2516, + [7321, 2183, 5989], + [7322, 2183], + 2519, + [7323, 5992], + 2521, + [7324, 5994], + 2521, + 2524, + 2528, + [7327, 5998], + 2530, + 810, + [7431, 6001], + [7432, 6002], + 2648, + [7415, 7301], + 2626, + [7329, 6006], + 2533, + 2525, + [7325, 2185], + 2644, + 2650, + 1397, + [7504, 1216], + [7433, 6021, 6033, 736, 6053], + [7434, 6015], + [7435, 2188, 6024, 6043], + [7437, 6037, 735], + 1399, + 2658, + 2659, + [7438, 442], + [7440, 6028, 6029, 734, 2202, 6063], + [7441, 6017, 2188, 2189, 2191, 6049, 6050, 6051, 168, 138], + 1402, + [7442, 2191, 6039], + [7444, 2190, 2201], + [7449, 6044, 6045, 6046, 168, 6059], + [7450, 2193, 270], + [7451, 6027, 6047, 270], + [7452, 2192, 2193, 6031, 168, 2195, 2196, 6011, 270, 2197], + [7453, 2192, 2197], + 1410, + 815, + [7454, 1216, 6036, 6041], + 2672, + 2673, + [7456, 138], + [7457, 138], + [7458, 734, 736, 2187], + [7459, 1217, 352, 270], + [7460, 270], + [7461, 6016, 735], + [7462, 2187], + [7463, 734, 168], + [7464, 6018], + 2683, + [7465, 442], + [7467, 2196, 6061], + 2687, + 2688, + [7469, 6035], + 2690, + [7474, 1220, 168, 1219, 352, 2201], + 2692, + [7481, 138], + [7482, 6054, 269], + [7483, 269], + [7484, 6025, 1220, 269], + [7485, 138], + [7487, 352, 269], + [7489, 2200, 6019, 6042], + [7493, 442, 270], + [7494, 6034, 442], + [7495, 2194, 6030, 2195], + [7332, 6073], + [7336, 6076], + [7337, 6077], + [7338, 6078], + [7342, 6080], + [7343, 2204], + [7344, 6066, 6065, 2204], + 1937, + [7346, 6105, 6104, 6097], + [7347, 6099], + [7349, 113], + [7350, 113], + [7351, 113, 6100], + [7352, 113, 6101], + [7353, 1230, 272], + [7354, 6102, 272], + [7356, 1230, 272], + [7357, 1230, 6103, 272], + 2581, + 2582, + [7359, 1222, 443], + [7360, 6082], + [7362, 113], + [7366, 1222], + [7367, 1222], + 559, + [7368, 113, 1228, 1229, 1226, 443], + 1379, + [7370, 113, 533], + [7377, 6094, 1223], + 1384, + [7379, 1223], + [7381, 6084, 443, 739, 272], + [7382, 2207, 6096, 272], + [7383, 6083, 6091, 739, 533, 2210], + [7384, 737], + [7386, 533, 1227], + [7387, 1227, 2209], + [7388, 6095, 1227], + 373, + [7390, 6093, 2210], + [7392, 6098, 739], + function(e, t, r) { + var n = r(2215) + ;(t.REGULAR = { + d: n().addRange(48, 57), + D: n() + .addRange(0, 47) + .addRange(58, 65535), + s: n(32, 160, 5760, 6158, 8239, 8287, 12288, 65279) + .addRange(9, 13) + .addRange(8192, 8202) + .addRange(8232, 8233), + S: n() + .addRange(0, 8) + .addRange(14, 31) + .addRange(33, 159) + .addRange(161, 5759) + .addRange(5761, 6157) + .addRange(6159, 8191) + .addRange(8203, 8231) + .addRange(8234, 8238) + .addRange(8240, 8286) + .addRange(8288, 12287) + .addRange(12289, 65278) + .addRange(65280, 65535), + w: n(95) + .addRange(48, 57) + .addRange(65, 90) + .addRange(97, 122), + W: n(96) + .addRange(0, 47) + .addRange(58, 64) + .addRange(91, 94) + .addRange(123, 65535) + }), + (t.UNICODE = { + d: n().addRange(48, 57), + D: n() + .addRange(0, 47) + .addRange(58, 1114111), + s: n(32, 160, 5760, 6158, 8239, 8287, 12288, 65279) + .addRange(9, 13) + .addRange(8192, 8202) + .addRange(8232, 8233), + S: n() + .addRange(0, 8) + .addRange(14, 31) + .addRange(33, 159) + .addRange(161, 5759) + .addRange(5761, 6157) + .addRange(6159, 8191) + .addRange(8203, 8231) + .addRange(8234, 8238) + .addRange(8240, 8286) + .addRange(8288, 12287) + .addRange(12289, 65278) + .addRange(65280, 1114111), + w: n(95) + .addRange(48, 57) + .addRange(65, 90) + .addRange(97, 122), + W: n(96) + .addRange(0, 47) + .addRange(58, 64) + .addRange(91, 94) + .addRange(123, 1114111) + }), + (t.UNICODE_IGNORE_CASE = { + d: n().addRange(48, 57), + D: n() + .addRange(0, 47) + .addRange(58, 1114111), + s: n(32, 160, 5760, 6158, 8239, 8287, 12288, 65279) + .addRange(9, 13) + .addRange(8192, 8202) + .addRange(8232, 8233), + S: n() + .addRange(0, 8) + .addRange(14, 31) + .addRange(33, 159) + .addRange(161, 5759) + .addRange(5761, 6157) + .addRange(6159, 8191) + .addRange(8203, 8231) + .addRange(8234, 8238) + .addRange(8240, 8286) + .addRange(8288, 12287) + .addRange(12289, 65278) + .addRange(65280, 1114111), + w: n(95, 383, 8490) + .addRange(48, 57) + .addRange(65, 90) + .addRange(97, 122), + W: n(75, 83, 96) + .addRange(0, 47) + .addRange(58, 64) + .addRange(91, 94) + .addRange(123, 1114111) + }) + }, + function(e, t, r) { + var n + ;(function(e, i) { + ;(function() { + "use strict" + function s() { + var e, + t, + r = 16384, + n = [], + i = -1, + s = arguments.length + if (!s) return "" + for (var a = ""; ++i < s; ) { + var o = Number(arguments[i]) + if (!isFinite(o) || 0 > o || o > 1114111 || _(o) != o) + throw RangeError("Invalid code point: " + o) + 65535 >= o + ? n.push(o) + : ((o -= 65536), + (e = (o >> 10) + 55296), + (t = (o % 1024) + 56320), + n.push(e, t)), + (i + 1 == s || n.length > r) && + ((a += w.apply(null, n)), (n.length = 0)) + } + return a + } + function a(e, t) { + if (-1 == t.indexOf("|")) { + if (e == t) return + throw Error("Invalid node type: " + e) + } + if ( + ((t = a.hasOwnProperty(t) + ? a[t] + : (a[t] = RegExp("^(?:" + t + ")$"))), + !t.test(e)) + ) + throw Error("Invalid node type: " + e) + } + function o(e) { + var t = e.type + if (o.hasOwnProperty(t) && "function" == typeof o[t]) return o[t](e) + throw Error("Invalid node type: " + t) + } + function u(e) { + a(e.type, "alternative") + var t = e.body, + r = t ? t.length : 0 + if (1 == r) return b(t[0]) + for (var n = -1, i = ""; ++n < r; ) i += b(t[n]) + return i + } + function l(e) { + switch ((a(e.type, "anchor"), e.kind)) { + case "start": + return "^" + case "end": + return "$" + case "boundary": + return "\\b" + case "not-boundary": + return "\\B" + default: + throw Error("Invalid assertion") + } + } + function c(e) { + return ( + a( + e.type, + "anchor|characterClass|characterClassEscape|dot|group|reference|value" + ), + o(e) + ) + } + function p(e) { + a(e.type, "characterClass") + var t = e.body, + r = t ? t.length : 0, + n = -1, + i = "[" + for (e.negative && (i += "^"); ++n < r; ) i += d(t[n]) + return (i += "]") + } + function f(e) { + return a(e.type, "characterClassEscape"), "\\" + e.value + } + function h(e) { + a(e.type, "characterClassRange") + var t = e.min, + r = e.max + if ("characterClassRange" == t.type || "characterClassRange" == r.type) + throw Error("Invalid character class range") + return d(t) + "-" + d(r) + } + function d(e) { + return ( + a( + e.type, + "anchor|characterClassEscape|characterClassRange|dot|value" + ), + o(e) + ) + } + function m(e) { + a(e.type, "disjunction") + var t = e.body, + r = t ? t.length : 0 + if (0 == r) throw Error("No body") + if (1 == r) return o(t[0]) + for (var n = -1, i = ""; ++n < r; ) 0 != n && (i += "|"), (i += o(t[n])) + return i + } + function y(e) { + return a(e.type, "dot"), "." + } + function v(e) { + a(e.type, "group") + var t = "(" + switch (e.behavior) { + case "normal": + break + case "ignore": + t += "?:" + break + case "lookahead": + t += "?=" + break + case "negativeLookahead": + t += "?!" + break + default: + throw Error("Invalid behaviour: " + e.behaviour) + } + var r = e.body, + n = r ? r.length : 0 + if (1 == n) t += o(r[0]) + else for (var i = -1; ++i < n; ) t += o(r[i]) + return (t += ")") + } + function g(e) { + a(e.type, "quantifier") + var t = "", + r = e.min, + n = e.max + switch (n) { + case void 0: + case null: + switch (r) { + case 0: + t = "*" + break + case 1: + t = "+" + break + default: + t = "{" + r + ",}" + } + break + default: + t = + r == n + ? "{" + r + "}" + : 0 == r && 1 == n + ? "?" + : "{" + r + "," + n + "}" + } + return e.greedy || (t += "?"), c(e.body[0]) + t + } + function E(e) { + return a(e.type, "reference"), "\\" + e.matchIndex + } + function b(e) { + return ( + a( + e.type, + "anchor|characterClass|characterClassEscape|empty|group|quantifier|reference|value" + ), + o(e) + ) + } + function x(e) { + a(e.type, "value") + var t = e.kind, + r = e.codePoint + switch (t) { + case "controlLetter": + return "\\c" + s(r + 64) + case "hexadecimalEscape": + return "\\x" + ("00" + r.toString(16).toUpperCase()).slice(-2) + case "identifier": + return "\\" + s(r) + case "null": + return "\\" + r + case "octal": + return "\\" + r.toString(8) + case "singleEscape": + switch (r) { + case 8: + return "\\b" + case 9: + return "\\t" + case 10: + return "\\n" + case 11: + return "\\v" + case 12: + return "\\f" + case 13: + return "\\r" + default: + throw Error("Invalid codepoint: " + r) + } + case "symbol": + return s(r) + case "unicodeEscape": + return "\\u" + ("0000" + r.toString(16).toUpperCase()).slice(-4) + case "unicodeCodePointEscape": + return "\\u{" + r.toString(16).toUpperCase() + "}" + default: + throw Error("Unsupported node kind: " + t) + } + } + var A = { function: !0, object: !0 }, + D = (A[typeof window] && window) || this, + C = A[typeof t] && t, + S = A[typeof e] && e && !e.nodeType && e, + F = C && S && "object" == typeof i && i + !F || (F.global !== F && F.window !== F && F.self !== F) || (D = F) + var w = String.fromCharCode, + _ = Math.floor + ;(o.alternative = u), + (o.anchor = l), + (o.characterClass = p), + (o.characterClassEscape = f), + (o.characterClassRange = h), + (o.disjunction = m), + (o.dot = y), + (o.group = v), + (o.quantifier = g), + (o.reference = E), + (o.value = x), + (n = function() { + return { generate: o } + }.call(t, r, t, e)), + !(void 0 !== n && (e.exports = n)) + }.call(this)) + }.call( + t, + r(25)(e), + (function() { + return this + })() + )) + }, + function(e, t) { + !(function() { + function t(e, t) { + function r(t) { + return (t.raw = e.substring(t.range[0], t.range[1])), t + } + function n(e, t) { + return (e.range[0] = t), r(e) + } + function i(e, t) { + return r({ type: "anchor", kind: e, range: [$ - t, $] }) + } + function s(e, t, n, i) { + return r({ type: "value", kind: e, codePoint: t, range: [n, i] }) + } + function a(e, t, r, n) { + return (n = n || 0), s(e, t, $ - (r.length + n), $) + } + function o(e) { + var t = e[0], + r = t.charCodeAt(0) + if (z) { + var n + if ( + 1 === t.length && + r >= 55296 && + 56319 >= r && + ((n = x().charCodeAt(0)), n >= 56320 && 57343 >= n) + ) + return ( + $++, + s( + "symbol", + 1024 * (r - 55296) + n - 56320 + 65536, + $ - 2, + $ + ) + ) + } + return s("symbol", r, $ - 1, $) + } + function u(e, t, n) { + return r({ type: "disjunction", body: e, range: [t, n] }) + } + function l() { + return r({ type: "dot", range: [$ - 1, $] }) + } + function c(e) { + return r({ type: "characterClassEscape", value: e, range: [$ - 2, $] }) + } + function p(e) { + return r({ + type: "reference", + matchIndex: parseInt(e, 10), + range: [$ - 1 - e.length, $] + }) + } + function f(e, t, n, i) { + return r({ type: "group", behavior: e, body: t, range: [n, i] }) + } + function h(e, t, n, i) { + return ( + null == i && ((n = $ - 1), (i = $)), + r({ + type: "quantifier", + min: e, + max: t, + greedy: !0, + body: null, + range: [n, i] + }) + ) + } + function d(e, t, n) { + return r({ type: "alternative", body: e, range: [t, n] }) + } + function m(e, t, n, i) { + return r({ + type: "characterClass", + body: e, + negative: t, + range: [n, i] + }) + } + function y(e, t, n, i) { + return ( + e.codePoint > t.codePoint && + Y( + "invalid range in character class", + e.raw + "-" + t.raw, + n, + i + ), + r({ type: "characterClassRange", min: e, max: t, range: [n, i] }) + ) + } + function v(e) { + return "alternative" === e.type ? e.body : [e] + } + function g(t) { + t = t || 1 + var r = e.substring($, $ + t) + return ($ += t || 1), r + } + function E(e) { + b(e) || Y("character", e) + } + function b(t) { + return e.indexOf(t, $) === $ ? g(t.length) : void 0 + } + function x() { + return e[$] + } + function A(t) { + return e.indexOf(t, $) === $ + } + function D(t) { + return e[$ + 1] === t + } + function C(t) { + var r = e.substring($), + n = r.match(t) + return ( + n && + ((n.range = []), + (n.range[0] = $), + g(n[0].length), + (n.range[1] = $)), + n + ) + } + function S() { + var e = [], + t = $ + for (e.push(F()); b("|"); ) e.push(F()) + return 1 === e.length ? e[0] : u(e, t, $) + } + function F() { + for (var e, t = [], r = $; (e = w()); ) t.push(e) + return 1 === t.length ? t[0] : d(t, r, $) + } + function w() { + if ($ >= e.length || A("|") || A(")")) return null + var t = T() + if (t) return t + var r = B() + r || Y("Expected atom") + var i = P() || !1 + return i ? ((i.body = v(r)), n(i, r.range[0]), i) : r + } + function _(e, t, r, n) { + var i = null, + s = $ + if (b(e)) i = t + else { + if (!b(r)) return !1 + i = n + } + var a = S() + a || Y("Expected disjunction"), E(")") + var o = f(i, v(a), s, $) + return "normal" == i && X && K++, o + } + function T() { + return b("^") + ? i("start", 1) + : b("$") + ? i("end", 1) + : b("\\b") + ? i("boundary", 2) + : b("\\B") + ? i("not-boundary", 2) + : _("(?=", "lookahead", "(?!", "negativeLookahead") + } + function P() { + var e, + t, + r, + n, + i = $ + return ( + b("*") + ? (t = h(0)) + : b("+") + ? (t = h(1)) + : b("?") + ? (t = h(0, 1)) + : (e = C(/^\{([0-9]+)\}/)) + ? ((r = parseInt(e[1], 10)), + (t = h(r, r, e.range[0], e.range[1]))) + : (e = C(/^\{([0-9]+),\}/)) + ? ((r = parseInt(e[1], 10)), + (t = h(r, void 0, e.range[0], e.range[1]))) + : (e = C(/^\{([0-9]+),([0-9]+)\}/)) && + ((r = parseInt(e[1], 10)), + (n = parseInt(e[2], 10)), + r > n && Y("numbers out of order in {} quantifier", "", i, $), + (t = h(r, n, e.range[0], e.range[1]))), + t && b("?") && ((t.greedy = !1), (t.range[1] += 1)), + t + ) + } + function B() { + var e + return (e = C(/^[^^$\\.*+?(){[|]/)) + ? o(e) + : b(".") + ? l() + : b("\\") + ? ((e = O()), e || Y("atomEscape"), e) + : (e = j()) + ? e + : _("(?:", "ignore", "(", "normal") + } + function k(e) { + if (z) { + var t, n + if ( + "unicodeEscape" == e.kind && + (t = e.codePoint) >= 55296 && + 56319 >= t && + A("\\") && + D("u") + ) { + var i = $ + $++ + var s = I() + "unicodeEscape" == s.kind && + (n = s.codePoint) >= 56320 && + 57343 >= n + ? ((e.range[1] = s.range[1]), + (e.codePoint = 1024 * (t - 55296) + n - 56320 + 65536), + (e.type = "value"), + (e.kind = "unicodeCodePointEscape"), + r(e)) + : ($ = i) + } + } + return e + } + function I() { + return O(!0) + } + function O(e) { + var t, + r = $ + if ((t = M())) return t + if (e) { + if (b("b")) return a("singleEscape", 8, "\\b") + b("B") && Y("\\B not possible inside of CharacterClass", "", r) + } + return (t = R()) + } + function M() { + var e, t + if ((e = C(/^(?!0)\d+/))) { + t = e[0] + var r = parseInt(e[0], 10) + return K >= r + ? p(e[0]) + : (J.push(r), + g(-e[0].length), + (e = C(/^[0-7]{1,3}/)) + ? a("octal", parseInt(e[0], 8), e[0], 1) + : ((e = o(C(/^[89]/))), n(e, e.range[0] - 1))) + } + return (e = C(/^[0-7]{1,3}/)) + ? ((t = e[0]), + /^0{1,3}$/.test(t) + ? a("null", 0, "0", t.length + 1) + : a("octal", parseInt(t, 8), t, 1)) + : (e = C(/^[dDsSwW]/)) + ? c(e[0]) + : !1 + } + function R() { + var e + if ((e = C(/^[fnrtv]/))) { + var t = 0 + switch (e[0]) { + case "t": + t = 9 + break + case "n": + t = 10 + break + case "v": + t = 11 + break + case "f": + t = 12 + break + case "r": + t = 13 + } + return a("singleEscape", t, "\\" + e[0]) + } + return (e = C(/^c([a-zA-Z])/)) + ? a("controlLetter", e[1].charCodeAt(0) % 32, e[1], 2) + : (e = C(/^x([0-9a-fA-F]{2})/)) + ? a("hexadecimalEscape", parseInt(e[1], 16), e[1], 2) + : (e = C(/^u([0-9a-fA-F]{4})/)) + ? k(a("unicodeEscape", parseInt(e[1], 16), e[1], 2)) + : z && (e = C(/^u\{([0-9a-fA-F]+)\}/)) + ? a("unicodeCodePointEscape", parseInt(e[1], 16), e[1], 4) + : N() + } + function L(e) { + var t = new RegExp( + "[ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ̀-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ҃-҇Ҋ-ԯԱ-Ֆՙա-և֑-ׇֽֿׁׂׅׄא-תװ-ײؐ-ؚؠ-٩ٮ-ۓە-ۜ۟-۪ۨ-ۼۿܐ-݊ݍ-ޱ߀-ߵߺࠀ-࠭ࡀ-࡛ࢠ-ࢲࣤ-ॣ०-९ॱ-ঃঅ-ঌএঐও-নপ-রলশ-হ়-ৄেৈো-ৎৗড়ঢ়য়-ৣ০-ৱਁ-ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹ਼ਾ-ੂੇੈੋ-੍ੑਖ਼-ੜਫ਼੦-ੵઁ-ઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હ઼-ૅે-ૉો-્ૐૠ-ૣ૦-૯ଁ-ଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହ଼-ୄେୈୋ-୍ୖୗଡ଼ଢ଼ୟ-ୣ୦-୯ୱஂஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹா-ூெ-ைொ-்ௐௗ௦-௯ఀ-ఃఅ-ఌఎ-ఐఒ-నప-హఽ-ౄె-ైొ-్ౕౖౘౙౠ-ౣ౦-౯ಁ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ಼-ೄೆ-ೈೊ-್ೕೖೞೠ-ೣ೦-೯ೱೲഁ-ഃഅ-ഌഎ-ഐഒ-ഺഽ-ൄെ-ൈൊ-ൎൗൠ-ൣ൦-൯ൺ-ൿංඃඅ-ඖක-නඳ-රලව-ෆ්ා-ුූෘ-ෟ෦-෯ෲෳก-ฺเ-๎๐-๙ກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ູົ-ຽເ-ໄໆ່-ໍ໐-໙ໜ-ໟༀ༘༙༠-༩༹༵༷༾-ཇཉ-ཬཱ-྄྆-ྗྙ-ྼ࿆က-၉ၐ-ႝႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ፝-፟ᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-᜔ᜠ-᜴ᝀ-ᝓᝠ-ᝬᝮ-ᝰᝲᝳក-៓ៗៜ៝០-៩᠋-᠍᠐-᠙ᠠ-ᡷᢀ-ᢪᢰ-ᣵᤀ-ᤞᤠ-ᤫᤰ-᤻᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-ᨛᨠ-ᩞ᩠-᩿᩼-᪉᪐-᪙ᪧ᪰-᪽ᬀ-ᭋ᭐-᭙᭫-᭳ᮀ-᯳ᰀ-᰷᱀-᱉ᱍ-ᱽ᳐-᳔᳒-ᳶ᳸᳹ᴀ-᷵᷼-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ‌‍‿⁀⁔ⁱⁿₐ-ₜ⃐-⃥⃜⃡-⃰ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ⵿-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⷠ-ⷿⸯ々-〇〡-〯〱-〵〸-〼ぁ-ゖ゙゚ゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-꙯ꙴ-꙽ꙿ-ꚝꚟ-꛱ꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞭꞰꞱꟷ-ꠧꡀ-ꡳꢀ-꣄꣐-꣙꣠-ꣷꣻ꤀-꤭ꤰ-꥓ꥠ-ꥼꦀ-꧀ꧏ-꧙ꧠ-ꧾꨀ-ꨶꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-꫶ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭟꭤꭥꯀ-ꯪ꯬꯭꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ︀-️︠-︭︳︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ]" + ) + return ( + 36 === e || + 95 === e || + (e >= 65 && 90 >= e) || + (e >= 97 && 122 >= e) || + (e >= 48 && 57 >= e) || + 92 === e || + (e >= 128 && t.test(String.fromCharCode(e))) + ) + } + function N() { + var e, + t = "‌", + r = "‍" + return L(x()) + ? b(t) + ? a("identifier", 8204, t) + : b(r) + ? a("identifier", 8205, r) + : null + : ((e = g()), a("identifier", e.charCodeAt(0), e, 1)) + } + function j() { + var e, + t = $ + return (e = C(/^\[\^/)) + ? ((e = U()), E("]"), m(e, !0, t, $)) + : b("[") + ? ((e = U()), E("]"), m(e, !1, t, $)) + : null + } + function U() { + var e + return A("]") ? [] : ((e = G()), e || Y("nonEmptyClassRanges"), e) + } + function V(e) { + var t, r, n + if (A("-") && !D("]")) { + E("-"), (n = q()), n || Y("classAtom"), (r = $) + var i = U() + return ( + i || Y("classRanges"), + (t = e.range[0]), + "empty" === i.type ? [y(e, n, t, r)] : [y(e, n, t, r)].concat(i) + ) + } + return (n = W()), n || Y("nonEmptyClassRangesNoDash"), [e].concat(n) + } + function G() { + var e = q() + return e || Y("classAtom"), A("]") ? [e] : V(e) + } + function W() { + var e = q() + return e || Y("classAtom"), A("]") ? e : V(e) + } + function q() { + return b("-") ? o("-") : H() + } + function H() { + var e + return (e = C(/^[^\\\]-]/)) + ? o(e[0]) + : b("\\") + ? ((e = I()), e || Y("classEscape"), k(e)) + : void 0 + } + function Y(t, r, n, i) { + ;(n = null == n ? $ : n), (i = null == i ? n : i) + var s = Math.max(0, n - 10), + a = Math.min(i + 10, e.length), + o = " " + e.substring(s, a), + u = " " + new Array(n - s + 1).join(" ") + "^" + throw SyntaxError( + t + " at position " + n + (r ? ": " + r : "") + "\n" + o + "\n" + u + ) + } + var J = [], + K = 0, + X = !0, + z = -1 !== (t || "").indexOf("u"), + $ = 0 + ;(e = String(e)), "" === e && (e = "(?:)") + var Q = S() + Q.range[1] !== e.length && + Y("Could not parse entire input - got stuck", "", Q.range[1]) + for (var Z = 0; Z < J.length; Z++) + if (J[Z] <= K) return ($ = 0), (X = !1), S() + return Q + } + var r = { parse: t } + "undefined" != typeof e && e.exports + ? (e.exports = r) + : (window.regjsparser = r) + })() + }, + function(e, t, r) { + function n(e) { + return D ? (A ? m.UNICODE_IGNORE_CASE[e] : m.UNICODE[e]) : m.REGULAR[e] + } + function i(e, t) { + return v.call(e, t) + } + function s(e, t) { + for (var r in t) e[r] = t[r] + } + function a(e, t) { + if (t) { + var r = f(t, "") + switch (r.type) { + case "characterClass": + case "group": + case "value": + break + default: + r = o(r, t) + } + s(e, r) + } + } + function o(e, t) { + return { type: "group", behavior: "ignore", body: [e], raw: "(?:" + t + ")" } + } + function u(e) { + return i(d, e) ? d[e] : !1 + } + function l(e) { + var t = h() + e.body.forEach(function(e) { + switch (e.type) { + case "value": + if ((t.add(e.codePoint), A && D)) { + var r = u(e.codePoint) + r && t.add(r) + } + break + case "characterClassRange": + var i = e.min.codePoint, + s = e.max.codePoint + t.addRange(i, s), A && D && t.iuAddRange(i, s) + break + case "characterClassEscape": + t.add(n(e.value)) + break + default: + throw Error("Unknown term type: " + e.type) + } + }) + return e.negative && (t = (D ? g : E).clone().remove(t)), a(e, t.toString()), e + } + function c(e) { + switch (e.type) { + case "dot": + a(e, (D ? b : x).toString()) + break + case "characterClass": + e = l(e) + break + case "characterClassEscape": + a(e, n(e.value).toString()) + break + case "alternative": + case "disjunction": + case "group": + case "quantifier": + e.body = e.body.map(c) + break + case "value": + var t = e.codePoint, + r = h(t) + if (A && D) { + var i = u(t) + i && r.add(i) + } + a(e, r.toString()) + break + case "anchor": + case "empty": + case "group": + case "reference": + break + default: + throw Error("Unknown term type: " + e.type) + } + return e + } + var p = r(6107).generate, + f = r(6108).parse, + h = r(2215), + d = r(7302), + m = r(6106), + y = {}, + v = y.hasOwnProperty, + g = h().addRange(0, 1114111), + E = h().addRange(0, 65535), + b = g.clone().remove(10, 13, 8232, 8233), + x = b.clone().intersection(E) + h.prototype.iuAddRange = function(e, t) { + var r = this + do { + var n = u(e) + n && r.add(n) + } while (++e <= t) + return r + } + var A = !1, + D = !1 + e.exports = function(e, t) { + var r = f(e, t) + return ( + (A = t ? t.indexOf("i") > -1 : !1), + (D = t ? t.indexOf("u") > -1 : !1), + s(r, c(r)), + p(r) + ) + } + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + MemberExpression: { + exit: function(e) { + var r = e.node, + n = r.property + r.computed || + !t.isIdentifier(n) || + t.isValidIdentifier(n.name) || + ((r.property = t.stringLiteral(n.name)), + (r.computed = !0)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + ObjectProperty: { + exit: function(e) { + var r = e.node, + n = r.key + r.computed || + !t.isIdentifier(n) || + t.isValidIdentifier(n.name) || + (r.key = t.stringLiteral(n.name)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(4)["default"] + t.__esModule = !0 + var i = r(6113), + s = n(i) + ;(t["default"] = function(e) { + var t = e.types + return { + visitor: { + ObjectExpression: function(e, r) { + for ( + var n = e.node, i = !1, a = n.properties, o = 0; + o < a.length; + o++ + ) { + var u = a[o] + if ("get" === u.kind || "set" === u.kind) { + i = !0 + break + } + } + if (i) { + var l = {} + ;(n.properties = n.properties.filter(function(e) { + return e.computed || ("get" !== e.kind && "set" !== e.kind) + ? !0 + : (s.push(l, e, null, r), !1) + })), + e.replaceWith( + t.callExpression( + t.memberExpression( + t.identifier("Object"), + t.identifier("defineProperties") + ), + [n, s.toDefineObject(l)] + ) + ) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7499, 20, 4, 6114, 2233, 2247, 12], + [7497, 20, 4, 6115, 6116, 12], + [7498, 4, 12], + [7393, 538, 20, 4, 6256, 744, 2247, 534, 6117, 12], + 810, + [7394, 93, 92, 20, 4, 354, 12], + [7397, 4, 20, 12, 354], + 2609, + [7398, 92, 20, 534], + [7399, 4, 12], + 2612, + [7400, 20, 4, 354, 12], + [7402, 4, 6127, 12], + [7403, 4, 12], + [7404, 4, 745, 12, 6126], + [7405, 20, 4, 444, 12], + [7406, 93, 4, 12], + 2619, + [7408, 92, 20, 4, 2217, 6129, 354, 12], + [7409, 6130], + [7410, 20, 4, 6136, 534, 354, 6154, 12], + [7413, 93, 20, 4, 2219, 12], + [7414, 537, 92, 4, 20, 2218, 1232, 12, 1241], + [7317, 20, 6152, 2222, 6151, 6150, 6137], + [7318, 6142, 6138, 6145, 6143, 6147], + [7319, 6140], + 2516, + [7321, 2220, 6141], + [7322, 2220], + 2519, + [7323, 6144], + 2521, + [7324, 6146], + 2521, + 2524, + 2525, + [7325, 2221], + [7326, 6148, 2221, 6149], + 2528, + [7327, 6153], + 2530, + 810, + [7431, 6156], + [7432, 6157], + 2648, + [7415, 7303], + 2626, + [7329, 6161], + 2533, + [7417, 6266, 20, 4, 6260, 6259, 6261, 2245, 535, 12], + [7418, 4, 20, 12, 1233, 273], + [7419, 20, 273], + [7420, 20, 273], + [7421, 20, 273], + [7423, 273, 6163, 6164, 6166, 6168, 6169, 6165], + [7424, 20, 273], + [7425, 20, 273], + [7426, 4, 12], + [7428, 4, 12], + [7430, 20, 4, 2223, 2231, 12, 1233], + [7394, 93, 92, 20, 4, 355, 12], + [7397, 4, 20, 12, 355], + 2609, + [7398, 92, 20, 535], + [7399, 4, 12], + 2612, + [7400, 20, 4, 355, 12], + [7402, 4, 6182, 12], + [7403, 4, 12], + [7404, 4, 745, 12, 6181], + [7405, 20, 4, 444, 12], + [7406, 93, 4, 12], + 2619, + [7408, 92, 20, 4, 2225, 6184, 355, 12], + [7409, 6185], + [7410, 20, 4, 6191, 535, 355, 6206, 12], + [7413, 93, 20, 4, 2227, 12], + [7414, 537, 92, 4, 20, 2226, 1235, 12, 1241], + [7317, 20, 6204, 2229, 6203, 2231, 6192], + [7318, 6197, 6193, 6200, 6198, 6202], + [7319, 6195], + 2516, + [7321, 2228, 6196], + [7322, 2228], + 2519, + [7323, 6199], + 2521, + [7324, 6201], + 2521, + 2524, + 2528, + [7327, 6205], + 2530, + 810, + [7431, 6208], + [7432, 6209], + 2648, + [7415, 7304], + 2626, + [7329, 6213], + 2533, + 2525, + [7325, 2230], + 2644, + 2650, + [7433, 6225, 6235, 742, 6255], + [7435, 2235, 6227, 6245], + [7437, 6239, 740], + 1399, + 2658, + 2659, + [7438, 445], + [7440, 6231, 6232, 536, 2249, 6265], + 1402, + [7442, 2239, 6241], + [7444, 2238, 2248], + [7449, 6246, 6247, 6248, 156, 6262], + [7450, 2241, 276], + [7451, 6230, 6249, 276], + [7452, 1236, 2241, 2243, 156, 1239, 2244, 2232, 276, 1240], + [7453, 1236, 1240], + 815, + [7454, 2240, 6238, 6243], + 2672, + 2673, + [7456, 139], + [7457, 139], + [7458, 536, 742, 2234], + [7459, 1237, 274, 276], + [7460, 276], + [7461, 6220, 740], + [7462, 2234], + [7463, 536, 156], + [7464, 6222], + 2683, + [7465, 445], + [7467, 2244, 6263], + 2687, + 2688, + [7469, 6237], + 2690, + [7474, 743, 156, 741, 274, 2248], + 2692, + [7478, 2237, 536], + [7481, 139], + [7482, 6257, 275], + [7483, 275], + [7484, 6228, 743, 275], + [7485, 139], + [7487, 274, 275], + [7493, 445, 276], + [7494, 6236, 445], + [7495, 2242, 6233, 1239], + [7332, 6273], + [7336, 6276], + [7337, 6277], + [7342, 6280], + [7344, 6268, 6267, 2250], + 1937, + [7346, 6305, 6304, 6297], + [7347, 6299], + [7349, 114], + [7350, 114], + [7351, 114, 6300], + [7352, 114, 6301], + [7353, 1251, 277], + [7354, 6302, 277], + [7356, 1251, 277], + [7357, 1251, 6303, 277], + 2581, + 2582, + [7359, 1243, 446], + [7360, 6282], + [7362, 114], + [7366, 1243], + [7367, 1243], + 559, + [7368, 114, 1249, 1250, 1247, 446], + 1379, + [7370, 114, 539], + [7377, 6294, 1244], + 1384, + [7379, 1244], + [7381, 6284, 446, 748, 277], + [7382, 2253, 6296, 277], + [7383, 6283, 6291, 748, 539, 2256], + [7384, 746], + [7386, 539, 1248], + [7387, 1248, 2255], + [7388, 6295, 1248], + 373, + [7390, 6293, 2256], + [7392, 6298, 748], + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.parse, + r = e.traverse + return { + visitor: { + CallExpression: function(e) { + if ( + e.get("callee").isIdentifier({ name: "eval" }) && + 1 === e.node.arguments.length + ) { + var n = e.get("arguments")[0].evaluate() + if (!n.confident) return + var i = n.value + if ("string" != typeof i) return + var s = t(i) + return r.removeProperties(s), s.program + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(72)["default"], + i = r(37)["default"] + t.__esModule = !0 + var s = r(6308), + a = n(s), + o = r(52), + u = i(o) + ;(t["default"] = function(e) { + function t(t) { + return t.operator === e.operator + "=" + } + function r(e, t) { + return u.assignmentExpression("=", e, t) + } + var n = {} + return ( + (n.ExpressionStatement = function(n, i) { + if (!n.isCompletionRecord()) { + var s = n.node.expression + if (t(s)) { + var o = [], + l = a["default"](s.left, o, i, n.scope, !0) + o.push( + u.expressionStatement(r(l.ref, e.build(l.uid, s.right))) + ), + n.replaceWithMultiple(o) + } + } + }), + (n.AssignmentExpression = function(n, i) { + var s = n.node, + o = n.scope + if (t(s)) { + var u = [], + l = a["default"](s.left, u, i, o) + u.push(r(l.ref, e.build(l.uid, s.right))), n.replaceWithMultiple(u) + } + }), + (n.BinaryExpression = function(t) { + var r = t.node + r.operator === e.operator && t.replaceWith(e.build(r.left, r.right)) + }), + n + ) + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + function n(e, t, r, n) { + var i = void 0 + if (o.isIdentifier(e)) { + if (n.hasBinding(e.name)) return e + i = e + } else { + if (!o.isMemberExpression(e)) + throw new Error("We can't explode this node type " + e.type) + if (((i = e.object), o.isIdentifier(i) && n.hasBinding(i.name))) return i + } + var s = n.generateUidIdentifierBasedOnNode(i) + return t.push(o.variableDeclaration("var", [o.variableDeclarator(s, i)])), s + } + function i(e, t, r, n) { + var i = e.property, + s = o.toComputedKey(e, i) + if (o.isLiteral(s)) return s + var a = n.generateUidIdentifierBasedOnNode(i) + return t.push(o.variableDeclaration("var", [o.variableDeclarator(a, i)])), a + } + var s = r(37)["default"] + t.__esModule = !0 + var a = r(52), + o = s(a) + ;(t["default"] = function(e, t, r, s, a) { + var u = void 0 + u = o.isIdentifier(e) && a ? e : n(e, t, r, s) + var l = void 0, + c = void 0 + if (o.isIdentifier(e)) (l = e), (c = u) + else { + var p = i(e, t, r, s), + f = e.computed || o.isLiteral(p) + c = l = o.memberExpression(u, p, f) + } + return { uid: c, ref: l } + }), + (e.exports = t["default"]) + }, + [7417, 6417, 72, 37, 6409, 6408, 6410, 2284, 540, 52], + [7418, 37, 72, 52, 1252, 278], + [7419, 72, 278], + [7420, 72, 278], + [7421, 72, 278], + [7423, 278, 6310, 6311, 6313, 6315, 6316, 6312], + [7424, 72, 278], + [7425, 72, 278], + [7426, 37, 52], + [7428, 37, 52], + [7430, 72, 37, 2262, 2270, 52, 1252], + [7394, 358, 281, 72, 37, 356, 52], + [7397, 37, 72, 52, 356], + 2609, + [7398, 281, 72, 540], + [7399, 37, 52], + 2612, + [7400, 72, 37, 356, 52], + [7402, 37, 6329, 52], + [7403, 37, 52], + [7404, 37, 2291, 52, 6328], + [7405, 72, 37, 1255, 52], + [7406, 358, 37, 52], + 2619, + [7408, 281, 72, 37, 2264, 6331, 356, 52], + [7409, 6332], + [7410, 72, 37, 6338, 540, 356, 6353, 52], + [7413, 358, 72, 37, 2266, 52], + [7414, 1260, 281, 37, 72, 2265, 1254, 52, 2283], + [7317, 72, 6351, 2268, 6350, 2270, 6339], + [7318, 6344, 6340, 6347, 6345, 6349], + [7319, 6342], + 2516, + [7321, 2267, 6343], + [7322, 2267], + 2519, + [7323, 6346], + 2521, + [7324, 6348], + 2521, + 2524, + 2528, + [7327, 6352], + 2530, + 810, + [7431, 6355], + [7432, 6356], + 2648, + [7415, 7305], + 2626, + [7329, 6360], + 2533, + 2525, + [7325, 2269], + 2650, + 1397, + [7433, 6373, 6385, 751, 6405], + [7434, 6367], + [7435, 2272, 6376, 6395], + [7437, 6389, 750], + 1399, + 2658, + 2659, + [7438, 447], + [7440, 6380, 6381, 749, 2287, 6415], + [7441, 6369, 2272, 2273, 2275, 6401, 6402, 6403, 169, 140], + 1402, + [7442, 2275, 6391], + [7444, 2274, 2286], + [7449, 6396, 6397, 6398, 169, 6411], + [7450, 2278, 280], + [7451, 6379, 6399, 280], + [7452, 2276, 2278, 6383, 169, 2280, 2281, 6364, 280, 2282], + [7453, 2276, 2282], + 1410, + 815, + [7454, 2277, 6388, 6393], + 2672, + 2673, + [7456, 140], + [7457, 140], + [7458, 749, 751, 2271], + [7459, 1256, 357, 280], + [7460, 280], + [7461, 6368, 750], + [7462, 2271], + [7463, 749, 169], + [7464, 6370], + 2683, + [7465, 447], + [7467, 2281, 6413], + 2687, + 2688, + [7469, 6387], + 2690, + [7474, 1259, 169, 1258, 357, 2286], + 2692, + [7481, 140], + [7482, 6406, 279], + [7483, 279], + [7484, 6377, 1259, 279], + [7485, 140], + [7487, 357, 279], + [7489, 2285, 6371, 6394], + [7493, 447, 280], + [7494, 6386, 447], + [7495, 2279, 6382, 2280], + 2644, + [7332, 6426], + [7336, 6429], + [7337, 6430], + [7338, 6431], + [7342, 6433], + [7343, 2289], + [7344, 6419, 6418, 2289], + 1937, + [7346, 6458, 6457, 6450], + [7347, 6452], + [7349, 115], + [7350, 115], + [7351, 115, 6453], + [7352, 115, 6454], + [7353, 1269, 282], + [7354, 6455, 282], + [7356, 1269, 282], + [7357, 1269, 6456, 282], + 2581, + 2582, + [7359, 1261, 448], + [7360, 6435], + [7362, 115], + [7366, 1261], + [7367, 1261], + 559, + [7368, 115, 1267, 1268, 1265, 448], + 1379, + [7370, 115, 541], + [7377, 6447, 1262], + 1384, + [7379, 1262], + [7381, 6437, 448, 754, 282], + [7382, 2292, 6449, 282], + [7383, 6436, 6444, 754, 541, 2295], + [7384, 752], + [7386, 541, 1266], + [7387, 1266, 2294], + [7388, 6448, 1266], + 373, + [7390, 6446, 2295], + [7392, 6451, 754], + function(e, t, r) { + ;(function(r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + MemberExpression: function(e) { + if (e.get("object").matchesPattern("process.env")) { + var n = e.toComputedKey() + t.isStringLiteral(n) && + e.replaceWith(t.valueToNode(r.env[n.value])) + } + } + } + } + }), + (e.exports = t["default"]) + }.call(t, r(1))) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + FunctionExpression: { + exit: function(e) { + var r = e.node + r.id && + ((r._ignoreUserWhitespace = !0), + e.replaceWith( + t.callExpression( + t.functionExpression( + null, + [], + t.blockStatement([ + t.toStatement(r), + t.returnStatement(r.id) + ]) + ), + [] + ) + )) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + MemberExpression: { + exit: function(e) { + var r = e.node, + n = r.property + r.computed && + t.isLiteral(n) && + t.isValidIdentifier(n.value) && + ((r.property = t.identifier(n.value)), + (r.computed = !1)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + VariableDeclaration: function(e) { + if (e.inList) + for (var t = e.node; ; ) { + var r = e.getSibling(e.key + 1) + if (!r.isVariableDeclaration({ kind: t.kind })) break + ;(t.declarations = t.declarations.concat( + r.node.declarations + )), + r.remove() + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + Literal: function(e) { + "boolean" == typeof e.node.value && + e.replaceWith( + t.unaryExpression( + "!", + t.numericLiteral(+!e.node.value), + !0 + ) + ) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + MemberExpression: function(e) { + if ( + e.matchesPattern("process.env.NODE_ENV") && + (e.replaceWith(t.valueToNode("production")), + e.parentPath.isBinaryExpression()) + ) { + var r = e.parentPath.evaluate() + r.confident && + e.parentPath.replaceWith(t.valueToNode(r.value)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + CallExpression: function(e, t) { + e.get("callee").matchesPattern("Object.assign") && + (e.node.callee = t.addHelper("extends")) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + CallExpression: function(e, t) { + e.get("callee").matchesPattern("Object.setPrototypeOf") && + (e.node.callee = t.addHelper("defaults")) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + ObjectProperty: { + exit: function(e) { + var r = e.node, + n = r.key + t.isLiteral(n) && + t.isValidIdentifier(n.value) && + ((r.key = t.identifier(n.value)), (r.computed = !1)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(6469)["default"] + t.__esModule = !0 + var i = r(6470), + s = n(i) + ;(t["default"] = function(e) { + function t(e) { + return i.isLiteral(i.toComputedKey(e, e.key), { value: "__proto__" }) + } + function r(e) { + var t = e.left + return ( + i.isMemberExpression(t) && + i.isLiteral(i.toComputedKey(t, t.property), { value: "__proto__" }) + ) + } + function n(e, t, r) { + return i.expressionStatement( + i.callExpression(r.addHelper("defaults"), [t, e.right]) + ) + } + var i = e.types + return { + visitor: { + AssignmentExpression: function(e, t) { + if (r(e.node)) { + var s = [], + a = e.node.left.object, + o = e.scope.maybeGenerateMemoised(a) + o && + s.push( + i.expressionStatement(i.assignmentExpression("=", o, a)) + ), + s.push(n(e.node, o || a, t)), + o && s.push(o), + e.replaceWithMultiple(s) + } + }, + ExpressionStatement: function(e, t) { + var s = e.node.expression + i.isAssignmentExpression(s, { operator: "=" }) && + r(s) && + e.replaceWith(n(s, s.left.object, t)) + }, + ObjectExpression: function(e, r) { + for ( + var n = void 0, a = e.node, o = a.properties, u = 0; + u < o.length; + u++ + ) { + var l = o[u] + t(l) && ((n = l.value), s["default"](a.properties, l)) + } + if (n) { + var c = [i.objectExpression([]), n] + a.properties.length && c.push(a), + e.replaceWith(i.callExpression(r.addHelper("extends"), c)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 5, + [7504, 6471], + [7447, 6472], + 2687, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + var e = { + enter: function(e, t) { + var r = function() { + ;(t.isImmutable = !1), e.stop() + } + return e.isJSXClosingElement() + ? void e.skip() + : e.isJSXIdentifier({ name: "ref" }) && + e.parentPath.isJSXAttribute({ name: e.node }) + ? r() + : void ( + e.isJSXIdentifier() || + e.isIdentifier() || + e.isJSXMemberExpression() || + e.isImmutable() || + r() + ) + } + } + return { + visitor: { + JSXElement: function(t) { + if (!t.node._hoisted) { + var r = { isImmutable: !0 } + t.traverse(e, r), + r.isImmutable ? t.hoist() : (t.node._hoisted = !0) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 5, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + function t(e) { + for (var t = 0; t < e.length; t++) { + var n = e[t] + if (i.isJSXSpreadAttribute(n)) return !0 + if (r(n, "ref")) return !0 + } + return !1 + } + function r(e, t) { + return i.isJSXAttribute(e) && i.isJSXIdentifier(e.name, { name: t }) + } + function n(e) { + var t = e.value + return t + ? (i.isJSXExpressionContainer(t) && (t = t.expression), t) + : i.identifier("true") + } + var i = e.types + return { + visitor: { + JSXElement: function(e, s) { + function a(e, t, r) { + e.push(i.objectProperty(t, r)) + } + var o = e.node, + u = o.openingElement + if (!t(u.attributes)) { + var l = i.objectExpression([]), + c = null, + p = u.name + i.isJSXIdentifier(p) && + i.react.isCompatTag(p.name) && + (p = i.stringLiteral(p.name)) + for (var f = u.attributes, h = 0; h < f.length; h++) { + var d = f[h] + if (r(d, "key")) c = n(d) + else { + var m = d.name.name, + y = i.isValidIdentifier(m) + ? i.identifier(m) + : i.stringLiteral(m) + a(l.properties, y, n(d)) + } + } + var v = [p, l] + if (c || o.children.length) { + var g = i.react.buildChildren(o) + v.push.apply( + v, + [ + c || + i.unaryExpression( + "void", + i.numericLiteral(0), + !0 + ) + ].concat(g) + ) + } + var E = i.callExpression(s.addHelper("jsx"), v) + e.replaceWith(E) + } + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + manipulateOptions: function(e, t) { + t.plugins.push("jsx") + }, + visitor: r(6477)({ + pre: function(e) { + e.callee = e.tagExpr + }, + post: function(e) { + t.react.isCompatTag(e.tagName) && + (e.call = t.callExpression( + t.memberExpression( + t.memberExpression( + t.identifier("React"), + t.identifier("DOM") + ), + e.tagExpr, + t.isLiteral(e.tagExpr) + ), + e.args + )) + } + }) + } + }), + (e.exports = t["default"]) + }, + [7505, 75, 44, 1273, 62], + [7417, 6586, 75, 44, 6579, 6578, 6580, 2326, 542, 62], + [7418, 44, 75, 62, 1270, 283], + [7419, 75, 283], + [7420, 75, 283], + [7421, 75, 283], + [7423, 283, 6479, 6480, 6482, 6484, 6485, 6481], + [7424, 75, 283], + [7425, 75, 283], + [7426, 44, 62], + [7428, 44, 62], + [7430, 75, 44, 2305, 1273, 62, 1270], + [7394, 361, 286, 75, 44, 359, 62], + [7397, 44, 75, 62, 359], + 2609, + [7398, 286, 75, 542], + [7399, 44, 62], + 2612, + [7400, 75, 44, 359, 62], + [7402, 44, 6498, 62], + [7403, 44, 62], + [7404, 44, 2333, 62, 6497], + [7405, 75, 44, 1274, 62], + [7406, 361, 44, 62], + 2619, + [7408, 286, 75, 44, 2307, 6500, 359, 62], + [7409, 6501], + [7410, 75, 44, 6507, 542, 359, 6522, 62], + [7413, 361, 75, 44, 2309, 62], + [7414, 1279, 286, 44, 75, 2308, 1272, 62, 2325], + [7317, 75, 6520, 2311, 6519, 1273, 6508], + [7318, 6513, 6509, 6516, 6514, 6518], + [7319, 6511], + 2516, + [7321, 2310, 6512], + [7322, 2310], + 2519, + [7323, 6515], + 2521, + [7324, 6517], + 2521, + 2524, + 2528, + [7327, 6521], + 2530, + 810, + [7431, 6524], + [7432, 6525], + 2648, + [7415, 7306], + 2626, + [7329, 6529], + 2533, + 2644, + 2525, + [7325, 2312], + 2650, + 1397, + [7433, 6543, 6555, 757, 6575], + [7434, 6537], + [7435, 2314, 6546, 6565], + [7437, 6559, 756], + 1399, + 2658, + 2659, + [7438, 449], + [7440, 6550, 6551, 755, 2329, 6585], + [7441, 6539, 2314, 2315, 2317, 6571, 6572, 6573, 170, 141], + 1402, + [7442, 2317, 6561], + [7444, 2316, 2328], + [7449, 6566, 6567, 6568, 170, 6581], + [7450, 2320, 285], + [7451, 6549, 6569, 285], + [7452, 2318, 2320, 6553, 170, 2322, 2323, 6534, 285, 2324], + [7453, 2318, 2324], + 1410, + 815, + [7454, 2319, 6558, 6563], + 2672, + 2673, + [7456, 141], + [7457, 141], + [7458, 755, 757, 2313], + [7459, 1275, 360, 285], + [7460, 285], + [7461, 6538, 756], + [7462, 2313], + [7463, 755, 170], + [7464, 6540], + 2683, + [7465, 449], + [7467, 2323, 6583], + 2687, + 2688, + [7469, 6557], + 2690, + [7474, 1278, 170, 1277, 360, 2328], + 2692, + [7481, 141], + [7482, 6576, 284], + [7483, 284], + [7484, 6547, 1278, 284], + [7485, 141], + [7487, 360, 284], + [7489, 2327, 6541, 6564], + [7493, 449, 285], + [7494, 6556, 449], + [7495, 2321, 6552, 2322], + [7332, 6595], + [7336, 6598], + [7337, 6599], + [7338, 6600], + [7342, 6602], + [7343, 2331], + [7344, 6588, 6587, 2331], + 1937, + [7346, 6627, 6626, 6619], + [7347, 6621], + [7349, 116], + [7350, 116], + [7351, 116, 6622], + [7352, 116, 6623], + [7353, 1288, 287], + [7354, 6624, 287], + [7356, 1288, 287], + [7357, 1288, 6625, 287], + 2581, + 2582, + [7359, 1280, 450], + [7360, 6604], + [7362, 116], + [7366, 1280], + [7367, 1280], + 559, + [7368, 116, 1286, 1287, 1284, 450], + 1379, + [7370, 116, 543], + [7377, 6616, 1281], + 1384, + [7379, 1281], + [7381, 6606, 450, 760, 287], + [7382, 2334, 6618, 287], + [7383, 6605, 6613, 760, 543, 2337], + [7384, 758], + [7386, 543, 1285], + [7387, 1285, 2336], + [7388, 6617, 1285], + 373, + [7390, 6615, 2337], + [7392, 6620, 760], + function(e, t) { + "use strict" + t.__esModule = !0 + var r = "__source", + n = "_jsxFileName" + ;(t["default"] = function(e) { + function t(e, t) { + var r = null != t ? i.numericLiteral(t) : i.nullLiteral(), + n = i.objectProperty(i.identifier("fileName"), e), + s = i.objectProperty(i.identifier("lineNumber"), r) + return i.objectExpression([n, s]) + } + var i = e.types, + s = { + JSXOpeningElement: function(e, s) { + if (!s.fileNameIdentifier) { + var a = + "unknown" !== s.file.log.filename + ? s.file.log.filename + : null, + o = e.scope.generateUidIdentifier(n) + e.hub.file.scope.push({ id: o, init: i.stringLiteral(a) }), + (s.fileNameIdentifier = o) + } + var u = i.jSXIdentifier(r), + l = e.container.openingElement.loc + if (l) { + var c = t(s.fileNameIdentifier, l.start.line) + e.container.openingElement.attributes.push( + i.jSXAttribute(u, i.jSXExpressionContainer(c)) + ) + } + } + } + return { visitor: s } + }), + (e.exports = t["default"]) + }, + [7505, 76, 45, 1292, 63], + [7417, 6738, 76, 45, 6731, 6730, 6732, 2364, 544, 63], + [7418, 45, 76, 63, 1289, 288], + [7419, 76, 288], + [7420, 76, 288], + [7421, 76, 288], + [7423, 288, 6631, 6632, 6634, 6636, 6637, 6633], + [7424, 76, 288], + [7425, 76, 288], + [7426, 45, 63], + [7428, 45, 63], + [7430, 76, 45, 2343, 1292, 63, 1289], + [7394, 364, 291, 76, 45, 362, 63], + [7397, 45, 76, 63, 362], + 2609, + [7398, 291, 76, 544], + [7399, 45, 63], + 2612, + [7400, 76, 45, 362, 63], + [7402, 45, 6650, 63], + [7403, 45, 63], + [7404, 45, 2371, 63, 6649], + [7405, 76, 45, 1293, 63], + [7406, 364, 45, 63], + 2619, + [7408, 291, 76, 45, 2345, 6652, 362, 63], + [7409, 6653], + [7410, 76, 45, 6659, 544, 362, 6674, 63], + [7413, 364, 76, 45, 2347, 63], + [7414, 1298, 291, 45, 76, 2346, 1291, 63, 2363], + [7317, 76, 6672, 2349, 6671, 1292, 6660], + [7318, 6665, 6661, 6668, 6666, 6670], + [7319, 6663], + 2516, + [7321, 2348, 6664], + [7322, 2348], + 2519, + [7323, 6667], + 2521, + [7324, 6669], + 2521, + 2524, + 2528, + [7327, 6673], + 2530, + 810, + [7431, 6676], + [7432, 6677], + 2648, + [7415, 7307], + 2626, + [7329, 6681], + 2533, + 2644, + 2525, + [7325, 2350], + 2650, + 1397, + [7433, 6695, 6707, 763, 6727], + [7434, 6689], + [7435, 2352, 6698, 6717], + [7437, 6711, 762], + 1399, + 2658, + 2659, + [7438, 451], + [7440, 6702, 6703, 761, 2367, 6737], + [7441, 6691, 2352, 2353, 2355, 6723, 6724, 6725, 171, 142], + 1402, + [7442, 2355, 6713], + [7444, 2354, 2366], + [7449, 6718, 6719, 6720, 171, 6733], + [7450, 2358, 290], + [7451, 6701, 6721, 290], + [7452, 2356, 2358, 6705, 171, 2360, 2361, 6686, 290, 2362], + [7453, 2356, 2362], + 1410, + 815, + [7454, 2357, 6710, 6715], + 2672, + 2673, + [7456, 142], + [7457, 142], + [7458, 761, 763, 2351], + [7459, 1294, 363, 290], + [7460, 290], + [7461, 6690, 762], + [7462, 2351], + [7463, 761, 171], + [7464, 6692], + 2683, + [7465, 451], + [7467, 2361, 6735], + 2687, + 2688, + [7469, 6709], + 2690, + [7474, 1297, 171, 1296, 363, 2366], + 2692, + [7481, 142], + [7482, 6728, 289], + [7483, 289], + [7484, 6699, 1297, 289], + [7485, 142], + [7487, 363, 289], + [7489, 2365, 6693, 6716], + [7493, 451, 290], + [7494, 6708, 451], + [7495, 2359, 6704, 2360], + [7332, 6747], + [7336, 6750], + [7337, 6751], + [7338, 6752], + [7342, 6754], + [7343, 2369], + [7344, 6740, 6739, 2369], + 1937, + [7346, 6779, 6778, 6771], + [7347, 6773], + [7349, 117], + [7350, 117], + [7351, 117, 6774], + [7352, 117, 6775], + [7353, 1307, 292], + [7354, 6776, 292], + [7356, 1307, 292], + [7357, 1307, 6777, 292], + 2581, + 2582, + [7359, 1299, 452], + [7360, 6756], + [7362, 117], + [7366, 1299], + [7367, 1299], + 559, + [7368, 117, 1305, 1306, 1303, 452], + 1379, + [7370, 117, 545], + [7377, 6768, 1300], + 1384, + [7379, 1300], + [7381, 6758, 452, 766, 292], + [7382, 2372, 6770, 292], + [7383, 6757, 6765, 766, 545, 2375], + [7384, 764], + [7386, 545, 1304], + [7387, 1304, 2374], + [7388, 6769, 1304], + 373, + [7390, 6767, 2375], + [7392, 6772, 766], + function(e, t, r) { + "use strict" + var n = r(768)["default"], + i = r(27)["default"], + s = r(30), + a = i(s), + o = Object.prototype.hasOwnProperty + t.hoist = function(e) { + function t(e, t) { + a.assertVariableDeclaration(e) + var n = [] + return ( + e.declarations.forEach(function(e) { + ;(r[e.id.name] = e.id), + e.init + ? n.push(a.assignmentExpression("=", e.id, e.init)) + : t && n.push(e.id) + }), + 0 === n.length ? null : 1 === n.length ? n[0] : a.sequenceExpression(n) + ) + } + a.assertFunction(e.node) + var r = {} + e.get("body").traverse({ + VariableDeclaration: { + exit: function(e) { + var r = t(e.node, !1) + null === r ? e.remove() : e.replaceWith(a.expressionStatement(r)), + e.skip() + } + }, + ForStatement: function(e) { + var r = e.node.init + a.isVariableDeclaration(r) && e.get("init").replaceWith(t(r, !1)) + }, + ForXStatement: function(e) { + var r = e.get("left") + r.isVariableDeclaration() && r.replaceWith(t(r.node, !0)) + }, + FunctionDeclaration: function(e) { + var t = e.node + r[t.id.name] = t.id + var n = a.expressionStatement( + a.assignmentExpression( + "=", + t.id, + a.functionExpression( + t.id, + t.params, + t.body, + t.generator, + t.expression + ) + ) + ) + e.parentPath.isBlockStatement() + ? (e.parentPath.unshiftContainer("body", n), e.remove()) + : e.replaceWith(n), + e.skip() + }, + FunctionExpression: function(e) { + e.skip() + } + }) + var i = {} + e.get("params").forEach(function(e) { + var t = e.node + a.isIdentifier(t) && (i[t.name] = t) + }) + var s = [] + return ( + n(r).forEach(function(e) { + o.call(i, e) || s.push(a.variableDeclarator(r[e], null)) + }), + 0 === s.length ? null : a.variableDeclaration("var", s) + ) + } + }, + function(e, t, r) { + "use strict" + function n() { + m["default"].ok(this instanceof n) + } + function i(e) { + n.call(this), v.assertLiteral(e), (this.returnLoc = e) + } + function s(e, t, r) { + n.call(this), + v.assertLiteral(e), + v.assertLiteral(t), + r ? v.assertIdentifier(r) : (r = null), + (this.breakLoc = e), + (this.continueLoc = t), + (this.label = r) + } + function a(e) { + n.call(this), v.assertLiteral(e), (this.breakLoc = e) + } + function o(e, t, r) { + n.call(this), + v.assertLiteral(e), + t ? m["default"].ok(t instanceof u) : (t = null), + r ? m["default"].ok(r instanceof l) : (r = null), + m["default"].ok(t || r), + (this.firstLoc = e), + (this.catchEntry = t), + (this.finallyEntry = r) + } + function u(e, t) { + n.call(this), + v.assertLiteral(e), + v.assertIdentifier(t), + (this.firstLoc = e), + (this.paramId = t) + } + function l(e, t) { + n.call(this), + v.assertLiteral(e), + v.assertLiteral(t), + (this.firstLoc = e), + (this.afterLoc = t) + } + function c(e, t) { + n.call(this), + v.assertLiteral(e), + v.assertIdentifier(t), + (this.breakLoc = e), + (this.label = t) + } + function p(e) { + m["default"].ok(this instanceof p) + var t = r(2380).Emitter + m["default"].ok(e instanceof t), + (this.emitter = e), + (this.entryStack = [new i(e.finalLoc)]) + } + var f = r(53)["default"], + h = r(27)["default"], + d = r(789), + m = f(d), + y = r(30), + v = h(y), + g = r(22) + g.inherits(i, n), + (t.FunctionEntry = i), + g.inherits(s, n), + (t.LoopEntry = s), + g.inherits(a, n), + (t.SwitchEntry = a), + g.inherits(o, n), + (t.TryEntry = o), + g.inherits(u, n), + (t.CatchEntry = u), + g.inherits(l, n), + (t.FinallyEntry = l), + g.inherits(c, n), + (t.LabeledEntry = c) + var E = p.prototype + ;(t.LeapManager = p), + (E.withEntry = function(e, t) { + m["default"].ok(e instanceof n), this.entryStack.push(e) + try { + t.call(this.emitter) + } finally { + var r = this.entryStack.pop() + m["default"].strictEqual(r, e) + } + }), + (E._findLeapLocation = function(e, t) { + for (var r = this.entryStack.length - 1; r >= 0; --r) { + var n = this.entryStack[r], + i = n[e] + if (i) + if (t) { + if (n.label && n.label.name === t.name) return i + } else if (!(n instanceof c)) return i + } + return null + }), + (E.getBreakLoc = function(e) { + return this._findLeapLocation("breakLoc", e) + }), + (E.getContinueLoc = function(e) { + return this._findLeapLocation("continueLoc", e) + }) + }, + function(e, t, r) { + "use strict" + function n(e, t) { + function r(e) { + function t(e) { + return ( + r || + (Array.isArray(e) + ? e.some(t) + : l.isNode(e) && + (o["default"].strictEqual(r, !1), (r = n(e)))), + r + ) + } + l.assertNode(e) + var r = !1, + i = l.VISITOR_KEYS[e.type] + if (i) + for (var s = 0; s < i.length; s++) { + var a = i[s], + u = e[a] + t(u) + } + return r + } + function n(n) { + l.assertNode(n) + var i = c(n) + return p.call(i, e) + ? i[e] + : p.call(f, n.type) + ? (i[e] = !1) + : p.call(t, n.type) + ? (i[e] = !0) + : (i[e] = r(n)) + } + return (n.onlyChildren = r), n + } + var i = r(53)["default"], + s = r(27)["default"], + a = r(789), + o = i(a), + u = r(30), + l = s(u), + c = r(2423).makeAccessor(), + p = Object.prototype.hasOwnProperty, + f = { FunctionExpression: !0 }, + h = { + CallExpression: !0, + ForInStatement: !0, + UnaryExpression: !0, + BinaryExpression: !0, + AssignmentExpression: !0, + UpdateExpression: !0, + NewExpression: !0 + }, + d = { + YieldExpression: !0, + BreakStatement: !0, + ContinueStatement: !0, + ReturnStatement: !0, + ThrowStatement: !0 + } + for (var m in d) p.call(d, m) && (h[m] = d[m]) + ;(t.hasSideEffects = n("hasSideEffects", h)), + (t.containsLeap = n("containsLeap", d)) + }, + function(e, t, r) { + "use strict" + function n(e) { + var t = e.node + if ( + (p.assertFunction(t), + t.id || (t.id = e.scope.parent.generateUidIdentifier("callee")), + t.generator && p.isFunctionDeclaration(t)) + ) { + var r = e.findParent(function(e) { + return e.isProgram() || e.isBlockStatement() + }) + if (!r) return t.id + var n = i(r), + s = n.declarations[0].id, + a = n.declarations[0].init.callee.object + p.assertArrayExpression(a) + var o = a.elements.length + return a.elements.push(t.id), p.memberExpression(s, p.numericLiteral(o), !0) + } + return t.id + } + function i(e) { + var t = e.node + l["default"].ok(Array.isArray(t.body)) + var r = y(t) + return r.decl + ? r.decl + : ((r.decl = p.variableDeclaration("var", [ + p.variableDeclarator( + e.scope.generateUidIdentifier("marked"), + p.callExpression( + p.memberExpression( + p.arrayExpression([]), + p.identifier("map"), + !1 + ), + [m.runtimeProperty("mark")] + ) + ) + ])), + e.unshiftContainer("body", r.decl), + r.decl) + } + function s(e, t) { + var r = { didRenameArguments: !1, argsId: t } + return e.traverse(v, r), r.didRenameArguments + } + var a = r(53)["default"], + o = r(27)["default"], + u = r(789), + l = a(u), + c = r(30), + p = o(c), + f = r(6780), + h = r(2380), + d = r(2381), + m = o(d), + y = r(2423).makeAccessor() + t.visitor = { + Function: { + exit: function(e, t) { + var r = e.node + if (r.generator) { + if (r.async) { + if (t.opts.asyncGenerators === !1) return + } else if (t.opts.generators === !1) return + } else { + if (!r.async) return + if (t.opts.async === !1) return + } + var i = e.scope.generateUidIdentifier("context"), + a = e.scope.generateUidIdentifier("args") + e.ensureBlock() + var o = e.get("body") + r.async && o.traverse(E), o.traverse(g, { context: i }) + var u = [], + l = [] + o.get("body").forEach(function(e) { + var t = e.node + t && null != t._blockHoist ? u.push(t) : l.push(t) + }), + u.length > 0 && (o.node.body = l) + var c = n(e) + p.assertIdentifier(r.id) + var d = p.identifier(r.id.name + "$"), + y = f.hoist(e), + v = s(e, a) + v && + ((y = y || p.variableDeclaration("var", [])), + y.declarations.push( + p.variableDeclarator(a, p.identifier("arguments")) + )) + var b = new h.Emitter(i) + b.explode(e.get("body")), y && y.declarations.length > 0 && u.push(y) + var x = [ + b.getContextFunction(d), + r.generator ? c : p.nullLiteral(), + p.thisExpression() + ], + A = b.getTryLocsList() + A && x.push(A) + var D = p.callExpression( + m.runtimeProperty(r.async ? "async" : "wrap"), + x + ) + u.push(p.returnStatement(D)), (r.body = p.blockStatement(u)) + var C = r.generator + C && (r.generator = !1), + r.async && (r.async = !1), + C && + p.isExpression(r) && + e.replaceWith(p.callExpression(m.runtimeProperty("mark"), [r])), + e.requeue() + } + } + } + var v = { + "FunctionExpression|FunctionDeclaration": function(e) { + e.skip() + }, + Identifier: function(e, t) { + "arguments" === e.node.name && + m.isReference(e) && + (e.replaceWith(t.argsId), (t.didRenameArguments = !0)) + } + }, + g = { + MetaProperty: function(e) { + var t = e.node + "function" === t.meta.name && + "sent" === t.property.name && + e.replaceWith( + p.memberExpression(this.context, p.identifier("_sent")) + ) + } + }, + E = { + Function: function(e) { + e.skip() + }, + AwaitExpression: function(e) { + var t = e.node.argument + e.replaceWith( + p.yieldExpression( + p.callExpression(m.runtimeProperty("awrap"), [t]), + !1 + ) + ) + } + } + }, + [7332, 6793], + [7336, 6796], + [7337, 6797], + [7338, 6798], + [7342, 6800], + [7343, 2383], + [7344, 6786, 6785, 2383], + 1937, + [7346, 6825, 6824, 6817], + [7347, 6819], + [7349, 118], + [7350, 118], + [7351, 118, 6820], + [7352, 118, 6821], + [7353, 1316, 294], + [7354, 6822, 294], + [7356, 1316, 294], + [7357, 1316, 6823, 294], + 2581, + 2582, + [7359, 1308, 453], + [7360, 6802], + [7362, 118], + [7366, 1308], + [7367, 1308], + 559, + [7368, 118, 1314, 1315, 1312, 453], + 1379, + [7370, 118, 546], + [7377, 6814, 1309], + 1384, + [7379, 1309], + [7381, 6804, 453, 771, 294], + [7382, 2386, 6816, 294], + [7383, 6803, 6811, 771, 546, 2389], + [7384, 769], + [7386, 546, 1313], + [7387, 1313, 2388], + [7388, 6815, 1313], + 373, + [7390, 6813, 2389], + [7392, 6818, 771], + [7394, 365, 293, 53, 27, 366, 30], + [7397, 27, 53, 30, 366], + 2609, + [7398, 293, 53, 547], + [7399, 27, 30], + 2612, + [7400, 53, 27, 366, 30], + [7402, 27, 6835, 30], + [7403, 27, 30], + [7404, 27, 2385, 30, 6834], + [7405, 53, 27, 1319, 30], + [7406, 365, 27, 30], + 2619, + [7408, 293, 53, 27, 2395, 6837, 366, 30], + [7409, 6838], + [7410, 53, 27, 6844, 547, 366, 6963, 30], + [7413, 365, 53, 27, 2397, 30], + [7414, 768, 293, 27, 53, 2396, 1318, 30, 6888], + [7317, 53, 6860, 2407, 6859, 6858, 6845], + [7318, 6850, 6846, 6853, 6851, 6855], + [7319, 6848], + 2516, + [7321, 2398, 6849], + [7322, 2398], + 2519, + [7323, 6852], + 2521, + [7324, 6854], + 2521, + 2524, + 2525, + [7325, 2399], + [7326, 6856, 2399, 6857], + 2528, + [7327, 6861], + 2530, + [7431, 6863], + [7432, 6864], + 2648, + [7415, 7308], + 2626, + 1399, + 812, + 2659, + [7438, 774], + [7441, 6867, 6868, 2401, 6874, 6883, 6884, 6885, 773, 454], + 1402, + [7443, 6880], + [7445, 6873, 774], + [7447, 6882], + 1409, + 2672, + 2673, + [7458, 2402, 1322, 2400], + [7460, 6887], + [7462, 2400], + 2687, + 2688, + [7469, 6878], + 2690, + [7474, 2405, 773, 1321, 548, 6893], + [7475, 454], + [7477, 6871, 2402, 1322], + [7481, 454], + [7482, 6889, 772], + [7486, 772], + [7489, 2406, 6869, 6881], + [7492, 2405, 773, 1321, 548, 454], + [7494, 6877, 774], + 1420, + [7329, 6897], + 2533, + [7417, 6784, 53, 27, 6956, 6955, 6957, 6958, 547, 30], + [7418, 27, 53, 30, 1323, 295], + [7419, 53, 295], + [7420, 53, 295], + [7421, 53, 295], + [7423, 295, 6899, 6900, 6902, 6904, 6905, 6901], + [7424, 53, 295], + [7425, 53, 295], + [7426, 27, 30], + [7428, 27, 30], + [7430, 53, 27, 2408, 6911, 30, 1323], + 2525, + [7325, 2409], + [7326, 6909, 2409, 6910], + 2650, + 1397, + [7433, 6921, 6934, 2417, 6951], + [7434, 6916], + [7435, 2410, 6924, 6941], + [7437, 6937, 775], + 1399, + 2658, + [7439, 6923, 776], + [7440, 6929, 6930, 1324, 2422, 6961], + [7441, 6918, 2410, 6920, 2412, 6947, 6948, 6949, 298, 143], + 1402, + [7442, 2412, 6938], + [7444, 2411, 2421], + [7447, 6946], + [7449, 6942, 6943, 6944, 298, 6959], + [7450, 2414, 297], + [7451, 6928, 6945, 297], + [7452, 2413, 2414, 6932, 298, 2418, 2419, 6913, 297, 2420], + [7453, 2413, 2420], + 1410, + 815, + [7454, 6926, 6936, 6940], + 2673, + [7456, 143], + [7457, 143], + [7459, 2416, 455, 297], + [7460, 297], + [7461, 6917, 775], + [7463, 1324, 298], + [7464, 6919], + 2683, + [7465, 776], + [7467, 2419, 6960], + 2687, + 2688, + [7469, 6935], + 2690, + [7474, 1327, 298, 1326, 455, 2421], + 2692, + [7477, 6922, 1324, 2417], + [7481, 143], + [7482, 6953, 296], + [7483, 296], + [7484, 6925, 1327, 296], + [7485, 143], + [7486, 296], + [7487, 455, 296], + [7493, 776, 297], + [7495, 2415, 6931, 2418], + 2644, + 810, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + CallExpression: function(e) { + e.get("callee").matchesPattern("console", !0) && e.remove() + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + DebuggerStatement: function(e) { + e.remove() + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t) { + "use strict" + e.exports = { + builtins: { + Symbol: "symbol", + Promise: "promise", + Map: "map", + WeakMap: "weak-map", + Set: "set", + WeakSet: "weak-set", + setImmediate: "set-immediate", + clearImmediate: "clear-immediate" + }, + methods: { + Array: { + concat: "array/concat", + copyWithin: "array/copy-within", + entries: "array/entries", + every: "array/every", + fill: "array/fill", + filter: "array/filter", + findIndex: "array/find-index", + find: "array/find", + forEach: "array/for-each", + from: "array/from", + includes: "array/includes", + indexOf: "array/index-of", + join: "array/join", + keys: "array/keys", + lastIndexOf: "array/last-index-of", + map: "array/map", + of: "array/of", + pop: "array/pop", + push: "array/push", + reduceRight: "array/reduce-right", + reduce: "array/reduce", + reverse: "array/reverse", + shift: "array/shift", + slice: "array/slice", + some: "array/some", + sort: "array/sort", + splice: "array/splice", + unshift: "array/unshift", + values: "array/values" + }, + JSON: { stringify: "json/stringify" }, + Object: { + assign: "object/assign", + create: "object/create", + defineProperties: "object/define-properties", + defineProperty: "object/define-property", + entries: "object/entries", + freeze: "object/freeze", + getOwnPropertyDescriptor: "object/get-own-property-descriptor", + getOwnPropertyDescriptors: "object/get-own-property-descriptors", + getOwnPropertyNames: "object/get-own-property-names", + getOwnPropertySymbols: "object/get-own-property-symbols", + getPrototypeOf: "object/get-prototype-of", + isExtensible: "object/is-extensible", + isFrozen: "object/is-frozen", + isSealed: "object/is-sealed", + is: "object/is", + keys: "object/keys", + preventExtensions: "object/prevent-extensions", + seal: "object/seal", + setPrototypeOf: "object/set-prototype-of", + values: "object/values" + }, + RegExp: { escape: "regexp/escape" }, + Math: { + acosh: "math/acosh", + asinh: "math/asinh", + atanh: "math/atanh", + cbrt: "math/cbrt", + clz32: "math/clz32", + cosh: "math/cosh", + expm1: "math/expm1", + fround: "math/fround", + hypot: "math/hypot", + imul: "math/imul", + log10: "math/log10", + log1p: "math/log1p", + log2: "math/log2", + sign: "math/sign", + sinh: "math/sinh", + tanh: "math/tanh", + trunc: "math/trunc", + iaddh: "math/iaddh", + isubh: "math/isubh", + imulh: "math/imulh", + umulh: "math/umulh" + }, + Symbol: { + for: "symbol/for", + hasInstance: "symbol/has-instance", + isConcatSpreadable: "symbol/is-concat-spreadable", + iterator: "symbol/iterator", + keyFor: "symbol/key-for", + match: "symbol/match", + replace: "symbol/replace", + search: "symbol/search", + species: "symbol/species", + split: "symbol/split", + toPrimitive: "symbol/to-primitive", + toStringTag: "symbol/to-string-tag", + unscopables: "symbol/unscopables" + }, + String: { + at: "string/at", + codePointAt: "string/code-point-at", + endsWith: "string/ends-with", + fromCodePoint: "string/from-code-point", + includes: "string/includes", + padLeft: "string/pad-left", + padRight: "string/pad-right", + padStart: "string/pad-start", + padEnd: "string/pad-end", + raw: "string/raw", + repeat: "string/repeat", + startsWith: "string/starts-with", + trim: "string/trim", + trimLeft: "string/trim-left", + trimRight: "string/trim-right", + trimStart: "string/trim-start", + trimEnd: "string/trim-end" + }, + Number: { + EPSILON: "number/epsilon", + isFinite: "number/is-finite", + isInteger: "number/is-integer", + isNaN: "number/is-nan", + isSafeInteger: "number/is-safe-integer", + MAX_SAFE_INTEGER: "number/max-safe-integer", + MIN_SAFE_INTEGER: "number/min-safe-integer", + parseFloat: "number/parse-float", + parseInt: "number/parse-int" + }, + Reflect: { + apply: "reflect/apply", + construct: "reflect/construct", + defineProperty: "reflect/define-property", + deleteProperty: "reflect/delete-property", + enumerate: "reflect/enumerate", + getOwnPropertyDescriptor: "reflect/get-own-property-descriptor", + getPrototypeOf: "reflect/get-prototype-of", + get: "reflect/get", + has: "reflect/has", + isExtensible: "reflect/is-extensible", + ownKeys: "reflect/own-keys", + preventExtensions: "reflect/prevent-extensions", + setPrototypeOf: "reflect/set-prototype-of", + set: "reflect/set", + defineMetadata: "reflect/define-metadata", + deleteMetadata: "reflect/delete-metadata", + getMetadata: "reflect/get-metadata", + getMetadataKeys: "reflect/get-metadata-keys", + getOwnMetadata: "reflect/get-own-metadata", + getOwnMetadataKeys: "reflect/get-own-metadata-keys", + hasMetadata: "reflect/has-metadata", + hasOwnMetadata: "reflect/has-own-metadata", + metadata: "reflect/metadata" + }, + System: { global: "system/global" }, + Error: { isError: "error/is-error" }, + Date: {}, + Function: {} + } + } + }, + function(e, t, r) { + "use strict" + var n = r(6968)["default"] + t.__esModule = !0 + var i = r(6966), + s = n(i) + ;(t["default"] = function(e) { + function t(e, t) { + return Object.prototype.hasOwnProperty.call(e, t) + } + var r = e.types, + n = "babel-runtime", + i = ["interopRequireWildcard", "interopRequireDefault"] + return { + pre: function(e) { + e.set("helperGenerator", function(t) { + return i.indexOf(t) < 0 + ? e.addImport(n + "/helpers/" + t, "default", t) + : void 0 + }), + this.setDynamic("regeneratorIdentifier", function() { + return e.addImport( + n + "/regenerator", + "default", + "regeneratorRuntime" + ) + }) + }, + visitor: { + ReferencedIdentifier: function(e, i) { + var a = e.node, + o = e.parent, + u = e.scope + return "regeneratorRuntime" === a.name && i.opts.regenerator !== !1 + ? void e.replaceWith(i.get("regeneratorIdentifier")) + : void ( + i.opts.polyfill !== !1 && + (r.isMemberExpression(o) || + (t(s["default"].builtins, a.name) && + (u.getBindingIdentifier(a.name) || + e.replaceWith( + i.addImport( + n + + "/core-js/" + + s["default"].builtins[a.name], + "default", + a.name + ) + )))) + ) + }, + CallExpression: function(e, t) { + if (t.opts.polyfill !== !1 && !e.node.arguments.length) { + var i = e.node.callee + r.isMemberExpression(i) && + i.computed && + e + .get("callee.property") + .matchesPattern("Symbol.iterator") && + e.replaceWith( + r.callExpression( + t.addImport( + n + "/core-js/get-iterator", + "default", + "getIterator" + ), + [i.object] + ) + ) + } + }, + BinaryExpression: function(e, t) { + t.opts.polyfill !== !1 && + "in" === e.node.operator && + e.get("left").matchesPattern("Symbol.iterator") && + e.replaceWith( + r.callExpression( + t.addImport( + n + "/core-js/is-iterable", + "default", + "isIterable" + ), + [e.node.right] + ) + ) + }, + MemberExpression: { + enter: function(e, i) { + if (i.opts.polyfill !== !1 && e.isReferenced()) { + var a = e.node, + o = a.object, + u = a.property + if ( + r.isReferenced(o, a) && + !a.computed && + t(s["default"].methods, o.name) + ) { + var l = s["default"].methods[o.name] + if ( + t(l, u.name) && + !e.scope.getBindingIdentifier(o.name) + ) { + if ( + "Object" === o.name && + "defineProperty" === u.name && + e.parentPath.isCallExpression() + ) { + var c = e.parentPath.node + if ( + 3 === c.arguments.length && + r.isLiteral(c.arguments[1]) + ) + return + } + e.replaceWith( + i.addImport( + n + "/core-js/" + l[u.name], + "default", + o.name + "$" + u.name + ) + ) + } + } + } + }, + exit: function(e, i) { + if (i.opts.polyfill !== !1 && e.isReferenced()) { + var a = e.node, + o = a.object + t(s["default"].builtins, o.name) && + (e.scope.getBindingIdentifier(o.name) || + e.replaceWith( + r.memberExpression( + i.addImport( + n + + "/core-js/" + + s["default"].builtins[o.name], + "default", + o.name + ), + a.property, + a.computed + ) + )) + } + } + } + } + } + }), + (t.definitions = s["default"]) + }, + 5, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function() { + return { + visitor: { + BinaryExpression: function(e) { + var t = e.node, + r = t.operator + if ("===" === r || "!==" === r) { + var n = e.get("left"), + i = e.get("right") + n.baseTypeStrictlyMatches(i) && + (t.operator = t.operator.slice(0, -1)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7332, 6979], + [7336, 6982], + [7337, 6983], + [7338, 6984], + [7342, 6986], + [7343, 2425], + [7344, 6972, 6971, 2425], + 1937, + [7346, 7011, 7010, 7003], + [7347, 7005], + [7349, 119], + [7350, 119], + [7351, 119, 7006], + [7352, 119, 7007], + [7353, 1338, 300], + [7354, 7008, 300], + [7356, 1338, 300], + [7357, 1338, 7009, 300], + 2581, + 2582, + [7359, 1330, 456], + [7360, 6988], + [7362, 119], + [7366, 1330], + [7367, 1330], + 559, + [7368, 119, 1336, 1337, 1334, 456], + 1379, + [7370, 119, 549], + [7377, 7e3, 1331], + 1384, + [7379, 1331], + [7381, 6990, 456, 779, 300], + [7382, 2428, 7002, 300], + [7383, 6989, 6997, 779, 549, 2431], + [7384, 777], + [7386, 549, 1335], + [7387, 1335, 2430], + [7388, 7001, 1335], + 373, + [7390, 6999, 2431], + [7392, 7004, 779], + [7417, 6970, 78, 46, 7112, 7111, 7113, 2458, 550, 64], + [7418, 46, 78, 64, 1339, 301], + [7419, 78, 301], + [7420, 78, 301], + [7421, 78, 301], + [7423, 301, 7013, 7014, 7016, 7018, 7019, 7015], + [7424, 78, 301], + [7425, 78, 301], + [7426, 46, 64], + [7428, 46, 64], + [7430, 78, 46, 2436, 2444, 64, 1339], + [7394, 367, 299, 78, 46, 368, 64], + [7397, 46, 78, 64, 368], + 2609, + [7398, 299, 78, 550], + [7399, 46, 64], + 2612, + [7400, 78, 46, 368, 64], + [7402, 46, 7032, 64], + [7403, 46, 64], + [7404, 46, 2427, 64, 7031], + [7405, 78, 46, 1342, 64], + [7406, 367, 46, 64], + 2619, + [7408, 299, 78, 46, 2438, 7034, 368, 64], + [7409, 7035], + [7410, 78, 46, 7041, 550, 368, 7056, 64], + [7413, 367, 78, 46, 2440, 64], + [7414, 1329, 299, 46, 78, 2439, 1341, 64, 2457], + [7317, 78, 7054, 2442, 7053, 2444, 7042], + [7318, 7047, 7043, 7050, 7048, 7052], + [7319, 7045], + 2516, + [7321, 2441, 7046], + [7322, 2441], + 2519, + [7323, 7049], + 2521, + [7324, 7051], + 2521, + 2524, + 2528, + [7327, 7055], + 2530, + 810, + [7431, 7058], + [7432, 7059], + 2648, + [7415, 7309], + 2626, + [7329, 7063], + 2533, + 2525, + [7325, 2443], + 2650, + 1397, + [7433, 7076, 7088, 782, 7108], + [7434, 7070], + [7435, 2446, 7079, 7098], + [7437, 7092, 781], + 1399, + 2658, + 2659, + [7438, 457], + [7440, 7083, 7084, 780, 2461, 7118], + [7441, 7072, 2446, 2447, 2449, 7104, 7105, 7106, 172, 144], + 1402, + [7442, 2449, 7094], + [7444, 2448, 2460], + [7449, 7099, 7100, 7101, 172, 7114], + [7450, 2452, 303], + [7451, 7082, 7102, 303], + [7452, 2450, 2452, 7086, 172, 2454, 2455, 7067, 303, 2456], + [7453, 2450, 2456], + 1410, + 815, + [7454, 2451, 7091, 7096], + 2672, + 2673, + [7456, 144], + [7457, 144], + [7458, 780, 782, 2445], + [7459, 1343, 369, 303], + [7460, 303], + [7461, 7071, 781], + [7462, 2445], + [7463, 780, 172], + [7464, 7073], + 2683, + [7465, 457], + [7467, 2455, 7116], + 2687, + 2688, + [7469, 7090], + 2690, + [7474, 1346, 172, 1345, 369, 2460], + 2692, + [7481, 144], + [7482, 7109, 302], + [7483, 302], + [7484, 7080, 1346, 302], + [7485, 144], + [7487, 369, 302], + [7489, 2459, 7074, 7097], + [7493, 457, 303], + [7494, 7089, 457], + [7495, 2453, 7085, 2454], + 2644, + function(e, t) { + "use strict" + ;(t.__esModule = !0), + (t["default"] = function(e) { + var t = e.types + return { + visitor: { + ReferencedIdentifier: function(e) { + "undefined" === e.node.name && + e.replaceWith( + t.unaryExpression("void", t.numericLiteral(0), !0) + ) + } + } + } + }), + (e.exports = t["default"]) + }, + function(e, t, r) { + "use strict" + var n = r(7122)["default"] + t.__esModule = !0 + var i = r(7123), + s = n(i) + ;(t["default"] = function(e) { + var t = e.messages + return { + visitor: { + ReferencedIdentifier: function(e) { + var r = e.node, + n = e.scope, + i = n.getBinding(r.name) + if (i && "type" === i.kind && !e.parentPath.isFlow()) + throw e.buildCodeFrameError( + t.get("undeclaredVariableType", r.name), + ReferenceError + ) + if (!n.hasBinding(r.name)) { + var a = n.getAllBindings(), + o = void 0, + u = -1 + for (var l in a) { + var c = s["default"](r.name, l) + 0 >= c || c > 3 || u >= c || ((o = l), (u = c)) + } + var p = void 0 + throw ((p = o + ? t.get("undeclaredVariableSuggestion", r.name, o) + : t.get("undeclaredVariable", r.name)), + e.buildCodeFrameError(p, ReferenceError)) + } + } + } + } + }), + (e.exports = t["default"]) + }, + 5, + function(e, t) { + "use strict" + var r = [], + n = [] + e.exports = function(e, t) { + if (e === t) return 0 + var i = e.length, + s = t.length + if (0 === i) return s + if (0 === s) return i + for (var a, o, u, l, c = 0, p = 0; i > c; ) + (n[c] = e.charCodeAt(c)), (r[c] = ++c) + for (; s > p; ) + for (a = t.charCodeAt(p), u = p++, o = p, c = 0; i > c; c++) + (l = a === n[c] ? u : u + 1), + (u = r[c]), + (o = r[c] = u > o ? (l > o ? o + 1 : l) : l > u ? u + 1 : l) + return o + } + }, + function(e, t, r) { + e.exports = { + plugins: [ + r(730), + r(657), + r(645), + r(616), + r(617), + r(628), + r(694), + r(715), + r(7125), + r(640), + r(644), + r(723), + r(733), + r(566), + r(722), + r(705), + r(643), + r(618), + r(731), + r(1053), + [r(767), { async: !1, asyncGenerators: !1 }] + ] + } + }, + function(e, t, r) { + "use strict" + function n(e) { + return u.isIdentifier(e) ? e.name : e.value.toString() + } + var i = r(1347)["default"], + s = r(173)["default"], + a = r(47)["default"] + t.__esModule = !0 + var o = r(65), + u = a(o) + ;(t["default"] = function() { + return { + visitor: { + ObjectExpression: function(e) { + for ( + var t = e.node, + r = t.properties.filter(function(e) { + return !u.isSpreadProperty(e) && !e.computed + }), + a = i(null), + o = i(null), + l = i(null), + c = r, + p = Array.isArray(c), + f = 0, + c = p ? c : s(c); + ; + + ) { + var h + if (p) { + if (f >= c.length) break + h = c[f++] + } else { + if (((f = c.next()), f.done)) break + h = f.value + } + var d = h, + m = n(d.key), + y = !1 + switch (d.kind) { + case "get": + ;(a[m] || o[m]) && (y = !0), (o[m] = !0) + break + case "set": + ;(a[m] || l[m]) && (y = !0), (l[m] = !0) + break + default: + ;(a[m] || o[m] || l[m]) && (y = !0), (a[m] = !0) + } + y && ((d.computed = !0), (d.key = u.stringLiteral(m))) + } + } + } + } + }), + (e.exports = t["default"]) + }, + [7332, 7135], + [7336, 7138], + [7337, 7139], + [7338, 7140], + [7342, 7142], + [7343, 2462], + [7344, 7128, 7127, 2462], + 1937, + [7346, 7167, 7166, 7159], + [7347, 7161], + [7349, 120], + [7350, 120], + [7351, 120, 7162], + [7352, 120, 7163], + [7353, 1357, 304], + [7354, 7164, 304], + [7356, 1357, 304], + [7357, 1357, 7165, 304], + 2581, + 2582, + [7359, 1349, 458], + [7360, 7144], + [7362, 120], + [7366, 1349], + [7367, 1349], + 559, + [7368, 120, 1355, 1356, 1353, 458], + 1379, + [7370, 120, 551], + [7377, 7156, 1350], + 1384, + [7379, 1350], + [7381, 7146, 458, 785, 304], + [7382, 2465, 7158, 304], + [7383, 7145, 7153, 785, 551, 2468], + [7384, 783], + [7386, 551, 1354], + [7387, 1354, 2467], + [7388, 7157, 1354], + 373, + [7390, 7155, 2468], + [7392, 7160, 785], + [7417, 7126, 79, 47, 7268, 7267, 7269, 2495, 552, 65], + [7418, 47, 79, 65, 1358, 305], + [7419, 79, 305], + [7420, 79, 305], + [7421, 79, 305], + [7423, 305, 7169, 7170, 7172, 7174, 7175, 7171], + [7424, 79, 305], + [7425, 79, 305], + [7426, 47, 65], + [7428, 47, 65], + [7430, 79, 47, 2473, 2481, 65, 1358], + [7394, 370, 173, 79, 47, 371, 65], + [7397, 47, 79, 65, 371], + 2609, + [7398, 173, 79, 552], + [7399, 47, 65], + 2612, + [7400, 79, 47, 371, 65], + [7402, 47, 7188, 65], + [7403, 47, 65], + [7404, 47, 2464, 65, 7187], + [7405, 79, 47, 1361, 65], + [7406, 370, 47, 65], + 2619, + [7408, 173, 79, 47, 2475, 7190, 371, 65], + [7409, 7191], + [7410, 79, 47, 7197, 552, 371, 7212, 65], + [7413, 370, 79, 47, 2477, 65], + [7414, 1348, 173, 47, 79, 2476, 1360, 65, 2494], + [7317, 79, 7210, 2479, 7209, 2481, 7198], + [7318, 7203, 7199, 7206, 7204, 7208], + [7319, 7201], + 2516, + [7321, 2478, 7202], + [7322, 2478], + 2519, + [7323, 7205], + 2521, + [7324, 7207], + 2521, + 2524, + 2528, + [7327, 7211], + 2530, + 810, + [7431, 7214], + [7432, 7215], + 2648, + [7415, 7310], + 2626, + [7329, 7219], + 2533, + 2525, + [7325, 2480], + 2650, + 1397, + [7433, 7232, 7244, 788, 7264], + [7434, 7226], + [7435, 2483, 7235, 7254], + [7437, 7248, 787], + 1399, + 2658, + 2659, + [7438, 459], + [7440, 7239, 7240, 786, 2498, 7274], + [7441, 7228, 2483, 2484, 2486, 7260, 7261, 7262, 174, 145], + 1402, + [7442, 2486, 7250], + [7444, 2485, 2497], + [7449, 7255, 7256, 7257, 174, 7270], + [7450, 2489, 307], + [7451, 7238, 7258, 307], + [7452, 2487, 2489, 7242, 174, 2491, 2492, 7223, 307, 2493], + [7453, 2487, 2493], + 1410, + 815, + [7454, 2488, 7247, 7252], + 2672, + 2673, + [7456, 145], + [7457, 145], + [7458, 786, 788, 2482], + [7459, 1362, 372, 307], + [7460, 307], + [7461, 7227, 787], + [7462, 2482], + [7463, 786, 174], + [7464, 7229], + 2683, + [7465, 459], + [7467, 2492, 7272], + 2687, + 2688, + [7469, 7246], + 2690, + [7474, 1365, 174, 1364, 372, 2497], + 2692, + [7481, 145], + [7482, 7265, 306], + [7483, 306], + [7484, 7236, 1365, 306], + [7485, 145], + [7487, 372, 306], + [7489, 2496, 7230, 7253], + [7493, 459, 307], + [7494, 7245, 459], + [7495, 2490, 7241, 2491], + 2644, + function(e, t, r) { + e.exports = { plugins: [r(2342), r(2301), r(822), r(823), r(2304)] } + }, + function(e, t, r) { + e.exports = { presets: [r(2499)], plugins: [r(1672), r(2302)] } + }, + function(e, t) { + e.exports = { + builtin: { + Array: !1, + ArrayBuffer: !1, + Boolean: !1, + constructor: !1, + DataView: !1, + Date: !1, + decodeURI: !1, + decodeURIComponent: !1, + encodeURI: !1, + encodeURIComponent: !1, + Error: !1, + escape: !1, + eval: !1, + EvalError: !1, + Float32Array: !1, + Float64Array: !1, + Function: !1, + hasOwnProperty: !1, + Infinity: !1, + Int16Array: !1, + Int32Array: !1, + Int8Array: !1, + isFinite: !1, + isNaN: !1, + isPrototypeOf: !1, + JSON: !1, + Map: !1, + Math: !1, + NaN: !1, + Number: !1, + Object: !1, + parseFloat: !1, + parseInt: !1, + Promise: !1, + propertyIsEnumerable: !1, + Proxy: !1, + RangeError: !1, + ReferenceError: !1, + Reflect: !1, + RegExp: !1, + Set: !1, + String: !1, + Symbol: !1, + SyntaxError: !1, + System: !1, + toLocaleString: !1, + toString: !1, + TypeError: !1, + Uint16Array: !1, + Uint32Array: !1, + Uint8Array: !1, + Uint8ClampedArray: !1, + undefined: !1, + unescape: !1, + URIError: !1, + valueOf: !1, + WeakMap: !1, + WeakSet: !1 + }, + es5: { + Array: !1, + Boolean: !1, + constructor: !1, + Date: !1, + decodeURI: !1, + decodeURIComponent: !1, + encodeURI: !1, + encodeURIComponent: !1, + Error: !1, + escape: !1, + eval: !1, + EvalError: !1, + Float32Array: !1, + Float64Array: !1, + Function: !1, + hasOwnProperty: !1, + Infinity: !1, + isFinite: !1, + isNaN: !1, + isPrototypeOf: !1, + JSON: !1, + Math: !1, + NaN: !1, + Number: !1, + Object: !1, + parseFloat: !1, + parseInt: !1, + propertyIsEnumerable: !1, + RangeError: !1, + ReferenceError: !1, + RegExp: !1, + String: !1, + SyntaxError: !1, + toLocaleString: !1, + toString: !1, + TypeError: !1, + undefined: !1, + unescape: !1, + URIError: !1, + valueOf: !1 + }, + es6: { + Array: !1, + ArrayBuffer: !1, + Boolean: !1, + constructor: !1, + DataView: !1, + Date: !1, + decodeURI: !1, + decodeURIComponent: !1, + encodeURI: !1, + encodeURIComponent: !1, + Error: !1, + escape: !1, + eval: !1, + EvalError: !1, + Float32Array: !1, + Float64Array: !1, + Function: !1, + hasOwnProperty: !1, + Infinity: !1, + Int16Array: !1, + Int32Array: !1, + Int8Array: !1, + isFinite: !1, + isNaN: !1, + isPrototypeOf: !1, + JSON: !1, + Map: !1, + Math: !1, + NaN: !1, + Number: !1, + Object: !1, + parseFloat: !1, + parseInt: !1, + Promise: !1, + propertyIsEnumerable: !1, + Proxy: !1, + RangeError: !1, + ReferenceError: !1, + Reflect: !1, + RegExp: !1, + Set: !1, + String: !1, + Symbol: !1, + SyntaxError: !1, + System: !1, + toLocaleString: !1, + toString: !1, + TypeError: !1, + Uint16Array: !1, + Uint32Array: !1, + Uint8Array: !1, + Uint8ClampedArray: !1, + undefined: !1, + unescape: !1, + URIError: !1, + valueOf: !1, + WeakMap: !1, + WeakSet: !1 + }, + browser: { + addEventListener: !1, + alert: !1, + AnalyserNode: !1, + AnimationEvent: !1, + applicationCache: !1, + ApplicationCache: !1, + ApplicationCacheErrorEvent: !1, + atob: !1, + Attr: !1, + Audio: !1, + AudioBuffer: !1, + AudioBufferSourceNode: !1, + AudioContext: !1, + AudioDestinationNode: !1, + AudioListener: !1, + AudioNode: !1, + AudioParam: !1, + AudioProcessingEvent: !1, + AutocompleteErrorEvent: !1, + BarProp: !1, + BatteryManager: !1, + BeforeUnloadEvent: !1, + BiquadFilterNode: !1, + Blob: !1, + blur: !1, + btoa: !1, + Cache: !1, + caches: !1, + CacheStorage: !1, + cancelAnimationFrame: !1, + CanvasGradient: !1, + CanvasPattern: !1, + CanvasRenderingContext2D: !1, + CDATASection: !1, + ChannelMergerNode: !1, + ChannelSplitterNode: !1, + CharacterData: !1, + clearInterval: !1, + clearTimeout: !1, + clientInformation: !1, + ClientRect: !1, + ClientRectList: !1, + ClipboardEvent: !1, + close: !1, + closed: !1, + CloseEvent: !1, + Comment: !1, + CompositionEvent: !1, + confirm: !1, + console: !1, + ConvolverNode: !1, + crypto: !1, + Crypto: !1, + CryptoKey: !1, + CSS: !1, + CSSFontFaceRule: !1, + CSSImportRule: !1, + CSSKeyframeRule: !1, + CSSKeyframesRule: !1, + CSSMediaRule: !1, + CSSPageRule: !1, + CSSRule: !1, + CSSRuleList: !1, + CSSStyleDeclaration: !1, + CSSStyleRule: !1, + CSSStyleSheet: !1, + CSSSupportsRule: !1, + CSSUnknownRule: !1, + CSSViewportRule: !1, + CustomEvent: !1, + DataTransfer: !1, + DataTransferItem: !1, + DataTransferItemList: !1, + Debug: !1, + defaultStatus: !1, + defaultstatus: !1, + DelayNode: !1, + DeviceMotionEvent: !1, + DeviceOrientationEvent: !1, + devicePixelRatio: !1, + dispatchEvent: !1, + document: !1, + Document: !1, + DocumentFragment: !1, + DocumentType: !1, + DOMError: !1, + DOMException: !1, + DOMImplementation: !1, + DOMParser: !1, + DOMSettableTokenList: !1, + DOMStringList: !1, + DOMStringMap: !1, + DOMTokenList: !1, + DragEvent: !1, + DynamicsCompressorNode: !1, + Element: !1, + ElementTimeControl: !1, + ErrorEvent: !1, + event: !1, + Event: !1, + EventSource: !1, + EventTarget: !1, + external: !1, + fetch: !1, + File: !1, + FileError: !1, + FileList: !1, + FileReader: !1, + find: !1, + focus: !1, + FocusEvent: !1, + FontFace: !1, + FormData: !1, + frameElement: !1, + frames: !1, + GainNode: !1, + Gamepad: !1, + GamepadButton: !1, + GamepadEvent: !1, + getComputedStyle: !1, + getSelection: !1, + HashChangeEvent: !1, + Headers: !1, + history: !1, + History: !1, + HTMLAllCollection: !1, + HTMLAnchorElement: !1, + HTMLAppletElement: !1, + HTMLAreaElement: !1, + HTMLAudioElement: !1, + HTMLBaseElement: !1, + HTMLBlockquoteElement: !1, + HTMLBodyElement: !1, + HTMLBRElement: !1, + HTMLButtonElement: !1, + HTMLCanvasElement: !1, + HTMLCollection: !1, + HTMLContentElement: !1, + HTMLDataListElement: !1, + HTMLDetailsElement: !1, + HTMLDialogElement: !1, + HTMLDirectoryElement: !1, + HTMLDivElement: !1, + HTMLDListElement: !1, + HTMLDocument: !1, + HTMLElement: !1, + HTMLEmbedElement: !1, + HTMLFieldSetElement: !1, + HTMLFontElement: !1, + HTMLFormControlsCollection: !1, + HTMLFormElement: !1, + HTMLFrameElement: !1, + HTMLFrameSetElement: !1, + HTMLHeadElement: !1, + HTMLHeadingElement: !1, + HTMLHRElement: !1, + HTMLHtmlElement: !1, + HTMLIFrameElement: !1, + HTMLImageElement: !1, + HTMLInputElement: !1, + HTMLIsIndexElement: !1, + HTMLKeygenElement: !1, + HTMLLabelElement: !1, + HTMLLayerElement: !1, + HTMLLegendElement: !1, + HTMLLIElement: !1, + HTMLLinkElement: !1, + HTMLMapElement: !1, + HTMLMarqueeElement: !1, + HTMLMediaElement: !1, + HTMLMenuElement: !1, + HTMLMetaElement: !1, + HTMLMeterElement: !1, + HTMLModElement: !1, + HTMLObjectElement: !1, + HTMLOListElement: !1, + HTMLOptGroupElement: !1, + HTMLOptionElement: !1, + HTMLOptionsCollection: !1, + HTMLOutputElement: !1, + HTMLParagraphElement: !1, + HTMLParamElement: !1, + HTMLPictureElement: !1, + HTMLPreElement: !1, + HTMLProgressElement: !1, + HTMLQuoteElement: !1, + HTMLScriptElement: !1, + HTMLSelectElement: !1, + HTMLShadowElement: !1, + HTMLSourceElement: !1, + HTMLSpanElement: !1, + HTMLStyleElement: !1, + HTMLTableCaptionElement: !1, + HTMLTableCellElement: !1, + HTMLTableColElement: !1, + HTMLTableElement: !1, + HTMLTableRowElement: !1, + HTMLTableSectionElement: !1, + HTMLTemplateElement: !1, + HTMLTextAreaElement: !1, + HTMLTitleElement: !1, + HTMLTrackElement: !1, + HTMLUListElement: !1, + HTMLUnknownElement: !1, + HTMLVideoElement: !1, + IDBCursor: !1, + IDBCursorWithValue: !1, + IDBDatabase: !1, + IDBEnvironment: !1, + IDBFactory: !1, + IDBIndex: !1, + IDBKeyRange: !1, + IDBObjectStore: !1, + IDBOpenDBRequest: !1, + IDBRequest: !1, + IDBTransaction: !1, + IDBVersionChangeEvent: !1, + Image: !1, + ImageBitmap: !1, + ImageData: !1, + indexedDB: !1, + innerHeight: !1, + innerWidth: !1, + InputEvent: !1, + InputMethodContext: !1, + Intl: !1, + KeyboardEvent: !1, + length: !1, + localStorage: !1, + location: !1, + Location: !1, + locationbar: !1, + matchMedia: !1, + MediaElementAudioSourceNode: !1, + MediaEncryptedEvent: !1, + MediaError: !1, + MediaKeyError: !1, + MediaKeyEvent: !1, + MediaKeyMessageEvent: !1, + MediaKeys: !1, + MediaKeySession: !1, + MediaKeyStatusMap: !1, + MediaKeySystemAccess: !1, + MediaList: !1, + MediaQueryList: !1, + MediaQueryListEvent: !1, + MediaSource: !1, + MediaStreamAudioDestinationNode: !1, + MediaStreamAudioSourceNode: !1, + MediaStreamEvent: !1, + MediaStreamTrack: !1, + menubar: !1, + MessageChannel: !1, + MessageEvent: !1, + MessagePort: !1, + MIDIAccess: !1, + MIDIConnectionEvent: !1, + MIDIInput: !1, + MIDIInputMap: !1, + MIDIMessageEvent: !1, + MIDIOutput: !1, + MIDIOutputMap: !1, + MIDIPort: !1, + MimeType: !1, + MimeTypeArray: !1, + MouseEvent: !1, + moveBy: !1, + moveTo: !1, + MutationEvent: !1, + MutationObserver: !1, + MutationRecord: !1, + name: !1, + NamedNodeMap: !1, + navigator: !1, + Navigator: !1, + Node: !1, + NodeFilter: !1, + NodeIterator: !1, + NodeList: !1, + Notification: !1, + OfflineAudioCompletionEvent: !1, + OfflineAudioContext: !1, + offscreenBuffering: !1, + onbeforeunload: !0, + onblur: !0, + onerror: !0, + onfocus: !0, + onload: !0, + onresize: !0, + onunload: !0, + open: !1, + openDatabase: !1, + opener: !1, + opera: !1, + Option: !1, + OscillatorNode: !1, + outerHeight: !1, + outerWidth: !1, + PageTransitionEvent: !1, + pageXOffset: !1, + pageYOffset: !1, + parent: !1, + Path2D: !1, + performance: !1, + Performance: !1, + PerformanceEntry: !1, + PerformanceMark: !1, + PerformanceMeasure: !1, + PerformanceNavigation: !1, + PerformanceResourceTiming: !1, + PerformanceTiming: !1, + PeriodicWave: !1, + Permissions: !1, + PermissionStatus: !1, + personalbar: !1, + Plugin: !1, + PluginArray: !1, + PopStateEvent: !1, + postMessage: !1, + print: !1, + ProcessingInstruction: !1, + ProgressEvent: !1, + prompt: !1, + PushManager: !1, + PushSubscription: !1, + RadioNodeList: !1, + Range: !1, + ReadableByteStream: !1, + ReadableStream: !1, + removeEventListener: !1, + Request: !1, + requestAnimationFrame: !1, + resizeBy: !1, + resizeTo: !1, + Response: !1, + RTCIceCandidate: !1, + RTCSessionDescription: !1, + screen: !1, + Screen: !1, + screenLeft: !1, + ScreenOrientation: !1, + screenTop: !1, + screenX: !1, + screenY: !1, + ScriptProcessorNode: !1, + scroll: !1, + scrollbars: !1, + scrollBy: !1, + scrollTo: !1, + scrollX: !1, + scrollY: !1, + SecurityPolicyViolationEvent: !1, + Selection: !1, + self: !1, + ServiceWorker: !1, + ServiceWorkerContainer: !1, + ServiceWorkerRegistration: !1, + sessionStorage: !1, + setInterval: !1, + setTimeout: !1, + ShadowRoot: !1, + SharedWorker: !1, + showModalDialog: !1, + speechSynthesis: !1, + SpeechSynthesisEvent: !1, + SpeechSynthesisUtterance: !1, + status: !1, + statusbar: !1, + stop: !1, + Storage: !1, + StorageEvent: !1, + styleMedia: !1, + StyleSheet: !1, + StyleSheetList: !1, + SubtleCrypto: !1, + SVGAElement: !1, + SVGAltGlyphDefElement: !1, + SVGAltGlyphElement: !1, + SVGAltGlyphItemElement: !1, + SVGAngle: !1, + SVGAnimateColorElement: !1, + SVGAnimatedAngle: !1, + SVGAnimatedBoolean: !1, + SVGAnimatedEnumeration: !1, + SVGAnimatedInteger: !1, + SVGAnimatedLength: !1, + SVGAnimatedLengthList: !1, + SVGAnimatedNumber: !1, + SVGAnimatedNumberList: !1, + SVGAnimatedPathData: !1, + SVGAnimatedPoints: !1, + SVGAnimatedPreserveAspectRatio: !1, + SVGAnimatedRect: !1, + SVGAnimatedString: !1, + SVGAnimatedTransformList: !1, + SVGAnimateElement: !1, + SVGAnimateMotionElement: !1, + SVGAnimateTransformElement: !1, + SVGAnimationElement: !1, + SVGCircleElement: !1, + SVGClipPathElement: !1, + SVGColor: !1, + SVGColorProfileElement: !1, + SVGColorProfileRule: !1, + SVGComponentTransferFunctionElement: !1, + SVGCSSRule: !1, + SVGCursorElement: !1, + SVGDefsElement: !1, + SVGDescElement: !1, + SVGDiscardElement: !1, + SVGDocument: !1, + SVGElement: !1, + SVGElementInstance: !1, + SVGElementInstanceList: !1, + SVGEllipseElement: !1, + SVGEvent: !1, + SVGExternalResourcesRequired: !1, + SVGFEBlendElement: !1, + SVGFEColorMatrixElement: !1, + SVGFEComponentTransferElement: !1, + SVGFECompositeElement: !1, + SVGFEConvolveMatrixElement: !1, + SVGFEDiffuseLightingElement: !1, + SVGFEDisplacementMapElement: !1, + SVGFEDistantLightElement: !1, + SVGFEDropShadowElement: !1, + SVGFEFloodElement: !1, + SVGFEFuncAElement: !1, + SVGFEFuncBElement: !1, + SVGFEFuncGElement: !1, + SVGFEFuncRElement: !1, + SVGFEGaussianBlurElement: !1, + SVGFEImageElement: !1, + SVGFEMergeElement: !1, + SVGFEMergeNodeElement: !1, + SVGFEMorphologyElement: !1, + SVGFEOffsetElement: !1, + SVGFEPointLightElement: !1, + SVGFESpecularLightingElement: !1, + SVGFESpotLightElement: !1, + SVGFETileElement: !1, + SVGFETurbulenceElement: !1, + SVGFilterElement: !1, + SVGFilterPrimitiveStandardAttributes: !1, + SVGFitToViewBox: !1, + SVGFontElement: !1, + SVGFontFaceElement: !1, + SVGFontFaceFormatElement: !1, + SVGFontFaceNameElement: !1, + SVGFontFaceSrcElement: !1, + SVGFontFaceUriElement: !1, + SVGForeignObjectElement: !1, + SVGGElement: !1, + SVGGeometryElement: !1, + SVGGlyphElement: !1, + SVGGlyphRefElement: !1, + SVGGradientElement: !1, + SVGGraphicsElement: !1, + SVGHKernElement: !1, + SVGICCColor: !1, + SVGImageElement: !1, + SVGLangSpace: !1, + SVGLength: !1, + SVGLengthList: !1, + SVGLinearGradientElement: !1, + SVGLineElement: !1, + SVGLocatable: !1, + SVGMarkerElement: !1, + SVGMaskElement: !1, + SVGMatrix: !1, + SVGMetadataElement: !1, + SVGMissingGlyphElement: !1, + SVGMPathElement: !1, + SVGNumber: !1, + SVGNumberList: !1, + SVGPaint: !1, + SVGPathElement: !1, + SVGPathSeg: !1, + SVGPathSegArcAbs: !1, + SVGPathSegArcRel: !1, + SVGPathSegClosePath: !1, + SVGPathSegCurvetoCubicAbs: !1, + SVGPathSegCurvetoCubicRel: !1, + SVGPathSegCurvetoCubicSmoothAbs: !1, + SVGPathSegCurvetoCubicSmoothRel: !1, + SVGPathSegCurvetoQuadraticAbs: !1, + SVGPathSegCurvetoQuadraticRel: !1, + SVGPathSegCurvetoQuadraticSmoothAbs: !1, + SVGPathSegCurvetoQuadraticSmoothRel: !1, + SVGPathSegLinetoAbs: !1, + SVGPathSegLinetoHorizontalAbs: !1, + SVGPathSegLinetoHorizontalRel: !1, + SVGPathSegLinetoRel: !1, + SVGPathSegLinetoVerticalAbs: !1, + SVGPathSegLinetoVerticalRel: !1, + SVGPathSegList: !1, + SVGPathSegMovetoAbs: !1, + SVGPathSegMovetoRel: !1, + SVGPatternElement: !1, + SVGPoint: !1, + SVGPointList: !1, + SVGPolygonElement: !1, + SVGPolylineElement: !1, + SVGPreserveAspectRatio: !1, + SVGRadialGradientElement: !1, + SVGRect: !1, + SVGRectElement: !1, + SVGRenderingIntent: !1, + SVGScriptElement: !1, + SVGSetElement: !1, + SVGStopElement: !1, + SVGStringList: !1, + SVGStylable: !1, + SVGStyleElement: !1, + SVGSVGElement: !1, + SVGSwitchElement: !1, + SVGSymbolElement: !1, + SVGTests: !1, + SVGTextContentElement: !1, + SVGTextElement: !1, + SVGTextPathElement: !1, + SVGTextPositioningElement: !1, + SVGTitleElement: !1, + SVGTransform: !1, + SVGTransformable: !1, + SVGTransformList: !1, + SVGTRefElement: !1, + SVGTSpanElement: !1, + SVGUnitTypes: !1, + SVGURIReference: !1, + SVGUseElement: !1, + SVGViewElement: !1, + SVGViewSpec: !1, + SVGVKernElement: !1, + SVGZoomAndPan: !1, + SVGZoomEvent: !1, + Text: !1, + TextDecoder: !1, + TextEncoder: !1, + TextEvent: !1, + TextMetrics: !1, + TextTrack: !1, + TextTrackCue: !1, + TextTrackCueList: !1, + TextTrackList: !1, + TimeEvent: !1, + TimeRanges: !1, + toolbar: !1, + top: !1, + Touch: !1, + TouchEvent: !1, + TouchList: !1, + TrackEvent: !1, + TransitionEvent: !1, + TreeWalker: !1, + UIEvent: !1, + URL: !1, + ValidityState: !1, + VTTCue: !1, + WaveShaperNode: !1, + WebGLActiveInfo: !1, + WebGLBuffer: !1, + WebGLContextEvent: !1, + WebGLFramebuffer: !1, + WebGLProgram: !1, + WebGLRenderbuffer: !1, + WebGLRenderingContext: !1, + WebGLShader: !1, + WebGLShaderPrecisionFormat: !1, + WebGLTexture: !1, + WebGLUniformLocation: !1, + WebSocket: !1, + WheelEvent: !1, + window: !1, + Window: !1, + Worker: !1, + XDomainRequest: !1, + XMLDocument: !1, + XMLHttpRequest: !1, + XMLHttpRequestEventTarget: !1, + XMLHttpRequestProgressEvent: !1, + XMLHttpRequestUpload: !1, + XMLSerializer: !1, + XPathEvaluator: !1, + XPathException: !1, + XPathExpression: !1, + XPathNamespace: !1, + XPathNSResolver: !1, + XPathResult: !1, + XSLTProcessor: !1 + }, + worker: { + applicationCache: !1, + atob: !1, + Blob: !1, + BroadcastChannel: !1, + btoa: !1, + Cache: !1, + caches: !1, + clearInterval: !1, + clearTimeout: !1, + close: !0, + console: !1, + fetch: !1, + FileReaderSync: !1, + FormData: !1, + Headers: !1, + IDBCursor: !1, + IDBCursorWithValue: !1, + IDBDatabase: !1, + IDBFactory: !1, + IDBIndex: !1, + IDBKeyRange: !1, + IDBObjectStore: !1, + IDBOpenDBRequest: !1, + IDBRequest: !1, + IDBTransaction: !1, + IDBVersionChangeEvent: !1, + ImageData: !1, + importScripts: !0, + indexedDB: !1, + location: !1, + MessageChannel: !1, + MessagePort: !1, + name: !1, + navigator: !1, + Notification: !1, + onclose: !0, + onconnect: !0, + onerror: !0, + onlanguagechange: !0, + onmessage: !0, + onoffline: !0, + ononline: !0, + onrejectionhandled: !0, + onunhandledrejection: !0, + performance: !1, + Performance: !1, + PerformanceEntry: !1, + PerformanceMark: !1, + PerformanceMeasure: !1, + PerformanceNavigation: !1, + PerformanceResourceTiming: !1, + PerformanceTiming: !1, + postMessage: !0, + Promise: !1, + Request: !1, + Response: !1, + self: !0, + ServiceWorkerRegistration: !1, + setInterval: !1, + setTimeout: !1, + TextDecoder: !1, + TextEncoder: !1, + URL: !1, + WebSocket: !1, + Worker: !1, + XMLHttpRequest: !1 + }, + node: { + __dirname: !1, + __filename: !1, + arguments: !1, + Buffer: !1, + clearImmediate: !1, + clearInterval: !1, + clearTimeout: !1, + console: !1, + exports: !0, + GLOBAL: !1, + global: !1, + module: !1, + process: !1, + require: !1, + root: !1, + setImmediate: !1, + setInterval: !1, + setTimeout: !1 + }, + commonjs: { exports: !0, module: !1, require: !1, global: !1 }, + amd: { define: !1, require: !1 }, + mocha: { + after: !1, + afterEach: !1, + before: !1, + beforeEach: !1, + context: !1, + describe: !1, + it: !1, + mocha: !1, + setup: !1, + specify: !1, + suite: !1, + suiteSetup: !1, + suiteTeardown: !1, + teardown: !1, + test: !1, + xcontext: !1, + xdescribe: !1, + xit: !1, + xspecify: !1 + }, + jasmine: { + afterAll: !1, + afterEach: !1, + beforeAll: !1, + beforeEach: !1, + describe: !1, + expect: !1, + fail: !1, + fdescribe: !1, + fit: !1, + it: !1, + jasmine: !1, + pending: !1, + runs: !1, + spyOn: !1, + waits: !1, + waitsFor: !1, + xdescribe: !1, + xit: !1 + }, + jest: { + afterEach: !1, + beforeEach: !1, + describe: !1, + expect: !1, + it: !1, + jest: !1, + pit: !1, + require: !1, + xdescribe: !1, + xit: !1 + }, + qunit: { + asyncTest: !1, + deepEqual: !1, + equal: !1, + expect: !1, + module: !1, + notDeepEqual: !1, + notEqual: !1, + notOk: !1, + notPropEqual: !1, + notStrictEqual: !1, + ok: !1, + propEqual: !1, + QUnit: !1, + raises: !1, + start: !1, + stop: !1, + strictEqual: !1, + test: !1, + throws: !1 + }, + phantomjs: { console: !0, exports: !0, phantom: !0, require: !0, WebPage: !0 }, + couch: { + emit: !1, + exports: !1, + getRow: !1, + log: !1, + module: !1, + provides: !1, + require: !1, + respond: !1, + send: !1, + start: !1, + sum: !1 + }, + rhino: { + defineClass: !1, + deserialize: !1, + gc: !1, + help: !1, + importClass: !1, + importPackage: !1, + java: !1, + load: !1, + loadClass: !1, + Packages: !1, + print: !1, + quit: !1, + readFile: !1, + readUrl: !1, + runCommand: !1, + seal: !1, + serialize: !1, + spawn: !1, + sync: !1, + toint32: !1, + version: !1 + }, + nashorn: { + __DIR__: !1, + __FILE__: !1, + __LINE__: !1, + com: !1, + edu: !1, + exit: !1, + Java: !1, + java: !1, + javafx: !1, + JavaImporter: !1, + javax: !1, + JSAdapter: !1, + load: !1, + loadWithNewGlobal: !1, + org: !1, + Packages: !1, + print: !1, + quit: !1 + }, + wsh: { + ActiveXObject: !0, + Enumerator: !0, + GetObject: !0, + ScriptEngine: !0, + ScriptEngineBuildVersion: !0, + ScriptEngineMajorVersion: !0, + ScriptEngineMinorVersion: !0, + VBArray: !0, + WScript: !0, + WSH: !0, + XDomainRequest: !0 + }, + jquery: { $: !1, jQuery: !1 }, + yui: { Y: !1, YUI: !1, YUI_config: !1 }, + shelljs: { + cat: !1, + cd: !1, + chmod: !1, + config: !1, + cp: !1, + dirs: !1, + echo: !1, + env: !1, + error: !1, + exec: !1, + exit: !1, + find: !1, + grep: !1, + ls: !1, + ln: !1, + mkdir: !1, + mv: !1, + popd: !1, + pushd: !1, + pwd: !1, + rm: !1, + sed: !1, + target: !1, + tempdir: !1, + test: !1, + which: !1 + }, + prototypejs: { + $: !1, + $$: !1, + $A: !1, + $break: !1, + $continue: !1, + $F: !1, + $H: !1, + $R: !1, + $w: !1, + Abstract: !1, + Ajax: !1, + Autocompleter: !1, + Builder: !1, + Class: !1, + Control: !1, + Draggable: !1, + Draggables: !1, + Droppables: !1, + Effect: !1, + Element: !1, + Enumerable: !1, + Event: !1, + Field: !1, + Form: !1, + Hash: !1, + Insertion: !1, + ObjectRange: !1, + PeriodicalExecuter: !1, + Position: !1, + Prototype: !1, + Scriptaculous: !1, + Selector: !1, + Sortable: !1, + SortableObserver: !1, + Sound: !1, + Template: !1, + Toggle: !1, + Try: !1 + }, + meteor: { + $: !1, + _: !1, + Accounts: !1, + App: !1, + Assets: !1, + Blaze: !1, + check: !1, + Cordova: !1, + DDP: !1, + DDPServer: !1, + Deps: !1, + EJSON: !1, + Email: !1, + HTTP: !1, + Log: !1, + Match: !1, + Meteor: !1, + Mongo: !1, + MongoInternals: !1, + Npm: !1, + Package: !1, + Plugin: !1, + process: !1, + Random: !1, + ReactiveDict: !1, + ReactiveVar: !1, + Router: !1, + Session: !1, + share: !1, + Spacebars: !1, + Template: !1, + Tinytest: !1, + Tracker: !1, + UI: !1, + Utils: !1, + WebApp: !1, + WebAppInternals: !1 + }, + mongo: { + _isWindows: !1, + _rand: !1, + BulkWriteResult: !1, + cat: !1, + cd: !1, + connect: !1, + db: !1, + getHostName: !1, + getMemInfo: !1, + hostname: !1, + listFiles: !1, + load: !1, + ls: !1, + md5sumFile: !1, + mkdir: !1, + Mongo: !1, + ObjectId: !1, + PlanCache: !1, + print: !1, + printjson: !1, + pwd: !1, + quit: !1, + removeFile: !1, + rs: !1, + sh: !1, + UUID: !1, + version: !1, + WriteResult: !1 + }, + applescript: { + $: !1, + Application: !1, + Automation: !1, + console: !1, + delay: !1, + Library: !1, + ObjC: !1, + ObjectSpecifier: !1, + Path: !1, + Progress: !1, + Ref: !1 + }, + serviceworker: { + caches: !1, + Cache: !1, + CacheStorage: !1, + Client: !1, + clients: !1, + Clients: !1, + ExtendableEvent: !1, + ExtendableMessageEvent: !1, + FetchEvent: !1, + importScripts: !1, + registration: !1, + self: !1, + ServiceWorker: !1, + ServiceWorkerContainer: !1, + ServiceWorkerGlobalScope: !1, + ServiceWorkerMessageEvent: !1, + ServiceWorkerRegistration: !1, + skipWaiting: !1, + WindowClient: !1 + }, + atomtest: { + advanceClock: !1, + fakeClearInterval: !1, + fakeClearTimeout: !1, + fakeSetInterval: !1, + fakeSetTimeout: !1, + resetTimeouts: !1, + waitsForPromise: !1 + }, + embertest: { + andThen: !1, + click: !1, + currentPath: !1, + currentRouteName: !1, + currentURL: !1, + fillIn: !1, + find: !1, + findWithAssert: !1, + keyEvent: !1, + pauseTest: !1, + triggerEvent: !1, + visit: !1 + }, + protractor: { + $: !1, + $$: !1, + browser: !1, + By: !1, + by: !1, + DartObject: !1, + element: !1, + protractor: !1 + }, + "shared-node-browser": { + clearInterval: !1, + clearTimeout: !1, + console: !1, + setInterval: !1, + setTimeout: !1 + }, + webextensions: { browser: !1, chrome: !1, opr: !1 }, + greasemonkey: { + GM_addStyle: !1, + GM_deleteValue: !1, + GM_getResourceText: !1, + GM_getResourceURL: !1, + GM_getValue: !1, + GM_info: !1, + GM_listValues: !1, + GM_log: !1, + GM_openInTab: !1, + GM_registerMenuCommand: !1, + GM_setClipboard: !1, + GM_setValue: !1, + GM_xmlhttpRequest: !1, + unsafeWindow: !1 + } + } + }, + function(e, t) { + e.exports = { + name: "babel-core", + version: "6.6.5", + description: "Babel compiler core.", + author: { name: "Sebastian McKenzie", email: "sebmck@gmail.com" }, + homepage: "https://babeljs.io/", + license: "MIT", + repository: { + type: "git", + url: "https://github.com/babel/babel/tree/master/packages/babel-core" + }, + keywords: [ + "6to5", + "babel", + "classes", + "const", + "es6", + "harmony", + "let", + "modules", + "transpile", + "transpiler", + "var" + ], + scripts: { bench: "make bench", test: "make test" }, + dependencies: { + "babel-code-frame": "^6.6.5", + "babel-generator": "^6.6.5", + "babel-helpers": "^6.6.0", + "babel-messages": "^6.6.5", + "babel-template": "^6.6.5", + "babel-runtime": "^5.0.0", + "babel-register": "^6.6.5", + "babel-traverse": "^6.6.5", + "babel-types": "^6.6.5", + babylon: "^6.6.5", + "convert-source-map": "^1.1.0", + debug: "^2.1.1", + json5: "^0.4.0", + lodash: "^3.10.0", + minimatch: "^2.0.3", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + private: "^0.1.6", + "shebang-regex": "^1.0.0", + slash: "^1.0.0", + "source-map": "^0.5.0" + }, + devDependencies: { + "babel-helper-fixtures": "^6.6.5", + "babel-helper-transform-fixture-test-runner": "^6.6.5", + "babel-polyfill": "^6.6.0" + }, + _id: "babel-core@6.6.5", + _shasum: "e94607e1a4d53d53609862e38690fa78709de96c", + _from: "babel-core@>=6.4.5 <7.0.0", + _npmVersion: "3.6.0", + _nodeVersion: "5.1.0", + _npmUser: { name: "hzoo", email: "hi@henryzoo.com" }, + dist: { + shasum: "e94607e1a4d53d53609862e38690fa78709de96c", + tarball: "http://registry.npmjs.org/babel-core/-/babel-core-6.6.5.tgz" + }, + maintainers: [ + { name: "amasad", email: "amjad.masad@gmail.com" }, + { name: "hzoo", email: "hi@henryzoo.com" }, + { name: "jmm", email: "npm-public@jessemccarthy.net" }, + { name: "loganfsmyth", email: "loganfsmyth@gmail.com" }, + { name: "sebmck", email: "sebmck@gmail.com" }, + { name: "thejameskyle", email: "me@thejameskyle.com" } + ], + _npmOperationalInternal: { + host: "packages-13-west.internal.npmjs.com", + tmp: "tmp/babel-core-6.6.5.tgz_1457133380701_0.5239949987735599" + }, + directories: {}, + _resolved: "https://registry.npmjs.org/babel-core/-/babel-core-6.6.5.tgz" + } + }, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + function(e, t) { + e.exports = { + 75: 8490, + 83: 383, + 107: 8490, + 115: 383, + 181: 924, + 197: 8491, + 383: 83, + 452: 453, + 453: 452, + 455: 456, + 456: 455, + 458: 459, + 459: 458, + 497: 498, + 498: 497, + 837: 8126, + 914: 976, + 917: 1013, + 920: 1012, + 921: 8126, + 922: 1008, + 924: 181, + 928: 982, + 929: 1009, + 931: 962, + 934: 981, + 937: 8486, + 962: 931, + 976: 914, + 977: 1012, + 981: 934, + 982: 928, + 1008: 922, + 1009: 929, + 1012: [920, 977], + 1013: 917, + 7776: 7835, + 7835: 7776, + 8126: [837, 921], + 8486: 937, + 8490: 75, + 8491: 197, + 66560: 66600, + 66561: 66601, + 66562: 66602, + 66563: 66603, + 66564: 66604, + 66565: 66605, + 66566: 66606, + 66567: 66607, + 66568: 66608, + 66569: 66609, + 66570: 66610, + 66571: 66611, + 66572: 66612, + 66573: 66613, + 66574: 66614, + 66575: 66615, + 66576: 66616, + 66577: 66617, + 66578: 66618, + 66579: 66619, + 66580: 66620, + 66581: 66621, + 66582: 66622, + 66583: 66623, + 66584: 66624, + 66585: 66625, + 66586: 66626, + 66587: 66627, + 66588: 66628, + 66589: 66629, + 66590: 66630, + 66591: 66631, + 66592: 66632, + 66593: 66633, + 66594: 66634, + 66595: 66635, + 66596: 66636, + 66597: 66637, + 66598: 66638, + 66599: 66639, + 66600: 66560, + 66601: 66561, + 66602: 66562, + 66603: 66563, + 66604: 66564, + 66605: 66565, + 66606: 66566, + 66607: 66567, + 66608: 66568, + 66609: 66569, + 66610: 66570, + 66611: 66571, + 66612: 66572, + 66613: 66573, + 66614: 66574, + 66615: 66575, + 66616: 66576, + 66617: 66577, + 66618: 66578, + 66619: 66579, + 66620: 66580, + 66621: 66581, + 66622: 66582, + 66623: 66583, + 66624: 66584, + 66625: 66585, + 66626: 66586, + 66627: 66587, + 66628: 66588, + 66629: 66589, + 66630: 66590, + 66631: 66591, + 66632: 66592, + 66633: 66593, + 66634: 66594, + 66635: 66595, + 66636: 66596, + 66637: 66597, + 66638: 66598, + 66639: 66599, + 68736: 68800, + 68737: 68801, + 68738: 68802, + 68739: 68803, + 68740: 68804, + 68741: 68805, + 68742: 68806, + 68743: 68807, + 68744: 68808, + 68745: 68809, + 68746: 68810, + 68747: 68811, + 68748: 68812, + 68749: 68813, + 68750: 68814, + 68751: 68815, + 68752: 68816, + 68753: 68817, + 68754: 68818, + 68755: 68819, + 68756: 68820, + 68757: 68821, + 68758: 68822, + 68759: 68823, + 68760: 68824, + 68761: 68825, + 68762: 68826, + 68763: 68827, + 68764: 68828, + 68765: 68829, + 68766: 68830, + 68767: 68831, + 68768: 68832, + 68769: 68833, + 68770: 68834, + 68771: 68835, + 68772: 68836, + 68773: 68837, + 68774: 68838, + 68775: 68839, + 68776: 68840, + 68777: 68841, + 68778: 68842, + 68779: 68843, + 68780: 68844, + 68781: 68845, + 68782: 68846, + 68783: 68847, + 68784: 68848, + 68785: 68849, + 68786: 68850, + 68800: 68736, + 68801: 68737, + 68802: 68738, + 68803: 68739, + 68804: 68740, + 68805: 68741, + 68806: 68742, + 68807: 68743, + 68808: 68744, + 68809: 68745, + 68810: 68746, + 68811: 68747, + 68812: 68748, + 68813: 68749, + 68814: 68750, + 68815: 68751, + 68816: 68752, + 68817: 68753, + 68818: 68754, + 68819: 68755, + 68820: 68756, + 68821: 68757, + 68822: 68758, + 68823: 68759, + 68824: 68760, + 68825: 68761, + 68826: 68762, + 68827: 68763, + 68828: 68764, + 68829: 68765, + 68830: 68766, + 68831: 68767, + 68832: 68768, + 68833: 68769, + 68834: 68770, + 68835: 68771, + 68836: 68772, + 68837: 68773, + 68838: 68774, + 68839: 68775, + 68840: 68776, + 68841: 68777, + 68842: 68778, + 68843: 68779, + 68844: 68780, + 68845: 68781, + 68846: 68782, + 68847: 68783, + 68848: 68784, + 68849: 68785, + 68850: 68786, + 71840: 71872, + 71841: 71873, + 71842: 71874, + 71843: 71875, + 71844: 71876, + 71845: 71877, + 71846: 71878, + 71847: 71879, + 71848: 71880, + 71849: 71881, + 71850: 71882, + 71851: 71883, + 71852: 71884, + 71853: 71885, + 71854: 71886, + 71855: 71887, + 71856: 71888, + 71857: 71889, + 71858: 71890, + 71859: 71891, + 71860: 71892, + 71861: 71893, + 71862: 71894, + 71863: 71895, + 71864: 71896, + 71865: 71897, + 71866: 71898, + 71867: 71899, + 71868: 71900, + 71869: 71901, + 71870: 71902, + 71871: 71903, + 71872: 71840, + 71873: 71841, + 71874: 71842, + 71875: 71843, + 71876: 71844, + 71877: 71845, + 71878: 71846, + 71879: 71847, + 71880: 71848, + 71881: 71849, + 71882: 71850, + 71883: 71851, + 71884: 71852, + 71885: 71853, + 71886: 71854, + 71887: 71855, + 71888: 71856, + 71889: 71857, + 71890: 71858, + 71891: 71859, + 71892: 71860, + 71893: 71861, + 71894: 71862, + 71895: 71863, + 71896: 71864, + 71897: 71865, + 71898: 71866, + 71899: 71867, + 71900: 71868, + 71901: 71869, + 71902: 71870, + 71903: 71871 + } + }, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + 7278, + function(e, t, r) { + var n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + !(function(e) { + "use strict" + function t(e) { + var t = e.charCodeAt(0) + return t === a || t === p + ? 62 + : t === o || t === f + ? 63 + : u > t + ? -1 + : u + 10 > t + ? t - u + 26 + 26 + : c + 26 > t + ? t - c + : l + 26 > t + ? t - l + 26 + : void 0 + } + function r(e) { + function r(e) { + l[p++] = e + } + var n, i, a, o, u, l + if (e.length % 4 > 0) + throw new Error("Invalid string. Length must be a multiple of 4") + var c = e.length + ;(u = "=" === e.charAt(c - 2) ? 2 : "=" === e.charAt(c - 1) ? 1 : 0), + (l = new s((3 * e.length) / 4 - u)), + (a = u > 0 ? e.length - 4 : e.length) + var p = 0 + for (n = 0, i = 0; a > n; n += 4, i += 3) + (o = + (t(e.charAt(n)) << 18) | + (t(e.charAt(n + 1)) << 12) | + (t(e.charAt(n + 2)) << 6) | + t(e.charAt(n + 3))), + r((16711680 & o) >> 16), + r((65280 & o) >> 8), + r(255 & o) + return ( + 2 === u + ? ((o = (t(e.charAt(n)) << 2) | (t(e.charAt(n + 1)) >> 4)), + r(255 & o)) + : 1 === u && + ((o = + (t(e.charAt(n)) << 10) | + (t(e.charAt(n + 1)) << 4) | + (t(e.charAt(n + 2)) >> 2)), + r((o >> 8) & 255), + r(255 & o)), + l + ) + } + function i(e) { + function t(e) { + return n.charAt(e) + } + function r(e) { + return ( + t((e >> 18) & 63) + t((e >> 12) & 63) + t((e >> 6) & 63) + t(63 & e) + ) + } + var i, + s, + a, + o = e.length % 3, + u = "" + for (i = 0, a = e.length - o; a > i; i += 3) + (s = (e[i] << 16) + (e[i + 1] << 8) + e[i + 2]), (u += r(s)) + switch (o) { + case 1: + ;(s = e[e.length - 1]), + (u += t(s >> 2)), + (u += t((s << 4) & 63)), + (u += "==") + break + case 2: + ;(s = (e[e.length - 2] << 8) + e[e.length - 1]), + (u += t(s >> 10)), + (u += t((s >> 4) & 63)), + (u += t((s << 2) & 63)), + (u += "=") + } + return u + } + var s = "undefined" != typeof Uint8Array ? Uint8Array : Array, + a = "+".charCodeAt(0), + o = "/".charCodeAt(0), + u = "0".charCodeAt(0), + l = "a".charCodeAt(0), + c = "A".charCodeAt(0), + p = "-".charCodeAt(0), + f = "_".charCodeAt(0) + ;(e.toByteArray = r), (e.fromByteArray = i) + })(t) + }, + function(e, t) { + ;(t.read = function(e, t, r, n, i) { + var s, + a, + o = 8 * i - n - 1, + u = (1 << o) - 1, + l = u >> 1, + c = -7, + p = r ? i - 1 : 0, + f = r ? -1 : 1, + h = e[t + p] + for ( + p += f, s = h & ((1 << -c) - 1), h >>= -c, c += o; + c > 0; + s = 256 * s + e[t + p], p += f, c -= 8 + ); + for ( + a = s & ((1 << -c) - 1), s >>= -c, c += n; + c > 0; + a = 256 * a + e[t + p], p += f, c -= 8 + ); + if (0 === s) s = 1 - l + else { + if (s === u) return a ? NaN : (h ? -1 : 1) * (1 / 0) + ;(a += Math.pow(2, n)), (s -= l) + } + return (h ? -1 : 1) * a * Math.pow(2, s - n) + }), + (t.write = function(e, t, r, n, i, s) { + var a, + o, + u, + l = 8 * s - i - 1, + c = (1 << l) - 1, + p = c >> 1, + f = 23 === i ? Math.pow(2, -24) - Math.pow(2, -77) : 0, + h = n ? 0 : s - 1, + d = n ? 1 : -1, + m = 0 > t || (0 === t && 0 > 1 / t) ? 1 : 0 + for ( + t = Math.abs(t), + isNaN(t) || t === 1 / 0 + ? ((o = isNaN(t) ? 1 : 0), (a = c)) + : ((a = Math.floor(Math.log(t) / Math.LN2)), + t * (u = Math.pow(2, -a)) < 1 && (a--, (u *= 2)), + (t += a + p >= 1 ? f / u : f * Math.pow(2, 1 - p)), + t * u >= 2 && (a++, (u /= 2)), + a + p >= c + ? ((o = 0), (a = c)) + : a + p >= 1 + ? ((o = (t * u - 1) * Math.pow(2, i)), (a += p)) + : ((o = t * Math.pow(2, p - 1) * Math.pow(2, i)), + (a = 0))); + i >= 8; + e[r + h] = 255 & o, h += d, o /= 256, i -= 8 + ); + for ( + a = (a << i) | o, l += i; + l > 0; + e[r + h] = 255 & a, h += d, a /= 256, l -= 8 + ); + e[r + h - d] |= 128 * m + }) + }, + function(e, t) { + var r = {}.toString + e.exports = + Array.isArray || + function(e) { + return "[object Array]" == r.call(e) + } + }, + function(e, t) { + function r() { + throw new Error("tty.ReadStream is not implemented") + } + function n() { + throw new Error("tty.ReadStream is not implemented") + } + ;(t.isatty = function() { + return !1 + }), + (t.ReadStream = r), + (t.WriteStream = n) + }, + function(e, t) { + "function" == typeof Object.create + ? (e.exports = function(e, t) { + ;(e.super_ = t), + (e.prototype = Object.create(t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + })) + }) + : (e.exports = function(e, t) { + e.super_ = t + var r = function() {} + ;(r.prototype = t.prototype), + (e.prototype = new r()), + (e.prototype.constructor = e) + }) + }, + function(e, t) { + e.exports = function(e) { + return ( + e && + "object" == typeof e && + "function" == typeof e.copy && + "function" == typeof e.fill && + "function" == typeof e.readUInt8 + ) + } + }, + function(e, t, r, n, i, s, a, o, u) { + "use strict" + function l(e) { + var t = v["default"].matchToToken(e) + if ("name" === t.type && E["default"].keyword.isReservedWordES6(t.value)) + return "keyword" + if ("punctuator" === t.type) + switch (t.value) { + case "{": + case "}": + return "curly" + case "(": + case ")": + return "parens" + case "[": + case "]": + return "square" + } + return t.type + } + function c(e) { + return e.replace(v["default"], function() { + for (var e = arguments.length, t = Array(e), r = 0; e > r; r++) + t[r] = arguments[r] + var n = l(t), + i = A[n] + return i + ? t[0] + .split(D) + .map(function(e) { + return i(e) + }) + .join("\n") + : t[0] + }) + } + var p = r(n)["default"] + t.__esModule = !0 + var f = r(i), + h = p(f), + d = r(s), + m = p(d), + y = r(a), + v = p(y), + g = r(o), + E = p(g), + b = r(u), + x = p(b), + A = { + string: x["default"].red, + punctuator: x["default"].bold, + curly: x["default"].green, + parens: x["default"].blue.bold, + square: x["default"].yellow, + keyword: x["default"].cyan, + number: x["default"].magenta, + regex: x["default"].magenta, + comment: x["default"].grey, + invalid: x["default"].inverse + }, + D = /\r\n|[\n\r\u2028\u2029]/ + ;(t["default"] = function(e, t, r) { + var n = arguments.length <= 3 || void 0 === arguments[3] ? {} : arguments[3] + r = Math.max(r, 0) + var i = n.highlightCode && x["default"].supportsColor + i && (e = c(e)) + var s = e.split(D), + a = Math.max(t - 3, 0), + o = Math.min(s.length, t + 3) + t || r || ((a = 0), (o = s.length)) + var u = h["default"](s.slice(a, o), { + start: a + 1, + before: " ", + after: " | ", + transform: function(e) { + e.number === t && + (r && + (e.line += + "\n" + + e.before + + m["default"](" ", e.width) + + e.after + + m["default"](" ", r - 1) + + "^"), + (e.before = e.before.replace(/^./, ">"))) + } + }).join("\n") + return i ? x["default"].reset(u) : u + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o) { + ;(function(t) { + "use strict" + function u(e) { + this.enabled = e && void 0 !== e.enabled ? e.enabled : y + } + function l(e) { + var t = function() { + return c.apply(t, arguments) + } + return (t._styles = e), (t.enabled = this.enabled), (t.__proto__ = b), t + } + function c() { + var e = arguments, + t = e.length, + r = 0 !== t && String(arguments[0]) + if (t > 1) for (var n = 1; t > n; n++) r += " " + e[n] + if (!this.enabled || !r) return r + var i = this._styles, + s = i.length, + a = h.dim.open + for ( + !g || + (-1 === i.indexOf("gray") && -1 === i.indexOf("grey")) || + (h.dim.open = ""); + s--; + + ) { + var o = h[i[s]] + r = o.open + r.replace(o.closeRe, o.open) + o.close + } + return (h.dim.open = a), r + } + function p() { + var e = {} + return ( + Object.keys(E).forEach(function(t) { + e[t] = { + get: function() { + return l.call(this, [t]) + } + } + }), + e + ) + } + var f = r(n), + h = r(i), + d = r(s), + m = r(a), + y = r(o), + v = Object.defineProperties, + g = "win32" === t.platform && !/^xterm/i.test(t.env.TERM) + g && (h.blue.open = "") + var E = (function() { + var e = {} + return ( + Object.keys(h).forEach(function(t) { + ;(h[t].closeRe = new RegExp(f(h[t].close), "g")), + (e[t] = { + get: function() { + return l.call(this, this._styles.concat(t)) + } + }) + }), + e + ) + })(), + b = v(function() {}, E) + v(u.prototype, p()), + (e.exports = new u()), + (e.exports.styles = h), + (e.exports.hasColor = m), + (e.exports.stripColor = d), + (e.exports.supportsColor = y) + }.call(t, r(1))) + }, + function(e, t, r, n) { + ;(function(e) { + "use strict" + function t(e, t) { + return function() { + var r = e.apply(o, arguments) + return "[" + (r + t) + "m" + } + } + function i(e, t) { + return function() { + var r = e.apply(o, arguments) + return "[" + (38 + t) + ";5;" + r + "m" + } + } + function s(e, t) { + return function() { + var r = e.apply(o, arguments) + return "[" + (38 + t) + ";2;" + r[0] + ";" + r[1] + ";" + r[2] + "m" + } + } + function a() { + function e(e, t, r) { + return [e, t, r] + } + var r = { + modifier: { + reset: [0, 0], + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49] + } + } + ;(r.color.grey = r.color.gray), + Object.keys(r).forEach(function(e) { + var t = r[e] + Object.keys(t).forEach(function(e) { + var n = t[e] + r[e] = t[e] = { + open: "[" + n[0] + "m", + close: "[" + n[1] + "m" + } + }), + Object.defineProperty(r, e, { value: t, enumerable: !1 }) + }), + (r.color.close = ""), + (r.bgColor.close = ""), + (r.color.ansi = {}), + (r.color.ansi256 = {}), + (r.color.ansi16m = { rgb: s(e, 0) }), + (r.bgColor.ansi = {}), + (r.bgColor.ansi256 = {}), + (r.bgColor.ansi16m = { rgb: s(e, 10) }) + for (var n in o) + if (o.hasOwnProperty(n) && "object" == typeof o[n]) { + var a = o[n] + "ansi16" in a && + ((r.color.ansi[n] = t(a.ansi16, 0)), + (r.bgColor.ansi[n] = t(a.ansi16, 10))), + "ansi256" in a && + ((r.color.ansi256[n] = i(a.ansi256, 0)), + (r.bgColor.ansi256[n] = i(a.ansi256, 10))), + "rgb" in a && + ((r.color.ansi16m[n] = s(a.rgb, 0)), + (r.bgColor.ansi16m[n] = s(a.rgb, 10))) + } + return r + } + var o = r(n) + Object.defineProperty(e, "exports", { enumerable: !0, get: a }) + }.call(t, r(25)(e))) + }, + function(e, t, r, n) { + var i = r(n), + s = {} + for (var a in i) i.hasOwnProperty(a) && (s[i[a].join()] = a) + var o = (e.exports = { + rgb: {}, + hsl: {}, + hsv: {}, + hwb: {}, + cmyk: {}, + xyz: {}, + lab: {}, + lch: {}, + hex: {}, + keyword: {}, + ansi16: {}, + ansi256: {} + }) + ;(o.rgb.hsl = function(e) { + var t, + r, + n, + i = e[0] / 255, + s = e[1] / 255, + a = e[2] / 255, + o = Math.min(i, s, a), + u = Math.max(i, s, a), + l = u - o + return ( + u === o + ? (t = 0) + : i === u + ? (t = (s - a) / l) + : s === u + ? (t = 2 + (a - i) / l) + : a === u && (t = 4 + (i - s) / l), + (t = Math.min(60 * t, 360)), + 0 > t && (t += 360), + (n = (o + u) / 2), + (r = u === o ? 0 : 0.5 >= n ? l / (u + o) : l / (2 - u - o)), + [t, 100 * r, 100 * n] + ) + }), + (o.rgb.hsv = function(e) { + var t, + r, + n, + i = e[0], + s = e[1], + a = e[2], + o = Math.min(i, s, a), + u = Math.max(i, s, a), + l = u - o + return ( + (r = 0 === u ? 0 : ((l / u) * 1e3) / 10), + u === o + ? (t = 0) + : i === u + ? (t = (s - a) / l) + : s === u + ? (t = 2 + (a - i) / l) + : a === u && (t = 4 + (i - s) / l), + (t = Math.min(60 * t, 360)), + 0 > t && (t += 360), + (n = ((u / 255) * 1e3) / 10), + [t, r, n] + ) + }), + (o.rgb.hwb = function(e) { + var t = e[0], + r = e[1], + n = e[2], + i = o.rgb.hsl(e)[0], + s = (1 / 255) * Math.min(t, Math.min(r, n)) + return ( + (n = 1 - (1 / 255) * Math.max(t, Math.max(r, n))), [i, 100 * s, 100 * n] + ) + }), + (o.rgb.cmyk = function(e) { + var t, + r, + n, + i, + s = e[0] / 255, + a = e[1] / 255, + o = e[2] / 255 + return ( + (i = Math.min(1 - s, 1 - a, 1 - o)), + (t = (1 - s - i) / (1 - i) || 0), + (r = (1 - a - i) / (1 - i) || 0), + (n = (1 - o - i) / (1 - i) || 0), + [100 * t, 100 * r, 100 * n, 100 * i] + ) + }), + (o.rgb.keyword = function(e) { + return s[e.join()] + }), + (o.keyword.rgb = function(e) { + return i[e] + }), + (o.rgb.xyz = function(e) { + var t = e[0] / 255, + r = e[1] / 255, + n = e[2] / 255 + ;(t = t > 0.04045 ? Math.pow((t + 0.055) / 1.055, 2.4) : t / 12.92), + (r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92), + (n = n > 0.04045 ? Math.pow((n + 0.055) / 1.055, 2.4) : n / 12.92) + var i = 0.4124 * t + 0.3576 * r + 0.1805 * n, + s = 0.2126 * t + 0.7152 * r + 0.0722 * n, + a = 0.0193 * t + 0.1192 * r + 0.9505 * n + return [100 * i, 100 * s, 100 * a] + }), + (o.rgb.lab = function(e) { + var t, + r, + n, + i = o.rgb.xyz(e), + s = i[0], + a = i[1], + u = i[2] + return ( + (s /= 95.047), + (a /= 100), + (u /= 108.883), + (s = s > 0.008856 ? Math.pow(s, 1 / 3) : 7.787 * s + 16 / 116), + (a = a > 0.008856 ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116), + (u = u > 0.008856 ? Math.pow(u, 1 / 3) : 7.787 * u + 16 / 116), + (t = 116 * a - 16), + (r = 500 * (s - a)), + (n = 200 * (a - u)), + [t, r, n] + ) + }), + (o.hsl.rgb = function(e) { + var t, + r, + n, + i, + s, + a = e[0] / 360, + o = e[1] / 100, + u = e[2] / 100 + if (0 === o) return (s = 255 * u), [s, s, s] + ;(r = 0.5 > u ? u * (1 + o) : u + o - u * o), + (t = 2 * u - r), + (i = [0, 0, 0]) + for (var l = 0; 3 > l; l++) + (n = a + (1 / 3) * -(l - 1)), + 0 > n && n++, + n > 1 && n--, + (s = + 1 > 6 * n + ? t + 6 * (r - t) * n + : 1 > 2 * n + ? r + : 2 > 3 * n + ? t + (r - t) * (2 / 3 - n) * 6 + : t), + (i[l] = 255 * s) + return i + }), + (o.hsl.hsv = function(e) { + var t, + r, + n = e[0], + i = e[1] / 100, + s = e[2] / 100 + return 0 === s + ? [0, 0, 0] + : ((s *= 2), + (i *= 1 >= s ? s : 2 - s), + (r = (s + i) / 2), + (t = (2 * i) / (s + i)), + [n, 100 * t, 100 * r]) + }), + (o.hsv.rgb = function(e) { + var t = e[0] / 60, + r = e[1] / 100, + n = e[2] / 100, + i = Math.floor(t) % 6, + s = t - Math.floor(t), + a = 255 * n * (1 - r), + o = 255 * n * (1 - r * s), + u = 255 * n * (1 - r * (1 - s)) + switch (((n *= 255), i)) { + case 0: + return [n, u, a] + case 1: + return [o, n, a] + case 2: + return [a, n, u] + case 3: + return [a, o, n] + case 4: + return [u, a, n] + case 5: + return [n, a, o] + } + }), + (o.hsv.hsl = function(e) { + var t, + r, + n = e[0], + i = e[1] / 100, + s = e[2] / 100 + return ( + (r = (2 - i) * s), + (t = i * s), + (t /= 1 >= r ? r : 2 - r), + (t = t || 0), + (r /= 2), + [n, 100 * t, 100 * r] + ) + }), + (o.hwb.rgb = function(e) { + var t, + r, + n, + i, + s = e[0] / 360, + a = e[1] / 100, + o = e[2] / 100, + u = a + o + u > 1 && ((a /= u), (o /= u)), + (t = Math.floor(6 * s)), + (r = 1 - o), + (n = 6 * s - t), + 0 !== (1 & t) && (n = 1 - n), + (i = a + n * (r - a)) + var l, c, p + switch (t) { + default: + case 6: + case 0: + ;(l = r), (c = i), (p = a) + break + case 1: + ;(l = i), (c = r), (p = a) + break + case 2: + ;(l = a), (c = r), (p = i) + break + case 3: + ;(l = a), (c = i), (p = r) + break + case 4: + ;(l = i), (c = a), (p = r) + break + case 5: + ;(l = r), (c = a), (p = i) + } + return [255 * l, 255 * c, 255 * p] + }), + (o.cmyk.rgb = function(e) { + var t, + r, + n, + i = e[0] / 100, + s = e[1] / 100, + a = e[2] / 100, + o = e[3] / 100 + return ( + (t = 1 - Math.min(1, i * (1 - o) + o)), + (r = 1 - Math.min(1, s * (1 - o) + o)), + (n = 1 - Math.min(1, a * (1 - o) + o)), + [255 * t, 255 * r, 255 * n] + ) + }), + (o.xyz.rgb = function(e) { + var t, + r, + n, + i = e[0] / 100, + s = e[1] / 100, + a = e[2] / 100 + return ( + (t = 3.2406 * i + -1.5372 * s + a * -0.4986), + (r = i * -0.9689 + 1.8758 * s + 0.0415 * a), + (n = 0.0557 * i + s * -0.204 + 1.057 * a), + (t = + t > 0.0031308 + ? 1.055 * Math.pow(t, 1 / 2.4) - 0.055 + : (t *= 12.92)), + (r = + r > 0.0031308 + ? 1.055 * Math.pow(r, 1 / 2.4) - 0.055 + : (r *= 12.92)), + (n = + n > 0.0031308 + ? 1.055 * Math.pow(n, 1 / 2.4) - 0.055 + : (n *= 12.92)), + (t = Math.min(Math.max(0, t), 1)), + (r = Math.min(Math.max(0, r), 1)), + (n = Math.min(Math.max(0, n), 1)), + [255 * t, 255 * r, 255 * n] + ) + }), + (o.xyz.lab = function(e) { + var t, + r, + n, + i = e[0], + s = e[1], + a = e[2] + return ( + (i /= 95.047), + (s /= 100), + (a /= 108.883), + (i = i > 0.008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116), + (s = s > 0.008856 ? Math.pow(s, 1 / 3) : 7.787 * s + 16 / 116), + (a = a > 0.008856 ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116), + (t = 116 * s - 16), + (r = 500 * (i - s)), + (n = 200 * (s - a)), + [t, r, n] + ) + }), + (o.lab.xyz = function(e) { + var t, + r, + n, + i, + s = e[0], + a = e[1], + o = e[2] + return ( + 8 >= s + ? ((r = (100 * s) / 903.3), (i = 7.787 * (r / 100) + 16 / 116)) + : ((r = 100 * Math.pow((s + 16) / 116, 3)), + (i = Math.pow(r / 100, 1 / 3))), + (t = + 0.008856 >= t / 95.047 + ? (t = (95.047 * (a / 500 + i - 16 / 116)) / 7.787) + : 95.047 * Math.pow(a / 500 + i, 3)), + (n = + 0.008859 >= n / 108.883 + ? (n = (108.883 * (i - o / 200 - 16 / 116)) / 7.787) + : 108.883 * Math.pow(i - o / 200, 3)), + [t, r, n] + ) + }), + (o.lab.lch = function(e) { + var t, + r, + n, + i = e[0], + s = e[1], + a = e[2] + return ( + (t = Math.atan2(a, s)), + (r = (360 * t) / 2 / Math.PI), + 0 > r && (r += 360), + (n = Math.sqrt(s * s + a * a)), + [i, n, r] + ) + }), + (o.lch.lab = function(e) { + var t, + r, + n, + i = e[0], + s = e[1], + a = e[2] + return ( + (n = (a / 360) * 2 * Math.PI), + (t = s * Math.cos(n)), + (r = s * Math.sin(n)), + [i, t, r] + ) + }), + (o.rgb.ansi16 = function(e) { + var t = e[0], + r = e[1], + n = e[2], + i = 1 in arguments ? arguments[1] : o.rgb.hsv(e)[2] + if (((i = Math.round(i / 50)), 0 === i)) return 30 + var s = + 30 + + ((Math.round(n / 255) << 2) | + (Math.round(r / 255) << 1) | + Math.round(t / 255)) + return 2 === i && (s += 60), s + }), + (o.hsv.ansi16 = function(e) { + return o.rgb.ansi16(o.hsv.rgb(e), e[2]) + }), + (o.rgb.ansi256 = function(e) { + var t = e[0], + r = e[1], + n = e[2] + if (t === r && r === n) + return 8 > t + ? 16 + : t > 248 + ? 231 + : Math.round(((t - 8) / 247) * 24) + 232 + var i = + 16 + + 36 * Math.round((t / 255) * 5) + + 6 * Math.round((r / 255) * 5) + + Math.round((n / 255) * 5) + return i + }), + (o.ansi16.rgb = function(e) { + var t = e % 10 + if (0 === t || 7 === t) + return e > 50 && (t += 3.5), (t = (t / 10.5) * 255), [t, t, t] + var r = 0.5 * (~~(e > 50) + 1), + n = (1 & t) * r * 255, + i = ((t >> 1) & 1) * r * 255, + s = ((t >> 2) & 1) * r * 255 + return [n, i, s] + }), + (o.ansi256.rgb = function(e) { + if (e >= 232) { + var t = 10 * (e - 232) + 8 + return [t, t, t] + } + e -= 16 + var r, + n = (Math.floor(e / 36) / 5) * 255, + i = (Math.floor((r = e % 36) / 6) / 5) * 255, + s = ((r % 6) / 5) * 255 + return [n, i, s] + }), + (o.rgb.hex = function(e) { + var t = + ((255 & Math.round(e[0])) << 16) + + ((255 & Math.round(e[1])) << 8) + + (255 & Math.round(e[2])), + r = t.toString(16).toUpperCase() + return "000000".substring(r.length) + r + }), + (o.hex.rgb = function(e) { + var t = e.toString(16).match(/[a-f0-9]{6}/i) + if (!t) return [0, 0, 0] + var r = parseInt(t[0], 16), + n = (r >> 16) & 255, + i = (r >> 8) & 255, + s = 255 & r + return [n, i, s] + }) + }, + function(e, t, r, n, i) { + function s(e) { + var t = function(t) { + return void 0 === t || null === t + ? t + : (arguments.length > 1 && (t = Array.prototype.slice.call(arguments)), + e(t)) + } + return "conversion" in e && (t.conversion = e.conversion), t + } + function a(e) { + var t = function(t) { + if (void 0 === t || null === t) return t + arguments.length > 1 && (t = Array.prototype.slice.call(arguments)) + var r = e(t) + if ("object" == typeof r) + for (var n = r.length, i = 0; n > i; i++) r[i] = Math.round(r[i]) + return r + } + return "conversion" in e && (t.conversion = e.conversion), t + } + var o = r(n), + u = r(i), + l = {}, + c = Object.keys(o) + c.forEach(function(e) { + l[e] = {} + var t = u(e), + r = Object.keys(t) + r.forEach(function(r) { + var n = t[r] + ;(l[e][r] = a(n)), (l[e][r].raw = s(n)) + }) + }), + (e.exports = l) + }, + function(e, t, r, n) { + function i() { + for (var e = {}, t = l.length, r = 0; t > r; r++) + e[l[r]] = { distance: -1, parent: null } + return e + } + function s(e) { + var t = i(), + r = [e] + for (t[e].distance = 0; r.length; ) + for ( + var n = r.pop(), s = Object.keys(u[n]), a = s.length, o = 0; + a > o; + o++ + ) { + var l = s[o], + c = t[l] + ;-1 === c.distance && + ((c.distance = t[n].distance + 1), (c.parent = n), r.unshift(l)) + } + return t + } + function a(e, t) { + return function(r) { + return t(e(r)) + } + } + function o(e, t) { + for ( + var r = [t[e].parent, e], n = u[t[e].parent][e], i = t[e].parent; + t[i].parent; + + ) + r.unshift(t[i].parent), (n = a(u[t[i].parent][i], n)), (i = t[i].parent) + return (n.conversion = r), n + } + var u = r(n), + l = Object.keys(u) + e.exports = function(e) { + for ( + var t = s(e), r = {}, n = Object.keys(t), i = n.length, a = 0; + i > a; + a++ + ) { + var u = n[a], + l = t[u] + null !== l.parent && (r[u] = o(u, t)) + } + return r + } + }, + function(e, t, r, n) { + "use strict" + var i = r(n), + s = new RegExp(i().source) + e.exports = s.test.bind(s) + }, + function(e, t, r, n) { + "use strict" + var i = r(n)() + e.exports = function(e) { + return "string" == typeof e ? e.replace(i, "") : e + } + }, + function(e, t, r, n) { + !(function() { + "use strict" + function t(e) { + switch (e) { + case "implements": + case "interface": + case "package": + case "private": + case "protected": + case "public": + case "static": + case "let": + return !0 + default: + return !1 + } + } + function i(e, t) { + return t || "yield" !== e ? s(e, t) : !1 + } + function s(e, r) { + if (r && t(e)) return !0 + switch (e.length) { + case 2: + return "if" === e || "in" === e || "do" === e + case 3: + return "var" === e || "for" === e || "new" === e || "try" === e + case 4: + return ( + "this" === e || + "else" === e || + "case" === e || + "void" === e || + "with" === e || + "enum" === e + ) + case 5: + return ( + "while" === e || + "break" === e || + "catch" === e || + "throw" === e || + "const" === e || + "yield" === e || + "class" === e || + "super" === e + ) + case 6: + return ( + "return" === e || + "typeof" === e || + "delete" === e || + "switch" === e || + "export" === e || + "import" === e + ) + case 7: + return "default" === e || "finally" === e || "extends" === e + case 8: + return "function" === e || "continue" === e || "debugger" === e + case 10: + return "instanceof" === e + default: + return !1 + } + } + function a(e, t) { + return "null" === e || "true" === e || "false" === e || i(e, t) + } + function o(e, t) { + return "null" === e || "true" === e || "false" === e || s(e, t) + } + function u(e) { + return "eval" === e || "arguments" === e + } + function l(e) { + var t, r, n + if (0 === e.length) return !1 + if (((n = e.charCodeAt(0)), !d.isIdentifierStartES5(n))) return !1 + for (t = 1, r = e.length; r > t; ++t) + if (((n = e.charCodeAt(t)), !d.isIdentifierPartES5(n))) return !1 + return !0 + } + function c(e, t) { + return 1024 * (e - 55296) + (t - 56320) + 65536 + } + function p(e) { + var t, r, n, i, s + if (0 === e.length) return !1 + for (s = d.isIdentifierStartES6, t = 0, r = e.length; r > t; ++t) { + if (((n = e.charCodeAt(t)), n >= 55296 && 56319 >= n)) { + if ((++t, t >= r)) return !1 + if (((i = e.charCodeAt(t)), !(i >= 56320 && 57343 >= i))) return !1 + n = c(n, i) + } + if (!s(n)) return !1 + s = d.isIdentifierPartES6 + } + return !0 + } + function f(e, t) { + return l(e) && !a(e, t) + } + function h(e, t) { + return p(e) && !o(e, t) + } + var d = r(n) + e.exports = { + isKeywordES5: i, + isKeywordES6: s, + isReservedWordES5: a, + isReservedWordES6: o, + isRestrictedWord: u, + isIdentifierNameES5: l, + isIdentifierNameES6: p, + isIdentifierES5: f, + isIdentifierES6: h + } + })() + }, + function(e, t, r, n, i, s) { + !(function() { + "use strict" + ;(t.ast = r(n)), (t.code = r(i)), (t.keyword = r(s)) + })() + }, + function(e, t, r, n) { + function i(e, t, r) { + return t in e ? e[t] : r + } + function s(e, t) { + var r = i.bind(null, t || {}), + n = r("transform", Function.prototype), + s = r("padding", " "), + o = r("before", " "), + u = r("after", " | "), + l = r("start", 1), + c = Array.isArray(e), + p = c ? e : e.split("\n"), + f = l + p.length - 1, + h = String(f).length, + d = p.map(function(e, t) { + var r = l + t, + i = { before: o, number: r, width: h, after: u, line: e } + return n(i), i.before + a(i.number, h, s) + i.after + i.line + }) + return c ? d : d.join("\n") + } + var a = r(n) + e.exports = s + }, + function(e, t, r, n) { + "use strict" + var i = r(n) + e.exports = function(e, t) { + if ("string" != typeof e) + throw new TypeError("Expected a string as the first argument") + if (0 > t || !i(t)) throw new TypeError("Expected a finite positive number") + var r = "" + do 1 & t && (r += e), (e += e) + while ((t >>= 1)) + return r + } + }, + function(e, t, r, n) { + "use strict" + var i = r(n) + e.exports = + Number.isFinite || + function(e) { + return !("number" != typeof e || i(e) || e === 1 / 0 || e === -(1 / 0)) + } + }, + function(e, t, r, n) { + "use strict" + function i(e) { + for (var t = arguments.length, r = Array(t > 1 ? t - 1 : 0), n = 1; t > n; n++) + r[n - 1] = arguments[n] + var i = l[e] + if (!i) throw new ReferenceError("Unknown message " + JSON.stringify(e)) + return ( + (r = s(r)), + i.replace(/\$(\d+)/g, function(e, t) { + return r[t - 1] + }) + ) + } + function s(e) { + return e.map(function(e) { + if (null != e && e.inspect) return e.inspect() + try { + return JSON.stringify(e) || e + "" + } catch (t) { + return u.inspect(e) + } + }) + } + var a = r(n)["default"] + ;(t.__esModule = !0), (t.get = i), (t.parseArgs = s) + var o = r(22), + u = a(o), + l = { + tailCallReassignmentDeopt: + "Function reference has been reassigned, so it will probably be dereferenced, therefore we can't optimise this with confidence", + classesIllegalBareSuper: "Illegal use of bare super", + classesIllegalSuperCall: + "Direct super call is illegal in non-constructor, use super.$1() instead", + scopeDuplicateDeclaration: "Duplicate declaration $1", + settersNoRest: "Setters aren't allowed to have a rest", + noAssignmentsInForHead: "No assignments allowed in for-in/of head", + expectedMemberExpressionOrIdentifier: + "Expected type MemberExpression or Identifier", + invalidParentForThisNode: + "We don't know how to handle this node within the current parent - please open an issue", + readOnly: "$1 is read-only", + unknownForHead: "Unknown node type $1 in ForStatement", + didYouMean: "Did you mean $1?", + codeGeneratorDeopt: + "Note: The code generator has deoptimised the styling of $1 as it exceeds the max of $2.", + missingTemplatesDirectory: + "no templates directory - this is most likely the result of a broken `npm publish`. Please report to https://github.com/babel/babel/issues", + unsupportedOutputType: "Unsupported output type $1", + illegalMethodName: "Illegal method name $1", + lostTrackNodePath: + "We lost track of this node's position, likely because the AST was directly manipulated", + modulesIllegalExportName: "Illegal export $1", + modulesDuplicateDeclarations: + "Duplicate module declarations with the same source but in different scopes", + undeclaredVariable: "Reference to undeclared variable $1", + undeclaredVariableType: + "Referencing a type alias outside of a type annotation", + undeclaredVariableSuggestion: + "Reference to undeclared variable $1 - did you mean $2?", + traverseNeedsParent: + "You must pass a scope and parentPath unless traversing a Program/File. Instead of that you tried to traverse a $1 node without passing scope and parentPath.", + traverseVerifyRootFunction: + "You passed `traverse()` a function when it expected a visitor object, are you sure you didn't mean `{ enter: Function }`?", + traverseVerifyVisitorProperty: + "You passed `traverse()` a visitor object with the property $1 that has the invalid property $2", + traverseVerifyNodeType: + "You gave us a visitor for the node type $1 but it's not a valid type", + pluginNotObject: + "Plugin $2 specified in $1 was expected to return an object when invoked but returned $3", + pluginNotFunction: + "Plugin $2 specified in $1 was expected to return a function but returned $3", + pluginUnknown: + "Unknown plugin $1 specified in $2 at $3, attempted to resolve relative to $4", + pluginInvalidProperty: + "Plugin $2 specified in $1 provided an invalid property of $3" + } + t.MESSAGES = l + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + e.exports = { default: r(n), __esModule: !0 } + }, + function(e, t, r, n) { + "use strict" + var i = r(n)["default"] + ;(t["default"] = (function() { + function e(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r] + ;(n.enumerable = n.enumerable || !1), + (n.configurable = !0), + "value" in n && (n.writable = !0), + i(e, n.key, n) + } + } + return function(t, r, n) { + return r && e(t.prototype, r), n && e(t, n), t + } + })()), + (t.__esModule = !0) + }, + function(e, t, r, n, i, s) { + "use strict" + var a = r(n)["default"], + o = r(i)["default"], + u = r(s)["default"] + ;(t["default"] = function(e, t) { + for (var r = a(t), n = 0; n < r.length; n++) { + var i = r[n], + s = o(t, i) + s && s.configurable && void 0 === e[i] && u(e, i, s) + } + return e + }), + (t.__esModule = !0) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i)["default"] + ;(t["default"] = function(e, t) { + if ("function" != typeof t && null !== t) + throw new TypeError( + "Super expression must either be null or a function, not " + typeof t + ) + ;(e.prototype = s(t && t.prototype, { + constructor: { value: e, enumerable: !1, writable: !0, configurable: !0 } + })), + t && (a ? a(e, t) : (e.__proto__ = t)) + }), + (t.__esModule = !0) + }, + function(e, t, r, n, i, s) { + r(n), r(i), (e.exports = r(s)) + }, + function(e, t, r, n) { + r(n), (e.exports = 9007199254740991) + }, + function(e, t, r, n, i) { + r(n), (e.exports = r(i).Object.assign) + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e, t) { + return i.create(e, t) + } + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e, t, r) { + return i.setDesc(e, t, r) + } + }, + function(e, t, r, n, i) { + var s = r(n) + r(i), + (e.exports = function(e, t) { + return s.getDesc(e, t) + }) + }, + function(e, t, r, n, i) { + var s = r(n) + r(i), + (e.exports = function(e) { + return s.getNames(e) + }) + }, + function(e, t, r, n, i) { + r(n), (e.exports = r(i).Object.getOwnPropertySymbols) + }, + function(e, t, r, n, i) { + r(n), (e.exports = r(i).Object.keys) + }, + function(e, t, r, n, i) { + r(n), (e.exports = r(i).Object.setPrototypeOf) + }, + function(e, t, r, n, i) { + r(n), (e.exports = r(i).Symbol["for"]) + }, + function(e, t, r, n, i, s) { + r(n), r(i), (e.exports = r(s).Symbol) + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e) { + if (!i(e)) throw TypeError(e + " is not an object!") + return e + } + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i)("toStringTag"), + o = + "Arguments" == + s( + (function() { + return arguments + })() + ) + e.exports = function(e) { + var t, r, n + return void 0 === e + ? "Undefined" + : null === e + ? "Null" + : "string" == typeof (r = (t = Object(e))[a]) + ? r + : o + ? s(t) + : "Object" == (n = s(t)) && "function" == typeof t.callee + ? "Arguments" + : n + } + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e, t, r) { + if ((i(e), void 0 === t)) return e + switch (r) { + case 1: + return function(r) { + return e.call(t, r) + } + case 2: + return function(r, n) { + return e.call(t, r, n) + } + case 3: + return function(r, n, i) { + return e.call(t, r, n, i) + } + } + return function() { + return e.apply(t, arguments) + } + } + }, + function(e, t, r, n) { + e.exports = !r(n)(function() { + return ( + 7 != + Object.defineProperty({}, "a", { + get: function() { + return 7 + } + }).a + ) + }) + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e) { + var t = i.getKeys(e), + r = i.getSymbols + if (r) + for (var n, s = r(e), a = i.isEnum, o = 0; s.length > o; ) + a.call(e, (n = s[o++])) && t.push(n) + return t + } + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s), + l = "prototype", + c = function(e, t, r) { + var n, + i, + s, + p = e & c.F, + f = e & c.G, + h = e & c.S, + d = e & c.P, + m = e & c.B, + y = e & c.W, + v = f ? o : o[t] || (o[t] = {}), + g = f ? a : h ? a[t] : (a[t] || {})[l] + f && (r = t) + for (n in r) + (i = !p && g && n in g), + (i && n in v) || + ((s = i ? g[n] : r[n]), + (v[n] = + f && "function" != typeof g[n] + ? r[n] + : m && i + ? u(s, a) + : y && g[n] == s + ? (function(e) { + var t = function(t) { + return this instanceof e ? new e(t) : e(t) + } + return (t[l] = e[l]), t + })(s) + : d && "function" == typeof s + ? u(Function.call, s) + : s), + d && ((v[l] || (v[l] = {}))[n] = s)) + } + ;(c.F = 1), (c.G = 2), (c.S = 4), (c.P = 8), (c.B = 16), (c.W = 32), (e.exports = c) + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i).getNames, + o = {}.toString, + u = + "object" == typeof window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) + : [], + l = function(e) { + try { + return a(e) + } catch (t) { + return u.slice() + } + } + e.exports.get = function(e) { + return u && "[object Window]" == o.call(e) ? l(e) : a(s(e)) + } + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i) + e.exports = r(s) + ? function(e, t, r) { + return a.setDesc(e, t, o(1, r)) + } + : function(e, t, r) { + return (e[t] = r), e + } + }, + function(e, t, r, n) { + var i = r(n) + e.exports = Object("z").propertyIsEnumerable(0) + ? Object + : function(e) { + return "String" == i(e) ? e.split("") : Object(e) + } + }, + function(e, t, r, n) { + var i = r(n) + e.exports = + Array.isArray || + function(e) { + return "Array" == i(e) + } + }, + function(e, t, r, n, i, s, a, o) { + "use strict" + var u = r(n), + l = r(i), + c = r(s), + p = {} + r(a)(p, r(o)("iterator"), function() { + return this + }), + (e.exports = function(e, t, r) { + ;(e.prototype = u.create(p, { next: l(1, r) })), c(e, t + " Iterator") + }) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f) { + "use strict" + var h = r(n), + d = r(i), + m = r(s), + y = r(a), + v = r(o), + g = r(u), + E = r(l), + b = r(c), + x = r(p).getProto, + A = r(f)("iterator"), + D = !([].keys && "next" in [].keys()), + C = "@@iterator", + S = "keys", + F = "values", + w = function() { + return this + } + e.exports = function(e, t, r, n, i, s, a) { + E(r, t, n) + var o, + u, + l = function(e) { + if (!D && e in _) return _[e] + switch (e) { + case S: + return function() { + return new r(this, e) + } + case F: + return function() { + return new r(this, e) + } + } + return function() { + return new r(this, e) + } + }, + c = t + " Iterator", + p = i == F, + f = !1, + _ = e.prototype, + T = _[A] || _[C] || (i && _[i]), + P = T || l(i) + if (T) { + var B = x(P.call(new e())) + b(B, c, !0), + !h && v(_, C) && y(B, A, w), + p && + T.name !== F && + ((f = !0), + (P = function() { + return T.call(this) + })) + } + if (((h && !a) || (!D && !f && _[A]) || y(_, A, P), (g[t] = P), (g[c] = w), i)) + if ( + ((o = { + values: p ? P : l(F), + keys: s ? P : l(S), + entries: p ? l("entries") : P + }), + a) + ) + for (u in o) u in _ || m(_, u, o[u]) + else d(d.P + d.F * (D || f), t, o) + return o + } + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i) + e.exports = function(e, t) { + for (var r, n = a(e), i = s.getKeys(n), o = i.length, u = 0; o > u; ) + if (n[(r = i[u++])] === t) return r + } + }, + function(e, t, r, n, i, s, a) { + var o = r(n), + u = r(i), + l = r(s) + e.exports = r(a)(function() { + var e = Object.assign, + t = {}, + r = {}, + n = Symbol(), + i = "abcdefghijklmnopqrst" + return ( + (t[n] = 7), + i.split("").forEach(function(e) { + r[e] = e + }), + 7 != e({}, t)[n] || Object.keys(e({}, r)).join("") != i + ) + }) + ? function(e, t) { + for ( + var r = u(e), + n = arguments, + i = n.length, + s = 1, + a = o.getKeys, + c = o.getSymbols, + p = o.isEnum; + i > s; + + ) + for ( + var f, + h = l(n[s++]), + d = c ? a(h).concat(c(h)) : a(h), + m = d.length, + y = 0; + m > y; + + ) + p.call(h, (f = d[y++])) && (r[f] = h[f]) + return r + } + : Object.assign + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s) + e.exports = function(e, t) { + var r = (o.Object || {})[e] || Object[e], + n = {} + ;(n[e] = t(r)), + a( + a.S + + a.F * + u(function() { + r(1) + }), + "Object", + n + ) + } + }, + function(e, t, r, n) { + e.exports = r(n) + }, + function(e, t, r, n, i, s, a) { + var o = r(n).getDesc, + u = r(i), + l = r(s), + c = function(e, t) { + if ((l(e), !u(t) && null !== t)) + throw TypeError(t + ": can't set as prototype!") + } + e.exports = { + set: + Object.setPrototypeOf || + ("__proto__" in {} + ? (function(e, t, n) { + try { + ;(n = r(a)( + Function.call, + o(Object.prototype, "__proto__").set, + 2 + )), + n(e, []), + (t = !(e instanceof Array)) + } catch (i) { + t = !0 + } + return function(e, r) { + return c(e, r), t ? (e.__proto__ = r) : n(e, r), e + } + })({}, !1) + : void 0), + check: c + } + }, + function(e, t, r, n, i, s) { + var a = r(n).setDesc, + o = r(i), + u = r(s)("toStringTag") + e.exports = function(e, t, r) { + e && !o((e = r ? e : e.prototype), u) && a(e, u, { configurable: !0, value: t }) + } + }, + function(e, t, r, n) { + var i = r(n), + s = "__core-js_shared__", + a = i[s] || (i[s] = {}) + e.exports = function(e) { + return a[e] || (a[e] = {}) + } + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i) + e.exports = function(e) { + return function(t, r) { + var n, + i, + o = String(a(t)), + u = s(r), + l = o.length + return 0 > u || u >= l + ? e + ? "" + : void 0 + : ((n = o.charCodeAt(u)), + 55296 > n || + n > 56319 || + u + 1 === l || + (i = o.charCodeAt(u + 1)) < 56320 || + i > 57343 + ? e + ? o.charAt(u) + : n + : e + ? o.slice(u, u + 2) + : ((n - 55296) << 10) + (i - 56320) + 65536) + } + } + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i) + e.exports = function(e) { + return s(a(e)) + } + }, + function(e, t, r, n) { + var i = r(n) + e.exports = function(e) { + return Object(i(e)) + } + }, + function(e, t, r, n, i, s) { + var a = r(n)("wks"), + o = r(i), + u = r(s).Symbol + e.exports = function(e) { + return a[e] || (a[e] = (u && u[e]) || (u || o)("Symbol." + e)) + } + }, + function(e, t, r, n, i, s, a) { + var o = r(n), + u = r(i)("iterator"), + l = r(s) + e.exports = r(a).getIteratorMethod = function(e) { + return void 0 != e ? e[u] || e["@@iterator"] || l[o(e)] : void 0 + } + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i) + e.exports = r(s).getIterator = function(e) { + var t = o(e) + if ("function" != typeof t) throw TypeError(e + " is not iterable!") + return a(t.call(e)) + } + }, + function(e, t, r, n, i, s, a, o) { + "use strict" + var u = r(n), + l = r(i), + c = r(s), + p = r(a) + ;(e.exports = r(o)( + Array, + "Array", + function(e, t) { + ;(this._t = p(e)), (this._i = 0), (this._k = t) + }, + function() { + var e = this._t, + t = this._k, + r = this._i++ + return !e || r >= e.length + ? ((this._t = void 0), l(1)) + : "keys" == t + ? l(0, r) + : "values" == t + ? l(0, e[r]) + : l(0, [r, e[r]]) + }, + "values" + )), + (c.Arguments = c.Array), + u("keys"), + u("values"), + u("entries") + }, + function(e, t, r, n) { + var i = r(n) + i(i.S, "Number", { MAX_SAFE_INTEGER: 9007199254740991 }) + }, + function(e, t, r, n, i) { + var s = r(n) + s(s.S + s.F, "Object", { assign: r(i) }) + }, + function(e, t, r, n, i) { + var s = r(n) + r(i)("getOwnPropertyDescriptor", function(e) { + return function(t, r) { + return e(s(t), r) + } + }) + }, + function(e, t, r, n, i) { + r(n)("getOwnPropertyNames", function() { + return r(i).get + }) + }, + function(e, t, r, n, i) { + var s = r(n) + r(i)("keys", function(e) { + return function(t) { + return e(s(t)) + } + }) + }, + function(e, t, r, n, i) { + var s = r(n) + s(s.S, "Object", { setPrototypeOf: r(i).set }) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)(!0) + r(i)( + String, + "String", + function(e) { + ;(this._t = String(e)), (this._i = 0) + }, + function() { + var e, + t = this._t, + r = this._i + return r >= t.length + ? { value: void 0, done: !0 } + : ((e = s(t, r)), (this._i += e.length), { value: e, done: !1 }) + } + ) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f, h, d, m, y, v, g, E, b, x) { + "use strict" + var A = r(n), + D = r(i), + C = r(s), + S = r(a), + F = r(o), + w = r(u), + _ = r(l), + T = r(c), + P = r(p), + B = r(f), + k = r(h), + I = r(d), + O = r(m), + M = r(y), + R = r(v), + L = r(g), + N = r(E), + j = r(b), + U = A.getDesc, + V = A.setDesc, + G = A.create, + W = O.get, + q = D.Symbol, + H = D.JSON, + Y = H && H.stringify, + J = !1, + K = k("_hidden"), + X = A.isEnum, + z = T("symbol-registry"), + $ = T("symbols"), + Q = "function" == typeof q, + Z = Object.prototype, + ee = + S && + _(function() { + return ( + 7 != + G( + V({}, "a", { + get: function() { + return V(this, "a", { value: 7 }).a + } + }) + ).a + ) + }) + ? function(e, t, r) { + var n = U(Z, t) + n && delete Z[t], V(e, t, r), n && e !== Z && V(Z, t, n) + } + : V, + te = function(e) { + var t = ($[e] = G(q.prototype)) + return ( + (t._k = e), + S && + J && + ee(Z, e, { + configurable: !0, + set: function(t) { + C(this, K) && C(this[K], e) && (this[K][e] = !1), + ee(this, e, j(1, t)) + } + }), + t + ) + }, + re = function(e) { + return "symbol" == typeof e + }, + ne = function(e, t, r) { + return r && C($, t) + ? (r.enumerable + ? (C(e, K) && e[K][t] && (e[K][t] = !1), + (r = G(r, { enumerable: j(0, !1) }))) + : (C(e, K) || V(e, K, j(1, {})), (e[K][t] = !0)), + ee(e, t, r)) + : V(e, t, r) + }, + ie = function(e, t) { + L(e) + for (var r, n = M((t = N(t))), i = 0, s = n.length; s > i; ) + ne(e, (r = n[i++]), t[r]) + return e + }, + se = function(e, t) { + return void 0 === t ? G(e) : ie(G(e), t) + }, + ae = function(e) { + var t = X.call(this, e) + return t || !C(this, e) || !C($, e) || (C(this, K) && this[K][e]) ? t : !0 + }, + oe = function(e, t) { + var r = U((e = N(e)), t) + return !r || !C($, t) || (C(e, K) && e[K][t]) || (r.enumerable = !0), r + }, + ue = function(e) { + for (var t, r = W(N(e)), n = [], i = 0; r.length > i; ) + C($, (t = r[i++])) || t == K || n.push(t) + return n + }, + le = function(e) { + for (var t, r = W(N(e)), n = [], i = 0; r.length > i; ) + C($, (t = r[i++])) && n.push($[t]) + return n + }, + ce = function(e) { + if (void 0 !== e && !re(e)) { + for (var t, r, n = [e], i = 1, s = arguments; s.length > i; ) + n.push(s[i++]) + return ( + (t = n[1]), + "function" == typeof t && (r = t), + (!r && R(t)) || + (t = function(e, t) { + return r && (t = r.call(this, e, t)), re(t) ? void 0 : t + }), + (n[1] = t), + Y.apply(H, n) + ) + } + }, + pe = _(function() { + var e = q() + return "[null]" != Y([e]) || "{}" != Y({ a: e }) || "{}" != Y(Object(e)) + }) + Q || + ((q = function() { + if (re(this)) throw TypeError("Symbol is not a constructor") + return te(B(arguments.length > 0 ? arguments[0] : void 0)) + }), + w(q.prototype, "toString", function() { + return this._k + }), + (re = function(e) { + return e instanceof q + }), + (A.create = se), + (A.isEnum = ae), + (A.getDesc = oe), + (A.setDesc = ne), + (A.setDescs = ie), + (A.getNames = O.get = ue), + (A.getSymbols = le), + S && !r(x) && w(Z, "propertyIsEnumerable", ae, !0)) + var fe = { + for: function(e) { + return C(z, (e += "")) ? z[e] : (z[e] = q(e)) + }, + keyFor: function(e) { + return I(z, e) + }, + useSetter: function() { + J = !0 + }, + useSimple: function() { + J = !1 + } + } + A.each.call( + "hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split( + "," + ), + function(e) { + var t = k(e) + fe[e] = Q ? t : te(t) + } + ), + (J = !0), + F(F.G + F.W, { Symbol: q }), + F(F.S, "Symbol", fe), + F(F.S + F.F * !Q, "Object", { + create: se, + defineProperty: ne, + defineProperties: ie, + getOwnPropertyDescriptor: oe, + getOwnPropertyNames: ue, + getOwnPropertySymbols: le + }), + H && F(F.S + F.F * (!Q || pe), "JSON", { stringify: ce }), + P(q, "Symbol"), + P(Math, "Math", !0), + P(D.JSON, "JSON", !0) + }, + function(e, t, r, n, i) { + r(n) + var s = r(i) + s.NodeList = s.HTMLCollection = s.Array + }, + function(e, t, r, n, i, s, a, o, u, l, c, p) { + "use strict" + function f(e, t) { + e = v["default"](e) + var r = e, + n = r.program + return ( + t.length && D["default"](e, P, null, t), + n.body.length > 1 ? n.body : n.body[0] + ) + } + var h = r(n)["default"], + d = r(i)["default"], + m = r(s)["default"] + t.__esModule = !0 + var y = r(a), + v = d(y), + g = r(o), + E = d(g), + b = r(u), + x = d(b), + A = r(l), + D = d(A), + C = r(c), + S = m(C), + F = r(p), + w = m(F), + _ = "_fromTemplate", + T = h() + t["default"] = function(e, t) { + var r = void 0 + try { + throw new Error() + } catch (n) { + r = n.stack + .split("\n") + .slice(1) + .join("\n") + } + var i = function() { + var n = void 0 + try { + ;(n = S.parse( + e, + E["default"]( + { allowReturnOutsideFunction: !0, allowSuperOutsideMethod: !0 }, + t + ) + )), + (n = D["default"].removeProperties(n)), + D["default"].cheap(n, function(e) { + e[_] = !0 + }) + } catch (s) { + throw ((s.stack = s.stack + "from\n" + r), s) + } + return ( + (i = function() { + return n + }), + n + ) + } + return function() { + for (var e = arguments.length, t = Array(e), r = 0; e > r; r++) + t[r] = arguments[r] + return f(i(), t) + } + } + var P = { + noScope: !0, + enter: function(e, t) { + var r = e.node + if (r[T]) return e.skip() + w.isExpressionStatement(r) && (r = r.expression) + var n = void 0 + if (w.isIdentifier(r) && r[_]) + if (x["default"](t[0], r.name)) n = t[0][r.name] + else if ("$" === r.name[0]) { + var i = +r.name.slice(1) + t[i] && (n = t[i]) + } + null === n && e.remove(), n && ((n[T] = !0), e.replaceInline(n)) + }, + exit: function(e) { + var t = e.node + t.loc || D["default"].clearNode(t) + } + } + e.exports = t["default"] + }, + function(e, t, r, n, i, s, a, o, u) { + "use strict" + var l = r(n)["default"], + c = r(i)["default"], + p = r(s)["default"], + f = r(a)["default"] + t.__esModule = !0 + var h = r(o), + d = p(h), + m = r(u), + y = f(m), + v = !1, + g = (function() { + function e(t, r, n, i) { + l(this, e), + (this.queue = null), + (this.parentPath = i), + (this.scope = t), + (this.state = n), + (this.opts = r) + } + return ( + (e.prototype.shouldVisit = function(e) { + var t = this.opts + if (t.enter || t.exit) return !0 + if (t[e.type]) return !0 + var r = y.VISITOR_KEYS[e.type] + if (!r || !r.length) return !1 + for (var n = r, i = Array.isArray(n), s = 0, n = i ? n : c(n); ; ) { + var a + if (i) { + if (s >= n.length) break + a = n[s++] + } else { + if (((s = n.next()), s.done)) break + a = s.value + } + var o = a + if (e[o]) return !0 + } + return !1 + }), + (e.prototype.create = function(e, t, r, n) { + return d["default"].get({ + parentPath: this.parentPath, + parent: e, + container: t, + key: r, + listKey: n + }) + }), + (e.prototype.maybeQueue = function(e, t) { + if (this.trap) throw new Error("Infinite cycle detected") + this.queue && (t ? this.queue.push(e) : this.priorityQueue.push(e)) + }), + (e.prototype.visitMultiple = function(e, t, r) { + if (0 === e.length) return !1 + for (var n = [], i = 0; i < e.length; i++) { + var s = e[i] + s && this.shouldVisit(s) && n.push(this.create(t, e, i, r)) + } + return this.visitQueue(n) + }), + (e.prototype.visitSingle = function(e, t) { + return this.shouldVisit(e[t]) + ? this.visitQueue([this.create(e, e, t)]) + : !1 + }), + (e.prototype.visitQueue = function(e) { + ;(this.queue = e), (this.priorityQueue = []) + for (var t = [], r = !1, n = 0; n < e.length; n++) { + var i = e[n] + if ( + (i.resync(), + i.pushContext(this), + null !== i.key && + (v && e.length >= 1e3 && (this.trap = !0), + !(t.indexOf(i.node) >= 0))) + ) { + if ((t.push(i.node), i.visit())) { + r = !0 + break + } + if ( + this.priorityQueue.length && + ((r = this.visitQueue(this.priorityQueue)), + (this.priorityQueue = []), + (this.queue = e), + r) + ) + break + } + } + for (var s = 0; s < e.length; s++) { + var i = e[s] + i.popContext() + } + return (this.queue = null), r + }), + (e.prototype.visit = function(e, t) { + var r = e[t] + return r + ? Array.isArray(r) + ? this.visitMultiple(r, e, t) + : this.visitSingle(e, t) + : !1 + }), + e + ) + })() + ;(t["default"] = g), (e.exports = t["default"]) + }, + function(e, t, r, n) { + "use strict" + var i = r(n)["default"] + t.__esModule = !0 + var s = function a(e, t) { + i(this, a), (this.file = e), (this.options = t) + } + ;(t["default"] = s), (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f, h, d, m, y, v, g, E) { + "use strict" + function b(e, t, r, n, i) { + if (e) { + if ( + (t || (t = {}), + !t.noScope && !r && "Program" !== e.type && "File" !== e.type) + ) + throw new Error(k.get("traverseNeedsParent", e.type)) + P.explode(t), b.node(e, t, r, n, i) + } + } + function x(e, t) { + e.node.type === t.type && ((t.has = !0), e.skip()) + } + var A = r(n)["default"], + D = (r(i)["default"], r(s)["default"]), + C = r(a)["default"], + S = r(o)["default"], + F = r(u)["default"] + ;(t.__esModule = !0), (t["default"] = b) + var w = r(l), + _ = C(w), + T = r(c), + P = S(T), + B = r(p), + k = S(B), + I = r(f), + O = C(I), + M = r(h), + R = S(M), + L = r(d) + t.NodePath = F(L) + var N = r(m) + t.Scope = F(N) + var j = r(y) + ;(t.Hub = F(j)), + (t.visitors = P), + (b.visitors = P), + (b.verify = P.verify), + (b.explode = P.explode), + (b.NodePath = r(v)), + (b.Scope = r(g)), + (b.Hub = r(E)), + (b.cheap = function(e, t) { + if (e) { + var r = R.VISITOR_KEYS[e.type] + if (r) { + t(e) + for (var n = r, i = Array.isArray(n), s = 0, n = i ? n : A(n); ; ) { + var a + if (i) { + if (s >= n.length) break + a = n[s++] + } else { + if (((s = n.next()), s.done)) break + a = s.value + } + var o = a, + u = e[o] + if (Array.isArray(u)) + for ( + var l = u, + c = Array.isArray(l), + p = 0, + l = c ? l : A(l); + ; + + ) { + var f + if (c) { + if (p >= l.length) break + f = l[p++] + } else { + if (((p = l.next()), p.done)) break + f = p.value + } + var h = f + b.cheap(h, t) + } + else b.cheap(u, t) + } + } + } + }), + (b.node = function(e, t, r, n, i, s) { + var a = R.VISITOR_KEYS[e.type] + if (a) + for (var o = new _["default"](r, t, n, i), u = 0; u < a.length; u++) { + var l = a[u] + if ((!s || !s[l]) && o.visit(e, l)) return + } + }) + var U = R.COMMENT_KEYS.concat([ + "tokens", + "comments", + "start", + "end", + "loc", + "raw", + "rawValue" + ]) + ;(b.clearNode = function(e) { + for (var t = 0; t < U.length; t++) { + var r = U[t] + null != e[r] && (e[r] = void 0) + } + for (var r in e) "_" === r[0] && null != e[r] && (e[r] = void 0) + for (var n = D(e), i = 0; i < n.length; i++) { + var s = n[i] + e[s] = null + } + }), + (b.removeProperties = function(e) { + return b.cheap(e, b.clearNode), e + }), + (b.hasType = function(e, t, r, n) { + if (O["default"](n, e.type)) return !1 + if (e.type === r) return !0 + var i = { has: !1, type: r } + return b(e, { blacklist: n, enter: x }, t, i), i.has + }) + }, + function(e, t, r, n, i, s, a) { + "use strict" + function o(e) { + for (var t = this; (t = t.parentPath); ) if (e(t)) return t + return null + } + function u(e) { + var t = this + do if (e(t)) return t + while ((t = t.parentPath)) + return null + } + function l() { + return this.findParent(function(e) { + return e.isFunction() || e.isProgram() + }) + } + function c() { + var e = this + do if (Array.isArray(e.container)) return e + while ((e = e.parentPath)) + } + function p(e) { + return this.getDeepestCommonAncestorFrom(e, function(e, t, r) { + for ( + var n = void 0, i = E.VISITOR_KEYS[e.type], s = r, a = 0; + a < s.length; + a++ + ) { + var o = s[a], + u = o[t + 1] + if (n) + if (u.listKey && n.listKey === u.listKey && u.key < n.key) n = u + else { + var l = i.indexOf(n.parentKey), + c = i.indexOf(u.parentKey) + l > c && (n = u) + } + else n = u + } + return n + }) + } + function f(e, t) { + var r = this + if (!e.length) return this + if (1 === e.length) return e[0] + var n = 1 / 0, + i = void 0, + s = void 0, + a = e.map(function(e) { + var t = [] + do t.unshift(e) + while ((e = e.parentPath) && e !== r) + return t.length < n && (n = t.length), t + }), + o = a[0] + e: for (var u = 0; n > u; u++) { + for (var l = o[u], c = a, p = 0; p < c.length; p++) { + var f = c[p] + if (f[u] !== l) break e + } + ;(i = u), (s = l) + } + if (s) return t ? t(s, i, a) : s + throw new Error("Couldn't find intersection") + } + function h() { + var e = this, + t = [] + do t.push(e) + while ((e = e.parentPath)) + return t + } + function d() { + for (var e = this; e; ) { + for (var t = arguments, r = 0; r < t.length; r++) { + var n = t[r] + if (e.node.type === n) return !0 + } + e = e.parentPath + } + return !1 + } + function m(e) { + var t = this + do + if (t.isFunction()) { + var r = t.node.shadow + if (r) { + if (!e || r[e] !== !1) return t + } else if (t.isArrowFunctionExpression()) return t + return null + } + while ((t = t.parentPath)) + return null + } + var y = r(n)["default"], + v = r(i)["default"] + ;(t.__esModule = !0), + (t.findParent = o), + (t.find = u), + (t.getFunctionParent = l), + (t.getStatementParent = c), + (t.getEarliestCommonAncestorFrom = p), + (t.getDeepestCommonAncestorFrom = f), + (t.getAncestry = h), + (t.inType = d), + (t.inShadow = m) + var g = r(s), + E = y(g), + b = r(a) + v(b) + }, + function(e, t, r, n, i, s) { + "use strict" + function a(e) { + var t = this.opts + return ( + this.debug(function() { + return e + }), + this.node && this._call(t[e]) + ? !0 + : this.node + ? this._call(t[this.node.type] && t[this.node.type][e]) + : !1 + ) + } + function o(e) { + if (!e) return !1 + for (var t = 0; t < e.length; t++) { + var r = e[t] + if (r) { + var n = this.node + if (!n) return !0 + var i = r.call(this.state, this, this.state) + if (i) + throw new Error("Unexpected return value from visitor method " + r) + if (this.node !== n) return !0 + if (this.shouldStop || this.shouldSkip || this.removed) return !0 + } + } + return !1 + } + function u() { + var e = this.opts.blacklist + return e && e.indexOf(this.node.type) > -1 + } + function l() { + return this.node + ? this.isBlacklisted() + ? !1 + : this.opts.shouldSkip && this.opts.shouldSkip(this) + ? !1 + : this.call("enter") || this.shouldSkip + ? (this.debug(function() { + return "Skip..." + }), + this.shouldStop) + : (this.debug(function() { + return "Recursing into..." + }), + T["default"].node( + this.node, + this.opts, + this.scope, + this.state, + this, + this.skipKeys + ), + this.call("exit"), + this.shouldStop) + : !1 + } + function c() { + this.shouldSkip = !0 + } + function p(e) { + this.skipKeys[e] = !0 + } + function f() { + ;(this.shouldStop = !0), (this.shouldSkip = !0) + } + function h() { + if (!this.opts || !this.opts.noScope) { + var e = this.context && this.context.scope + if (!e) + for (var t = this.parentPath; t && !e; ) { + if (t.opts && t.opts.noScope) return + ;(e = t.scope), (t = t.parentPath) + } + ;(this.scope = this.getScope(e)), this.scope && this.scope.init() + } + } + function d(e) { + return ( + (this.shouldSkip = !1), + (this.shouldStop = !1), + (this.removed = !1), + (this.skipKeys = {}), + e && ((this.context = e), (this.state = e.state), (this.opts = e.opts)), + this.setScope(), + this + ) + } + function m() { + this.removed || (this._resyncParent(), this._resyncList(), this._resyncKey()) + } + function y() { + this.parentPath && (this.parent = this.parentPath.node) + } + function v() { + if (this.container && this.node !== this.container[this.key]) { + if (Array.isArray(this.container)) { + for (var e = 0; e < this.container.length; e++) + if (this.container[e] === this.node) return this.setKey(e) + } else + for (var t in this.container) + if (this.container[t] === this.node) return this.setKey(t) + this.key = null + } + } + function g() { + if (this.parent && this.inList) { + var e = this.parent[this.listKey] + this.container !== e && (this.container = e || null) + } + } + function E() { + ;(null != this.key && + this.container && + this.container[this.key] === this.node) || + this._markRemoved() + } + function b() { + this.contexts.pop(), this.setContext(this.contexts[this.contexts.length - 1]) + } + function x(e) { + this.contexts.push(e), this.setContext(e) + } + function A(e, t, r, n) { + ;(this.inList = !!r), + (this.listKey = r), + (this.parentKey = r || n), + (this.container = t), + (this.parentPath = e || this.parentPath), + this.setKey(n) + } + function D(e) { + ;(this.key = e), + (this.node = this.container[this.key]), + (this.type = this.node && this.node.type) + } + function C() { + var e = arguments.length <= 0 || void 0 === arguments[0] ? this : arguments[0] + if (!e.removed) + for ( + var t = this.contexts, + r = t, + n = Array.isArray(r), + i = 0, + r = n ? r : F(r); + ; + + ) { + var s + if (n) { + if (i >= r.length) break + s = r[i++] + } else { + if (((i = r.next()), i.done)) break + s = i.value + } + var a = s + a.maybeQueue(e) + } + } + function S() { + for (var e = this, t = this.contexts; !t.length; ) + (e = e.parentPath), (t = e.contexts) + return t + } + var F = r(n)["default"], + w = r(i)["default"] + ;(t.__esModule = !0), + (t.call = a), + (t._call = o), + (t.isBlacklisted = u), + (t.visit = l), + (t.skip = c), + (t.skipKey = p), + (t.stop = f), + (t.setScope = h), + (t.setContext = d), + (t.resync = m), + (t._resyncParent = y), + (t._resyncKey = v), + (t._resyncList = g), + (t._resyncRemoved = E), + (t.popContext = b), + (t.pushContext = x), + (t.setup = A), + (t.setKey = D), + (t.requeue = C), + (t._getQueueContexts = S) + var _ = r(s), + T = w(_) + }, + function(e, t, r, n, i) { + "use strict" + function s() { + var e = this.node, + t = void 0 + if (this.isMemberExpression()) t = e.property + else { + if (!this.isProperty() && !this.isMethod()) throw new ReferenceError("todo") + t = e.key + } + return e.computed || (c.isIdentifier(t) && (t = c.stringLiteral(t.name))), t + } + function a() { + return c.ensureBlock(this.node) + } + function o() { + if (this.isArrowFunctionExpression()) { + this.ensureBlock() + var e = this.node + ;(e.expression = !1), + (e.type = "FunctionExpression"), + (e.shadow = e.shadow || !0) + } + } + var u = r(n)["default"] + ;(t.__esModule = !0), + (t.toComputedKey = s), + (t.ensureBlock = a), + (t.arrowFunctionToShadowed = o) + var l = r(i), + c = u(l) + }, + function(e, t, r, n, i, s, a) { + "use strict" + function o() { + var e = this + do { + if (!e.parentPath || (Array.isArray(e.container) && e.isStatement())) break + e = e.parentPath + } while (e) + if (e && (e.isProgram() || e.isFile())) + throw new Error( + "File/Program node, we can't possibly find a statement parent to this" + ) + return e + } + function u() { + return "left" === this.key + ? this.getSibling("right") + : "right" === this.key + ? this.getSibling("left") + : void 0 + } + function l() { + var e = [], + t = function(t) { + t && (e = e.concat(t.getCompletionRecords())) + } + if (this.isIfStatement()) t(this.get("consequent")), t(this.get("alternate")) + else if (this.isDoExpression() || this.isFor() || this.isWhile()) + t(this.get("body")) + else if (this.isProgram() || this.isBlockStatement()) t(this.get("body").pop()) + else { + if (this.isFunction()) return this.get("body").getCompletionRecords() + this.isTryStatement() + ? (t(this.get("block")), + t(this.get("handler")), + t(this.get("finalizer"))) + : e.push(this) + } + return e + } + function c(e) { + return E["default"].get({ + parentPath: this.parentPath, + parent: this.parent, + container: this.container, + listKey: this.listKey, + key: e + }) + } + function p(e, t) { + t === !0 && (t = this.context) + var r = e.split(".") + return 1 === r.length ? this._getKey(e, t) : this._getPattern(r, t) + } + function f(e, t) { + var r = this, + n = this.node, + i = n[e] + return Array.isArray(i) + ? i.map(function(s, a) { + return E["default"] + .get({ + listKey: e, + parentPath: r, + parent: n, + container: i, + key: a + }) + .setContext(t) + }) + : E["default"] + .get({ parentPath: this, parent: n, container: n, key: e }) + .setContext(t) + } + function h(e, t) { + for (var r = this, n = e, i = 0; i < n.length; i++) { + var s = n[i] + r = "." === s ? r.parentPath : Array.isArray(r) ? r[s] : r.get(s, t) + } + return r + } + function d(e) { + return x.getBindingIdentifiers(this.node, e) + } + function m(e) { + return x.getOuterBindingIdentifiers(this.node, e) + } + var y = r(n)["default"], + v = r(i)["default"] + ;(t.__esModule = !0), + (t.getStatementParent = o), + (t.getOpposite = u), + (t.getCompletionRecords = l), + (t.getSibling = c), + (t.get = p), + (t._getKey = f), + (t._getPattern = h), + (t.getBindingIdentifiers = d), + (t.getOuterBindingIdentifiers = m) + var g = r(s), + E = y(g), + b = r(a), + x = v(b) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f, h, d, m, y, v, g, E, b, x, A, D, C) { + "use strict" + var S = r(n)["default"], + F = r(i)["default"], + w = r(s)["default"] + t.__esModule = !0 + var _ = r(a), + T = F(_), + P = r(o), + B = w(P), + k = r(u), + I = r(l), + O = w(I), + M = r(c), + R = w(M), + L = r(p), + N = w(L), + j = r(f), + U = w(j), + V = r(h), + G = F(V), + W = B["default"]("babel"), + q = (function() { + function e(t, r) { + S(this, e), + (this.parent = r), + (this.hub = t), + (this.contexts = []), + (this.data = {}), + (this.shouldSkip = !1), + (this.shouldStop = !1), + (this.removed = !1), + (this.state = null), + (this.opts = null), + (this.skipKeys = null), + (this.parentPath = null), + (this.context = null), + (this.container = null), + (this.listKey = null), + (this.inList = !1), + (this.parentKey = null), + (this.key = null), + (this.node = null), + (this.scope = null), + (this.type = null), + (this.typeAnnotation = null) + } + return ( + (e.get = function(t) { + var r = t.hub, + n = t.parentPath, + i = t.parent, + s = t.container, + a = t.listKey, + o = t.key + !r && n && (r = n.hub), + O["default"](i, "To get a node path the parent needs to exist") + for ( + var u = s[o], + l = (i[k.PATH_CACHE_KEY] = i[k.PATH_CACHE_KEY] || []), + c = void 0, + p = 0; + p < l.length; + p++ + ) { + var f = l[p] + if (f.node === u) { + c = f + break + } + } + if (c && !(c instanceof e)) { + if ("NodePath" !== c.constructor.name) + throw new Error( + "We found a path that isn't a NodePath instance. Possiblly due to bad serialisation." + ) + c = null + } + return c || ((c = new e(r, i)), l.push(c)), c.setup(n, s, a, o), c + }), + (e.prototype.getScope = function(e) { + var t = e + return this.isScope() && (t = new U["default"](this, e)), t + }), + (e.prototype.setData = function(e, t) { + return (this.data[e] = t) + }), + (e.prototype.getData = function(e, t) { + var r = this.data[e] + return !r && t && (r = this.data[e] = t), r + }), + (e.prototype.buildCodeFrameError = function(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? SyntaxError + : arguments[1] + return this.hub.file.buildCodeFrameError(this.node, e, t) + }), + (e.prototype.traverse = function(e, t) { + R["default"](this.node, e, this.scope, t, this) + }), + (e.prototype.mark = function(e, t) { + this.hub.file.metadata.marked.push({ + type: e, + message: t, + loc: this.node.loc + }) + }), + (e.prototype.set = function(e, t) { + G.validate(this.node, e, t), (this.node[e] = t) + }), + (e.prototype.getPathLocation = function() { + var e = [], + t = this + do { + var r = t.key + t.inList && (r = t.listKey + "[" + r + "]"), e.unshift(r) + } while ((t = t.parentPath)) + return e.join(".") + }), + (e.prototype.debug = function(e) { + W.enabled && + W(this.getPathLocation() + " " + this.type + ": " + e()) + }), + e + ) + })() + ;(t["default"] = q), + N["default"](q.prototype, r(d)), + N["default"](q.prototype, r(m)), + N["default"](q.prototype, r(y)), + N["default"](q.prototype, r(v)), + N["default"](q.prototype, r(g)), + N["default"](q.prototype, r(E)), + N["default"](q.prototype, r(b)), + N["default"](q.prototype, r(x)), + N["default"](q.prototype, r(A)), + N["default"](q.prototype, r(D)), + N["default"](q.prototype, r(C)) + for ( + var H = G.TYPES, + Y = function() { + var e = H[J], + t = "is" + e + ;(q.prototype[t] = function(e) { + return G[t](this.node, e) + }), + (q.prototype["assert" + e] = function(r) { + if (!this[t](r)) + throw new TypeError("Expected node path of type " + e) + }) + }, + J = 0; + J < H.length; + J++ + ) + Y() + var K = function(e) { + if ("_" === e[0]) return "continue" + G.TYPES.indexOf(e) < 0 && G.TYPES.push(e) + var t = T[e] + q.prototype["is" + e] = function(e) { + return t.checkPath(this, e) + } + } + for (var X in T) { + K(X) + } + e.exports = t["default"] + }, + function(e, t, r, n, i, s) { + "use strict" + function a() { + if (this.typeAnnotation) return this.typeAnnotation + var e = this._getTypeAnnotation() || v.anyTypeAnnotation() + return ( + v.isTypeAnnotation(e) && (e = e.typeAnnotation), (this.typeAnnotation = e) + ) + } + function o() { + var e = this.node + { + if (e) { + if (e.typeAnnotation) return e.typeAnnotation + var t = m[e.type] + return t + ? t.call(this, e) + : ((t = m[this.parentPath.type]), + t && t.validParent ? this.parentPath.getTypeAnnotation() : void 0) + } + if ("init" === this.key && this.parentPath.isVariableDeclarator()) { + var r = this.parentPath.parentPath, + n = r.parentPath + return "left" === r.key && n.isForInStatement() + ? v.stringTypeAnnotation() + : "left" === r.key && n.isForOfStatement() + ? v.anyTypeAnnotation() + : v.voidTypeAnnotation() + } + } + } + function u(e, t) { + return l(e, this.getTypeAnnotation(), t) + } + function l(e, t, r) { + if ("string" === e) return v.isStringTypeAnnotation(t) + if ("number" === e) return v.isNumberTypeAnnotation(t) + if ("boolean" === e) return v.isBooleanTypeAnnotation(t) + if ("any" === e) return v.isAnyTypeAnnotation(t) + if ("mixed" === e) return v.isMixedTypeAnnotation(t) + if ("void" === e) return v.isVoidTypeAnnotation(t) + if (r) return !1 + throw new Error("Unknown base type " + e) + } + function c(e) { + var t = this.getTypeAnnotation() + if (v.isAnyTypeAnnotation(t)) return !0 + if (v.isUnionTypeAnnotation(t)) { + for (var r = t.types, n = 0; n < r.length; n++) { + var i = r[n] + if (v.isAnyTypeAnnotation(i) || l(e, i, !0)) return !0 + } + return !1 + } + return l(e, t, !0) + } + function p(e) { + var t = this.getTypeAnnotation() + return ( + (e = e.getTypeAnnotation()), + !v.isAnyTypeAnnotation(t) && v.isFlowBaseAnnotation(t) + ? e.type === t.type + : void 0 + ) + } + function f(e) { + var t = this.getTypeAnnotation() + return v.isGenericTypeAnnotation(t) && v.isIdentifier(t.id, { name: e }) + } + var h = r(n)["default"] + ;(t.__esModule = !0), + (t.getTypeAnnotation = a), + (t._getTypeAnnotation = o), + (t.isBaseType = u), + (t.couldBeBaseType = c), + (t.baseTypeStrictlyMatches = p), + (t.isGenericType = f) + var d = r(i), + m = h(d), + y = r(s), + v = h(y) + }, + function(e, t, r, n, i) { + "use strict" + function s(e, t) { + var r = e.scope.getBinding(t), + n = [] + e.typeAnnotation = f.unionTypeAnnotation(n) + var i = [], + s = a(r, e, i), + o = l(e, t) + if ( + (o && + !(function() { + var e = a(r, o.ifStatement) + ;(s = s.filter(function(t) { + return e.indexOf(t) < 0 + })), + n.push(o.typeAnnotation) + })(), + s.length) + ) { + s = s.concat(i) + for (var u = s, c = 0; c < u.length; c++) { + var p = u[c] + n.push(p.getTypeAnnotation()) + } + } + return n.length ? f.createUnionTypeAnnotation(n) : void 0 + } + function a(e, t, r) { + var n = e.constantViolations.slice() + return ( + n.unshift(e.path), + n.filter(function(e) { + e = e.resolve() + var n = e._guessExecutionStatusRelativeTo(t) + return r && "function" === n && r.push(e), "before" === n + }) + ) + } + function o(e, t) { + var r = t.node.operator, + n = t.get("right").resolve(), + i = t.get("left").resolve(), + s = void 0 + if ( + (i.isIdentifier({ name: e }) + ? (s = n) + : n.isIdentifier({ name: e }) && (s = i), + s) + ) + return "===" === r + ? s.getTypeAnnotation() + : f.BOOLEAN_NUMBER_BINARY_OPERATORS.indexOf(r) >= 0 + ? f.numberTypeAnnotation() + : void 0 + if ("===" === r) { + var a = void 0, + o = void 0 + if ( + (i.isUnaryExpression({ operator: "typeof" }) + ? ((a = i), (o = n)) + : n.isUnaryExpression({ operator: "typeof" }) && ((a = n), (o = i)), + (o || a) && ((o = o.resolve()), o.isLiteral())) + ) { + var u = o.node.value + if ("string" == typeof u && a.get("argument").isIdentifier({ name: e })) + return f.createTypeAnnotationBasedOnTypeof(o.node.value) + } + } + } + function u(e) { + for (var t = void 0; (t = e.parentPath); ) { + if (t.isIfStatement() || t.isConditionalExpression()) + return "test" === e.key ? void 0 : t + e = t + } + } + function l(e, t) { + var r = u(e) + if (r) { + var n = r.get("test"), + i = [n], + s = [] + do { + var a = i.shift().resolve() + if ( + (a.isLogicalExpression() && + (i.push(a.get("left")), i.push(a.get("right"))), + a.isBinaryExpression()) + ) { + var c = o(t, a) + c && s.push(c) + } + } while (i.length) + return s.length + ? { typeAnnotation: f.createUnionTypeAnnotation(s), ifStatement: r } + : l(r, t) + } + } + var c = r(n)["default"] + t.__esModule = !0 + var p = r(i), + f = c(p) + ;(t["default"] = function(e) { + if (this.isReferenced()) { + var t = this.scope.getBinding(e.name) + return t + ? t.identifier.typeAnnotation + ? t.identifier.typeAnnotation + : s(this, e.name) + : "undefined" === e.name + ? f.voidTypeAnnotation() + : "NaN" === e.name || "Infinity" === e.name + ? f.numberTypeAnnotation() + : void ("arguments" === e.name) + } + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a) { + "use strict" + function o() { + var e = this.get("id") + return e.isIdentifier() ? this.get("init").getTypeAnnotation() : void 0 + } + function u(e) { + return e.typeAnnotation + } + function l(e) { + return this.get("callee").isIdentifier() + ? I.genericTypeAnnotation(e.callee) + : void 0 + } + function c() { + return I.stringTypeAnnotation() + } + function p(e) { + var t = e.operator + return "void" === t + ? I.voidTypeAnnotation() + : I.NUMBER_UNARY_OPERATORS.indexOf(t) >= 0 + ? I.numberTypeAnnotation() + : I.STRING_UNARY_OPERATORS.indexOf(t) >= 0 + ? I.stringTypeAnnotation() + : I.BOOLEAN_UNARY_OPERATORS.indexOf(t) >= 0 + ? I.booleanTypeAnnotation() + : void 0 + } + function f(e) { + var t = e.operator + if (I.NUMBER_BINARY_OPERATORS.indexOf(t) >= 0) return I.numberTypeAnnotation() + if (I.BOOLEAN_BINARY_OPERATORS.indexOf(t) >= 0) return I.booleanTypeAnnotation() + if ("+" === t) { + var r = this.get("right"), + n = this.get("left") + return n.isBaseType("number") && r.isBaseType("number") + ? I.numberTypeAnnotation() + : n.isBaseType("string") || r.isBaseType("string") + ? I.stringTypeAnnotation() + : I.unionTypeAnnotation([ + I.stringTypeAnnotation(), + I.numberTypeAnnotation() + ]) + } + } + function h() { + return I.createUnionTypeAnnotation([ + this.get("left").getTypeAnnotation(), + this.get("right").getTypeAnnotation() + ]) + } + function d() { + return I.createUnionTypeAnnotation([ + this.get("consequent").getTypeAnnotation(), + this.get("alternate").getTypeAnnotation() + ]) + } + function m() { + return this.get("expressions") + .pop() + .getTypeAnnotation() + } + function y() { + return this.get("right").getTypeAnnotation() + } + function v(e) { + var t = e.operator + return "++" === t || "--" === t ? I.numberTypeAnnotation() : void 0 + } + function g() { + return I.stringTypeAnnotation() + } + function E() { + return I.numberTypeAnnotation() + } + function b() { + return I.booleanTypeAnnotation() + } + function x() { + return I.nullLiteralTypeAnnotation() + } + function A() { + return I.genericTypeAnnotation(I.identifier("RegExp")) + } + function D() { + return I.genericTypeAnnotation(I.identifier("Object")) + } + function C() { + return I.genericTypeAnnotation(I.identifier("Array")) + } + function S() { + return C() + } + function F() { + return I.genericTypeAnnotation(I.identifier("Function")) + } + function w() { + return T(this.get("callee")) + } + function _() { + return T(this.get("tag")) + } + function T(e) { + if (((e = e.resolve()), e.isFunction())) { + if (e.is("async")) + return e.is("generator") + ? I.genericTypeAnnotation(I.identifier("AsyncIterator")) + : I.genericTypeAnnotation(I.identifier("Promise")) + if (e.node.returnType) return e.node.returnType + } + } + var P = r(n)["default"], + B = r(i)["default"] + ;(t.__esModule = !0), + (t.VariableDeclarator = o), + (t.TypeCastExpression = u), + (t.NewExpression = l), + (t.TemplateLiteral = c), + (t.UnaryExpression = p), + (t.BinaryExpression = f), + (t.LogicalExpression = h), + (t.ConditionalExpression = d), + (t.SequenceExpression = m), + (t.AssignmentExpression = y), + (t.UpdateExpression = v), + (t.StringLiteral = g), + (t.NumericLiteral = E), + (t.BooleanLiteral = b), + (t.NullLiteral = x), + (t.RegExpLiteral = A), + (t.ObjectExpression = D), + (t.ArrayExpression = C), + (t.RestElement = S), + (t.CallExpression = w), + (t.TaggedTemplateExpression = _) + var k = r(s), + I = P(k), + O = r(a) + ;(t.Identifier = B(O)), + (u.validParent = !0), + (S.validParent = !0), + (t.Function = F), + (t.Class = F) + }, + function(e, t, r, n, i, s, a) { + "use strict" + function o(e, t) { + function r(e) { + var t = n[s] + return "*" === t || e === t + } + if (!this.isMemberExpression()) return !1 + for (var n = e.split("."), i = [this.node], s = 0; i.length; ) { + var a = i.shift() + if (t && s === n.length) return !0 + if (T.isIdentifier(a)) { + if (!r(a.name)) return !1 + } else if (T.isLiteral(a)) { + if (!r(a.value)) return !1 + } else { + if (T.isMemberExpression(a)) { + if (a.computed && !T.isLiteral(a.property)) return !1 + i.unshift(a.property), i.unshift(a.object) + continue + } + if (!T.isThisExpression(a)) return !1 + if (!r("this")) return !1 + } + if (++s > n.length) return !1 + } + return s === n.length + } + function u(e) { + var t = this.node && this.node[e] + return t && Array.isArray(t) ? !!t.length : !!t + } + function l() { + return this.scope.isStatic(this.node) + } + function c(e) { + return !this.has(e) + } + function p(e, t) { + return this.node[e] === t + } + function f(e) { + return T.isType(this.type, e) + } + function h() { + return ("init" === this.key || "left" === this.key) && this.parentPath.isFor() + } + function d(e) { + return "body" === this.key && this.parentPath.isArrowFunctionExpression() + ? this.isExpression() + ? T.isBlockStatement(e) + : this.isBlockStatement() + ? T.isExpression(e) + : !1 + : !1 + } + function m(e) { + var t = this, + r = !0 + do { + var n = t.container + if (t.isFunction() && !r) return !!e + if (((r = !1), Array.isArray(n) && t.key !== n.length - 1)) return !1 + } while ((t = t.parentPath) && !t.isProgram()) + return !0 + } + function y() { + return this.parentPath.isLabeledStatement() || + T.isBlockStatement(this.container) + ? !1 + : w["default"](T.STATEMENT_OR_BLOCK_KEYS, this.key) + } + function v(e, t) { + if (!this.isReferencedIdentifier()) return !1 + var r = this.scope.getBinding(this.node.name) + if (!r || "module" !== r.kind) return !1 + var n = r.path, + i = n.parentPath + return i.isImportDeclaration() + ? i.node.source.value !== e + ? !1 + : t + ? n.isImportDefaultSpecifier() && "default" === t + ? !0 + : n.isImportNamespaceSpecifier() && "*" === t + ? !0 + : !(!n.isImportSpecifier() || n.node.imported.name !== t) + : !0 + : !1 + } + function g() { + var e = this.node + return e.end ? this.hub.file.code.slice(e.start, e.end) : "" + } + function E(e) { + return "after" !== this._guessExecutionStatusRelativeTo(e) + } + function b(e) { + var t = e.scope.getFunctionParent(), + r = this.scope.getFunctionParent() + if (t.node !== r.node) { + var n = this._guessExecutionStatusRelativeToDifferentFunctions(t) + if (n) return n + e = t.path + } + var i = e.getAncestry() + if (i.indexOf(this) >= 0) return "after" + var s = this.getAncestry(), + a = void 0, + o = void 0, + u = void 0 + for (u = 0; u < s.length; u++) { + var l = s[u] + if (((o = i.indexOf(l)), o >= 0)) { + a = l + break + } + } + if (!a) return "before" + var c = i[o - 1], + p = s[u - 1] + if (!c || !p) return "before" + if (c.listKey && c.container === p.container) + return c.key > p.key ? "before" : "after" + var f = T.VISITOR_KEYS[c.type].indexOf(c.key), + h = T.VISITOR_KEYS[p.type].indexOf(p.key) + return f > h ? "before" : "after" + } + function x(e) { + var t = e.path + if (t.isFunctionDeclaration()) { + var r = t.scope.getBinding(t.node.id.name) + if (!r.references) return "before" + for (var n = r.referencePaths, i = 0; i < n.length; i++) { + var s = n[i] + if ("callee" !== s.key || !s.parentPath.isCallExpression()) return + } + for (var a = void 0, o = 0; o < n.length; o++) { + var s = n[o], + u = !!s.find(function(e) { + return e.node === t.node + }) + if (!u) { + var l = this._guessExecutionStatusRelativeTo(s) + if (a) { + if (a !== l) return + } else a = l + } + } + return a + } + } + function A(e, t) { + return this._resolve(e, t) || this + } + function D(e, t) { + var r = this + if (!(t && t.indexOf(this) >= 0)) + if (((t = t || []), t.push(this), this.isVariableDeclarator())) { + if (this.get("id").isIdentifier()) return this.get("init").resolve(e, t) + } else if (this.isReferencedIdentifier()) { + var n = this.scope.getBinding(this.node.name) + if (!n) return + if (!n.constant) return + if ("module" === n.kind) return + if (n.path !== this) { + var i = (function() { + var i = n.path.resolve(e, t) + return r.find(function(e) { + return e.node === i.node + }) + ? { v: void 0 } + : { v: i } + })() + if ("object" == typeof i) return i.v + } + } else { + if (this.isTypeCastExpression()) + return this.get("expression").resolve(e, t) + if (e && this.isMemberExpression()) { + var s = this.toComputedKey() + if (!T.isLiteral(s)) return + var a = s.value, + o = this.get("object").resolve(e, t) + if (o.isObjectExpression()) + for ( + var u = o.get("properties"), l = u, c = 0; + c < l.length; + c++ + ) { + var p = l[c] + if (p.isProperty()) { + var f = p.get("key"), + h = + p.isnt("computed") && + f.isIdentifier({ name: a }) + if ((h = h || f.isLiteral({ value: a }))) + return p.get("value").resolve(e, t) + } + } + else if (o.isArrayExpression() && !isNaN(+a)) { + var d = o.get("elements"), + m = d[a] + if (m) return m.resolve(e, t) + } + } + } + } + var C = r(n)["default"], + S = r(i)["default"] + ;(t.__esModule = !0), + (t.matchesPattern = o), + (t.has = u), + (t.isStatic = l), + (t.isnt = c), + (t.equals = p), + (t.isNodeType = f), + (t.canHaveVariableDeclarationOrExpression = h), + (t.canSwapBetweenExpressionAndStatement = d), + (t.isCompletionRecord = m), + (t.isStatementOrBlock = y), + (t.referencesImport = v), + (t.getSource = g), + (t.willIMaybeExecuteBefore = E), + (t._guessExecutionStatusRelativeTo = b), + (t._guessExecutionStatusRelativeToDifferentFunctions = x), + (t.resolve = A), + (t._resolve = D) + var F = r(s), + w = C(F), + _ = r(a), + T = S(_), + P = u + t.is = P + }, + function(e, t, r, n, i, s) { + "use strict" + var a = r(n)["default"], + o = r(i)["default"] + t.__esModule = !0 + var u = r(s), + l = o(u), + c = { + ReferencedIdentifier: function(e, t) { + if (!e.isJSXIdentifier() || !u.react.isCompatTag(e.node.name)) { + var r = e.scope.getBinding(e.node.name) + if (r && r === t.scope.getBinding(e.node.name)) + if (r.constant) t.bindings[e.node.name] = r + else + for ( + var n = r.constantViolations, i = 0; + i < n.length; + i++ + ) { + var s = n[i] + t.breakOnScopePaths = t.breakOnScopePaths.concat( + s.getAncestry() + ) + } + } + } + }, + p = (function() { + function e(t, r) { + a(this, e), + (this.breakOnScopePaths = []), + (this.bindings = {}), + (this.scopes = []), + (this.scope = r), + (this.path = t) + } + return ( + (e.prototype.isCompatibleScope = function(e) { + for (var t in this.bindings) { + var r = this.bindings[t] + if (!e.bindingIdentifierEquals(t, r.identifier)) return !1 + } + return !0 + }), + (e.prototype.getCompatibleScopes = function() { + var e = this.path.scope + do { + if (!this.isCompatibleScope(e)) break + if ( + (this.scopes.push(e), + this.breakOnScopePaths.indexOf(e.path) >= 0) + ) + break + } while ((e = e.parent)) + }), + (e.prototype.getAttachmentPath = function() { + var e = this.scopes, + t = e.pop() + if (t) { + if (t.path.isFunction()) { + if (this.hasOwnParamBindings(t)) { + if (this.scope === t) return + return t.path.get("body").get("body")[0] + } + return this.getNextScopeStatementParent() + } + return t.path.isProgram() + ? this.getNextScopeStatementParent() + : void 0 + } + }), + (e.prototype.getNextScopeStatementParent = function() { + var e = this.scopes.pop() + return e ? e.path.getStatementParent() : void 0 + }), + (e.prototype.hasOwnParamBindings = function(e) { + for (var t in this.bindings) + if (e.hasOwnBinding(t)) { + var r = this.bindings[t] + if ("param" === r.kind) return !0 + } + return !1 + }), + (e.prototype.run = function() { + var e = this.path.node + if (!e._hoisted) { + ;(e._hoisted = !0), + this.path.traverse(c, this), + this.getCompatibleScopes() + var t = this.getAttachmentPath() + if ( + t && + t.getFunctionParent() !== this.path.getFunctionParent() + ) { + var r = t.scope.generateUidIdentifier("ref") + t.insertBefore([ + l.variableDeclaration("var", [ + l.variableDeclarator(r, this.path.node) + ]) + ]) + var n = this.path.parentPath + n.isJSXElement() && + this.path.container === n.node.children && + (r = l.JSXExpressionContainer(r)), + this.path.replaceWith(r) + } + } + }), + e + ) + })() + ;(t["default"] = p), (e.exports = t["default"]) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"] + t.__esModule = !0 + var a = r(i), + o = s(a), + u = { + types: ["Identifier", "JSXIdentifier"], + checkPath: function(e, t) { + var r = e.node, + n = e.parent + if (!o.isIdentifier(r, t)) { + if (!o.isJSXIdentifier(r, t)) return !1 + if (a.react.isCompatTag(r.name)) return !1 + } + return o.isReferenced(r, n) + } + } + t.ReferencedIdentifier = u + var l = { + types: ["MemberExpression"], + checkPath: function(e) { + var t = e.node, + r = e.parent + return o.isMemberExpression(t) && o.isReferenced(t, r) + } + } + t.ReferencedMemberExpression = l + var c = { + types: ["Identifier"], + checkPath: function(e) { + var t = e.node, + r = e.parent + return o.isIdentifier(t) && o.isBinding(t, r) + } + } + t.BindingIdentifier = c + var p = { + types: ["Statement"], + checkPath: function(e) { + var t = e.node, + r = e.parent + if (o.isStatement(t)) { + if (o.isVariableDeclaration(t)) { + if (o.isForXStatement(r, { left: t })) return !1 + if (o.isForStatement(r, { init: t })) return !1 + } + return !0 + } + return !1 + } + } + t.Statement = p + var f = { + types: ["Expression"], + checkPath: function(e) { + return e.isIdentifier() + ? e.isReferencedIdentifier() + : o.isExpression(e.node) + } + } + t.Expression = f + var h = { + types: ["Scopable"], + checkPath: function(e) { + return o.isScope(e.node, e.parent) + } + } + t.Scope = h + var d = { + checkPath: function(e) { + return o.isReferenced(e.node, e.parent) + } + } + t.Referenced = d + var m = { + checkPath: function(e) { + return o.isBlockScoped(e.node) + } + } + t.BlockScoped = m + var y = { + types: ["VariableDeclaration"], + checkPath: function(e) { + return o.isVar(e.node) + } + } + t.Var = y + var v = { + checkPath: function(e) { + return e.node && !!e.node.loc + } + } + t.User = v + var g = { + checkPath: function(e) { + return !e.isUser() + } + } + t.Generated = g + var E = { + checkPath: function(e, t) { + return e.scope.isPure(e.node, t) + } + } + t.Pure = E + var b = { + types: ["Flow", "ImportDeclaration", "ExportDeclaration"], + checkPath: function(e) { + var t = e.node + return o.isFlow(t) + ? !0 + : o.isImportDeclaration(t) + ? "type" === t.importKind || "typeof" === t.importKind + : o.isExportDeclaration(t) + ? "type" === t.exportKind + : !1 + } + } + t.Flow = b + }, + function(e, t, r, n, i, s, a, o, u, l) { + "use strict" + function c(e) { + if ( + (this._assertUnremoved(), + (e = this._verifyNodeList(e)), + this.parentPath.isExpressionStatement() || + this.parentPath.isLabeledStatement()) + ) + return this.parentPath.insertBefore(e) + if ( + this.isNodeType("Expression") || + (this.parentPath.isForStatement() && "init" === this.key) + ) + this.node && e.push(this.node), this.replaceExpressionWithStatements(e) + else { + if ((this._maybePopFromStatements(e), Array.isArray(this.container))) + return this._containerInsertBefore(e) + if (!this.isStatementOrBlock()) + throw new Error( + "We don't know what to do with this node type. We were previously a Statement but we can't fit in here?" + ) + this.node && e.push(this.node), this._replaceWith(P.blockStatement(e)) + } + return [this] + } + function p(e, t) { + this.updateSiblingKeys(e, t.length) + for (var r = [], n = 0; n < t.length; n++) { + var i = e + n, + s = t[n] + if ((this.container.splice(i, 0, s), this.context)) { + var a = this.context.create( + this.parent, + this.container, + i, + this.listKey + ) + this.context.queue && a.pushContext(this.context), r.push(a) + } else + r.push( + _["default"].get({ + parentPath: this.parentPath, + parent: this.parent, + container: this.container, + listKey: this.listKey, + key: i + }) + ) + } + for ( + var o = this._getQueueContexts(), + u = r, + l = Array.isArray(u), + c = 0, + u = l ? u : x(u); + ; + + ) { + var p + if (l) { + if (c >= u.length) break + p = u[c++] + } else { + if (((c = u.next()), c.done)) break + p = c.value + } + var a = p + a.setScope(), + a.debug(function() { + return "Inserted." + }) + for (var f = o, h = Array.isArray(f), d = 0, f = h ? f : x(f); ; ) { + var m + if (h) { + if (d >= f.length) break + m = f[d++] + } else { + if (((d = f.next()), d.done)) break + m = d.value + } + var y = m + y.maybeQueue(a, !0) + } + } + return r + } + function f(e) { + return this._containerInsert(this.key, e) + } + function h(e) { + return this._containerInsert(this.key + 1, e) + } + function d(e) { + var t = e[e.length - 1], + r = + P.isIdentifier(t) || + (P.isExpressionStatement(t) && P.isIdentifier(t.expression)) + r && !this.isCompletionRecord() && e.pop() + } + function m(e) { + if ( + (this._assertUnremoved(), + (e = this._verifyNodeList(e)), + this.parentPath.isExpressionStatement() || + this.parentPath.isLabeledStatement()) + ) + return this.parentPath.insertAfter(e) + if ( + this.isNodeType("Expression") || + (this.parentPath.isForStatement() && "init" === this.key) + ) { + if (this.node) { + var t = this.scope.generateDeclaredUidIdentifier() + e.unshift( + P.expressionStatement(P.assignmentExpression("=", t, this.node)) + ), + e.push(P.expressionStatement(t)) + } + this.replaceExpressionWithStatements(e) + } else { + if ((this._maybePopFromStatements(e), Array.isArray(this.container))) + return this._containerInsertAfter(e) + if (!this.isStatementOrBlock()) + throw new Error( + "We don't know what to do with this node type. We were previously a Statement but we can't fit in here?" + ) + this.node && e.unshift(this.node), this._replaceWith(P.blockStatement(e)) + } + return [this] + } + function y(e, t) { + if (this.parent) + for (var r = this.parent[C.PATH_CACHE_KEY], n = 0; n < r.length; n++) { + var i = r[n] + i.key >= e && (i.key += t) + } + } + function v(e) { + if (!e) return [] + e.constructor !== Array && (e = [e]) + for (var t = 0; t < e.length; t++) { + var r = e[t], + n = void 0 + if ( + (r + ? "object" != typeof r + ? (n = "contains a non-object node") + : r.type + ? r instanceof _["default"] && + (n = "has a NodePath when it expected a raw object") + : (n = "without a type") + : (n = "has falsy node"), + n) + ) { + var i = Array.isArray(r) ? "array" : typeof r + throw new Error( + "Node list " + n + " with the index of " + t + " and type of " + i + ) + } + } + return e + } + function g(e, t) { + this._assertUnremoved(), (t = this._verifyNodeList(t)) + var r = _["default"].get({ + parentPath: this, + parent: this.node, + container: this.node[e], + listKey: e, + key: 0 + }) + return r.insertBefore(t) + } + function E(e, t) { + this._assertUnremoved(), (t = this._verifyNodeList(t)) + var r = this.node[e], + n = _["default"].get({ + parentPath: this, + parent: this.node, + container: r, + listKey: e, + key: r.length + }) + return n.replaceWithMultiple(t) + } + function b() { + var e = + arguments.length <= 0 || void 0 === arguments[0] + ? this.scope + : arguments[0], + t = new F["default"](this, e) + return t.run() + } + var x = r(n)["default"], + A = r(i)["default"], + D = r(s)["default"] + ;(t.__esModule = !0), + (t.insertBefore = c), + (t._containerInsert = p), + (t._containerInsertBefore = f), + (t._containerInsertAfter = h), + (t._maybePopFromStatements = d), + (t.insertAfter = m), + (t.updateSiblingKeys = y), + (t._verifyNodeList = v), + (t.unshiftContainer = g), + (t.pushContainer = E), + (t.hoist = b) + var C = r(a), + S = r(o), + F = A(S), + w = r(u), + _ = A(w), + T = r(l), + P = D(T) + }, + function(e, t, r, n) { + "use strict" + function i() { + return ( + this._assertUnremoved(), + this.resync(), + this._callRemovalHooks() + ? void this._markRemoved() + : (this.shareCommentsWithSiblings(), + this._remove(), + void this._markRemoved()) + ) + } + function s() { + for (var e = l.hooks, t = 0; t < e.length; t++) { + var r = e[t] + if (r(this, this.parentPath)) return !0 + } + } + function a() { + Array.isArray(this.container) + ? (this.container.splice(this.key, 1), this.updateSiblingKeys(this.key, -1)) + : this._replaceWith(null) + } + function o() { + ;(this.shouldSkip = !0), (this.removed = !0), (this.node = null) + } + function u() { + if (this.removed) + throw this.buildCodeFrameError("NodePath has been removed so is read-only.") + } + ;(t.__esModule = !0), + (t.remove = i), + (t._callRemovalHooks = s), + (t._remove = a), + (t._markRemoved = o), + (t._assertUnremoved = u) + var l = r(n) + }, + function(e, t, r, n, i, s, a, o, u, l) { + "use strict" + function c(e) { + this.resync(), + (e = this._verifyNodeList(e)), + F.inheritLeadingComments(e[0], this.node), + F.inheritTrailingComments(e[e.length - 1], this.node), + (this.node = this.container[this.key] = null), + this.insertAfter(e), + this.node ? this.requeue() : this.remove() + } + function p(e) { + this.resync() + try { + ;(e = "(" + e + ")"), (e = C.parse(e)) + } catch (t) { + var r = t.loc + throw (r && + ((t.message += " - make sure this is an expression."), + (t.message += "\n" + E["default"](e, r.line, r.column + 1))), + t) + } + return ( + (e = e.program.body[0].expression), + x["default"].removeProperties(e), + this.replaceWith(e) + ) + } + function f(e) { + if ((this.resync(), this.removed)) + throw new Error("You can't replace this node, we've already removed it") + if ((e instanceof D["default"] && (e = e.node), !e)) + throw new Error( + "You passed `path.replaceWith()` a falsy node, use `path.remove()` instead" + ) + if (this.node !== e) { + if (this.isProgram() && !F.isProgram(e)) + throw new Error( + "You can only replace a Program root node with another Program node" + ) + if (Array.isArray(e)) + throw new Error( + "Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`" + ) + if ("string" == typeof e) + throw new Error( + "Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`" + ) + if ( + (this.isNodeType("Statement") && + F.isExpression(e) && + (this.canHaveVariableDeclarationOrExpression() || + this.canSwapBetweenExpressionAndStatement(e) || + (e = F.expressionStatement(e))), + this.isNodeType("Expression") && + F.isStatement(e) && + !this.canHaveVariableDeclarationOrExpression() && + !this.canSwapBetweenExpressionAndStatement(e)) + ) + return this.replaceExpressionWithStatements([e]) + var t = this.node + t && (F.inheritsComments(e, t), F.removeComments(t)), + this._replaceWith(e), + (this.type = e.type), + this.setScope(), + this.requeue() + } + } + function h(e) { + if (!this.container) throw new ReferenceError("Container is falsy") + this.inList + ? F.validate(this.parent, this.key, [e]) + : F.validate(this.parent, this.key, e), + this.debug(function() { + return "Replace with " + (e && e.type) + }), + (this.node = this.container[this.key] = e) + } + function d(e) { + this.resync() + var t = F.toSequenceExpression(e, this.scope) + if (F.isSequenceExpression(t)) { + var r = t.expressions + r.length >= 2 && + this.parentPath.isExpressionStatement() && + this._maybePopFromStatements(r), + 1 === r.length ? this.replaceWith(r[0]) : this.replaceWith(t) + } else { + if (!t) { + var n = F.functionExpression(null, [], F.blockStatement(e)) + ;(n.shadow = !0), + this.replaceWith(F.callExpression(n, [])), + this.traverse(w) + for ( + var i = this.get("callee").getCompletionRecords(), s = 0; + s < i.length; + s++ + ) { + var a = i[s] + if (a.isExpressionStatement()) { + var o = a.findParent(function(e) { + return e.isLoop() + }) + if (o) { + var u = this.get("callee"), + l = u.scope.generateDeclaredUidIdentifier("ret") + u.get("body").pushContainer("body", F.returnStatement(l)), + a + .get("expression") + .replaceWith( + F.assignmentExpression( + "=", + l, + a.node.expression + ) + ) + } else a.replaceWith(F.returnStatement(a.node.expression)) + } + } + return this.node + } + this.replaceWith(t) + } + } + function m(e) { + return ( + this.resync(), + Array.isArray(e) + ? Array.isArray(this.container) + ? ((e = this._verifyNodeList(e)), + this._containerInsertAfter(e), + this.remove()) + : this.replaceWithMultiple(e) + : this.replaceWith(e) + ) + } + var y = r(n)["default"], + v = r(i)["default"] + ;(t.__esModule = !0), + (t.replaceWithMultiple = c), + (t.replaceWithSourceString = p), + (t.replaceWith = f), + (t._replaceWith = h), + (t.replaceExpressionWithStatements = d), + (t.replaceInline = m) + var g = r(s), + E = y(g), + b = r(a), + x = y(b), + A = r(o), + D = y(A), + C = r(u), + S = r(l), + F = v(S), + w = { + Function: function(e) { + e.skip() + }, + VariableDeclaration: function(e) { + if ("var" === e.node.kind) { + var t = e.getBindingIdentifiers() + for (var r in t) e.scope.push({ id: t[r] }) + for ( + var n = [], i = e.node.declarations, s = 0; + s < i.length; + s++ + ) { + var a = i[s] + a.init && + n.push( + F.expressionStatement( + F.assignmentExpression("=", a.id, a.init) + ) + ) + } + e.replaceWithMultiple(n) + } + } + } + }, + function(e, t, r, n) { + "use strict" + var i = r(n)["default"] + t.__esModule = !0 + var s = (function() { + function e(t) { + var r = t.existing, + n = t.identifier, + s = t.scope, + a = t.path, + o = t.kind + i(this, e), + (this.identifier = n), + (this.scope = s), + (this.path = a), + (this.kind = o), + (this.constantViolations = []), + (this.constant = !0), + (this.referencePaths = []), + (this.referenced = !1), + (this.references = 0), + this.clearValue(), + r && + (this.constantViolations = [].concat( + r.path, + r.constantViolations, + this.constantViolations + )) + } + return ( + (e.prototype.deoptValue = function() { + this.clearValue(), (this.hasDeoptedValue = !0) + }), + (e.prototype.setValue = function(e) { + this.hasDeoptedValue || ((this.hasValue = !0), (this.value = e)) + }), + (e.prototype.clearValue = function() { + ;(this.hasDeoptedValue = !1), (this.hasValue = !1), (this.value = null) + }), + (e.prototype.reassign = function(e) { + ;(this.constant = !1), this.constantViolations.push(e) + }), + (e.prototype.reference = function(e) { + ;(this.referenced = !0), this.references++, this.referencePaths.push(e) + }), + (e.prototype.dereference = function() { + this.references--, (this.referenced = !!this.references) + }), + e + ) + })() + ;(t["default"] = s), (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f, h, d, m, y, v, g, E) { + "use strict" + function b(e, t, r) { + var n = e[X] + if (n) { + if (x(n, t)) return n + } else if (!e[z]) return void (e[X] = r) + return A(e, t, r, n) + } + function x(e, t) { + return e.parent === t ? !0 : void 0 + } + function A(e, t, r, n) { + var i = (e[z] = e[z] || []) + n && (i.push(n), (e[X] = null)) + for (var s = 0; s < i.length; s++) { + var a = i[s] + if (x(a, t)) return a + } + i.push(r) + } + var D = r(n)["default"], + C = r(i)["default"], + S = r(s)["default"], + F = r(a)["default"], + w = r(o)["default"], + _ = r(u)["default"], + T = r(l)["default"], + P = r(c)["default"] + t.__esModule = !0 + var B = r(p), + k = T(B), + I = r(f), + O = T(I), + M = r(h), + R = T(M), + L = r(d), + N = T(L), + j = r(m), + U = T(j), + V = r(y), + G = P(V), + W = r(v), + q = T(W), + H = r(g), + Y = T(H), + J = r(E), + K = P(J), + X = S(), + z = S(), + $ = { + For: function(e) { + for (var t = K.FOR_INIT_KEYS, r = 0; r < t.length; r++) { + var n = t[r], + i = e.get(n) + i.isVar() && e.scope.getFunctionParent().registerBinding("var", i) + } + }, + Declaration: function(e) { + e.isBlockScoped() || + (e.isExportDeclaration() && e.get("declaration").isDeclaration()) || + e.scope.getFunctionParent().registerDeclaration(e) + }, + ReferencedIdentifier: function(e, t) { + t.references.push(e) + }, + ForXStatement: function(e, t) { + var r = e.get("left") + ;(r.isPattern() || r.isIdentifier()) && t.constantViolations.push(r) + }, + ExportDeclaration: { + exit: function(e) { + var t = e.node, + r = e.scope, + n = t.declaration + if (K.isClassDeclaration(n) || K.isFunctionDeclaration(n)) { + var i = n.id + if (!i) return + var s = r.getBinding(i.name) + s && s.reference() + } else if (K.isVariableDeclaration(n)) + for (var a = n.declarations, o = 0; o < a.length; o++) { + var u = a[o], + l = K.getBindingIdentifiers(u) + for (var c in l) { + var s = r.getBinding(c) + s && s.reference() + } + } + } + }, + LabeledStatement: function(e) { + e.scope.getProgramParent().addGlobal(e.node), + e.scope.getBlockParent().registerDeclaration(e) + }, + AssignmentExpression: function(e, t) { + t.assignments.push(e) + }, + UpdateExpression: function(e, t) { + t.constantViolations.push(e.get("argument")) + }, + UnaryExpression: function(e, t) { + "delete" === e.node.operator && + t.constantViolations.push(e.get("argument")) + }, + BlockScoped: function(e) { + var t = e.scope + t.path === e && (t = t.parent), + t.getBlockParent().registerDeclaration(e) + }, + ClassDeclaration: function(e) { + var t = e.node.id + if (t) { + var r = t.name + e.scope.bindings[r] = e.scope.getBinding(r) + } + }, + Block: function(e) { + for (var t = e.get("body"), r = t, n = 0; n < r.length; n++) { + var i = r[n] + i.isFunctionDeclaration() && + e.scope.getBlockParent().registerDeclaration(i) + } + } + }, + Q = 0, + Z = (function() { + function e(t, r) { + if ((C(this, e), r && r.block === t.node)) return r + var n = b(t.node, r, this) + return n + ? n + : ((this.uid = Q++), + (this.parent = r), + (this.hub = t.hub), + (this.parentBlock = t.parent), + (this.block = t.node), + void (this.path = t)) + } + return ( + (e.prototype.traverse = function(e, t, r) { + N["default"](e, t, this, r, this.path) + }), + (e.prototype.generateDeclaredUidIdentifier = function() { + var e = + arguments.length <= 0 || void 0 === arguments[0] + ? "temp" + : arguments[0], + t = this.generateUidIdentifier(e) + return this.push({ id: t }), t + }), + (e.prototype.generateUidIdentifier = function() { + var e = + arguments.length <= 0 || void 0 === arguments[0] + ? "temp" + : arguments[0] + return K.identifier(this.generateUid(e)) + }), + (e.prototype.generateUid = function() { + var e = + arguments.length <= 0 || void 0 === arguments[0] + ? "temp" + : arguments[0] + e = K.toIdentifier(e) + .replace(/^_+/, "") + .replace(/[0-9]+$/g, "") + var t = void 0, + r = 0 + do (t = this._generateUid(e, r)), r++ + while ( + this.hasBinding(t) || + this.hasGlobal(t) || + this.hasReference(t) + ) + var n = this.getProgramParent() + return (n.references[t] = !0), (n.uids[t] = !0), t + }), + (e.prototype._generateUid = function(e, t) { + var r = e + return t > 1 && (r += t), "_" + r + }), + (e.prototype.generateUidIdentifierBasedOnNode = function(e, t) { + var r = e + K.isAssignmentExpression(e) + ? (r = e.left) + : K.isVariableDeclarator(e) + ? (r = e.id) + : (K.isObjectProperty(r) || K.isObjectMethod(r)) && (r = r.key) + var n = [], + i = function a(e) { + if (K.isModuleDeclaration(e)) + if (e.source) a(e.source) + else if (e.specifiers && e.specifiers.length) + for ( + var t = e.specifiers, r = 0; + r < t.length; + r++ + ) { + var i = t[r] + a(i) + } + else e.declaration && a(e.declaration) + else if (K.isModuleSpecifier(e)) a(e.local) + else if (K.isMemberExpression(e)) a(e.object), a(e.property) + else if (K.isIdentifier(e)) n.push(e.name) + else if (K.isLiteral(e)) n.push(e.value) + else if (K.isCallExpression(e)) a(e.callee) + else if (K.isObjectExpression(e) || K.isObjectPattern(e)) + for (var s = e.properties, o = 0; o < s.length; o++) { + var u = s[o] + a(u.key || u.argument) + } + } + i(r) + var s = n.join("$") + return ( + (s = s.replace(/^_/, "") || t || "ref"), + this.generateUidIdentifier(s.slice(0, 20)) + ) + }), + (e.prototype.isStatic = function(e) { + if (K.isThisExpression(e) || K.isSuper(e)) return !0 + if (K.isIdentifier(e)) { + var t = this.getBinding(e.name) + return t ? t.constant : this.hasBinding(e.name) + } + return !1 + }), + (e.prototype.maybeGenerateMemoised = function(e, t) { + if (this.isStatic(e)) return null + var r = this.generateUidIdentifierBasedOnNode(e) + return t || this.push({ id: r }), r + }), + (e.prototype.checkBlockScopedCollisions = function(e, t, r, n) { + if ("param" !== t && ("hoisted" !== t || "let" !== e.kind)) { + var i = !1 + if ( + (i || + (i = + "let" === t || + "let" === e.kind || + "const" === e.kind || + "module" === e.kind), + i || + (i = + "param" === e.kind && + ("let" === t || "const" === t)), + i) + ) + throw this.hub.file.buildCodeFrameError( + n, + G.get("scopeDuplicateDeclaration", r), + TypeError + ) + } + }), + (e.prototype.rename = function(e, t, r) { + var n = this.getBinding(e) + return n + ? ((t = t || this.generateUidIdentifier(e).name), + new R["default"](n, e, t).rename(r)) + : void 0 + }), + (e.prototype._renameFromMap = function(e, t, r, n) { + e[t] && ((e[r] = n), (e[t] = null)) + }), + (e.prototype.dump = function() { + var e = O["default"]("-", 60) + console.log(e) + var t = this + do { + console.log("#", t.block.type) + for (var r in t.bindings) { + var n = t.bindings[r] + console.log(" -", r, { + constant: n.constant, + references: n.references, + violations: n.constantViolations.length, + kind: n.kind + }) + } + } while ((t = t.parent)) + console.log(e) + }), + (e.prototype.toArray = function(e, t) { + var r = this.hub.file + if (K.isIdentifier(e)) { + var n = this.getBinding(e.name) + if (n && n.constant && n.path.isGenericType("Array")) return e + } + if (K.isArrayExpression(e)) return e + if (K.isIdentifier(e, { name: "arguments" })) + return K.callExpression( + K.memberExpression( + K.memberExpression( + K.memberExpression( + K.identifier("Array"), + K.identifier("prototype") + ), + K.identifier("slice") + ), + K.identifier("call") + ), + [e] + ) + var i = "toArray", + s = [e] + return ( + t === !0 + ? (i = "toConsumableArray") + : t && (s.push(K.numericLiteral(t)), (i = "slicedToArray")), + K.callExpression(r.addHelper(i), s) + ) + }), + (e.prototype.registerDeclaration = function(e) { + if (e.isLabeledStatement()) this.registerBinding("label", e) + else if (e.isFunctionDeclaration()) + this.registerBinding("hoisted", e.get("id"), e) + else if (e.isVariableDeclaration()) + for ( + var t = e.get("declarations"), r = t, n = 0; + n < r.length; + n++ + ) { + var i = r[n] + this.registerBinding(e.node.kind, i) + } + else if (e.isClassDeclaration()) this.registerBinding("let", e) + else if (e.isImportDeclaration()) + for ( + var s = e.get("specifiers"), a = s, o = 0; + o < a.length; + o++ + ) { + var u = a[o] + this.registerBinding("module", u) + } + else if (e.isExportDeclaration()) { + var i = e.get("declaration") + ;(i.isClassDeclaration() || + i.isFunctionDeclaration() || + i.isVariableDeclaration()) && + this.registerDeclaration(i) + } else this.registerBinding("unknown", e) + }), + (e.prototype.buildUndefinedNode = function() { + return this.hasBinding("undefined") + ? K.unaryExpression("void", K.numericLiteral(0), !0) + : K.identifier("undefined") + }), + (e.prototype.registerConstantViolation = function(e) { + var t = e.getBindingIdentifiers() + for (var r in t) { + var n = this.getBinding(r) + n && n.reassign(e) + } + }), + (e.prototype.registerBinding = function(e, t) { + var r = + arguments.length <= 2 || void 0 === arguments[2] + ? t + : arguments[2] + return function() { + if (!e) throw new ReferenceError("no `kind`") + if (t.isVariableDeclaration()) + for ( + var n = t.get("declarations"), i = 0; + i < n.length; + i++ + ) { + var s = n[i] + this.registerBinding(e, s) + } + else { + var a = this.getProgramParent(), + o = t.getBindingIdentifiers(!0) + for (var u in o) + for (var l = o[u], c = 0; c < l.length; c++) { + var p = l[c], + f = this.getOwnBinding(u) + if (f) { + if (f.identifier === p) continue + this.checkBlockScopedCollisions(f, e, u, p) + } + ;(a.references[u] = !0), + (this.bindings[u] = new q["default"]({ + identifier: p, + existing: f, + scope: this, + path: r, + kind: e + })) + } + } + }.apply(this, arguments) + }), + (e.prototype.addGlobal = function(e) { + this.globals[e.name] = e + }), + (e.prototype.hasUid = function(e) { + var t = this + do if (t.uids[e]) return !0 + while ((t = t.parent)) + return !1 + }), + (e.prototype.hasGlobal = function(e) { + var t = this + do if (t.globals[e]) return !0 + while ((t = t.parent)) + return !1 + }), + (e.prototype.hasReference = function(e) { + var t = this + do if (t.references[e]) return !0 + while ((t = t.parent)) + return !1 + }), + (e.prototype.isPure = function(e, t) { + if (K.isIdentifier(e)) { + var r = this.getBinding(e.name) + return r ? (t ? r.constant : !0) : !1 + } + if (K.isClass(e)) + return e.superClass && !this.isPure(e.superClass, t) + ? !1 + : this.isPure(e.body, t) + if (K.isClassBody(e)) { + for ( + var n = e.body, + i = Array.isArray(n), + s = 0, + n = i ? n : F(n); + ; + + ) { + var a + if (i) { + if (s >= n.length) break + a = n[s++] + } else { + if (((s = n.next()), s.done)) break + a = s.value + } + var o = a + if (!this.isPure(o, t)) return !1 + } + return !0 + } + if (K.isBinary(e)) + return this.isPure(e.left, t) && this.isPure(e.right, t) + if (K.isArrayExpression(e)) { + for (var u = e.elements, l = 0; l < u.length; l++) { + var c = u[l] + if (!this.isPure(c, t)) return !1 + } + return !0 + } + if (K.isObjectExpression(e)) { + for (var p = e.properties, f = 0; f < p.length; f++) { + var h = p[f] + if (!this.isPure(h, t)) return !1 + } + return !0 + } + return K.isClassMethod(e) + ? e.computed && !this.isPure(e.key, t) + ? !1 + : "get" !== e.kind && "set" !== e.kind + : K.isClassProperty(e) || K.isObjectProperty(e) + ? e.computed && !this.isPure(e.key, t) + ? !1 + : this.isPure(e.value, t) + : K.isUnaryExpression(e) + ? this.isPure(e.argument, t) + : K.isPureish(e) + }), + (e.prototype.setData = function(e, t) { + return (this.data[e] = t) + }), + (e.prototype.getData = function(e) { + var t = this + do { + var r = t.data[e] + if (null != r) return r + } while ((t = t.parent)) + }), + (e.prototype.removeData = function(e) { + var t = this + do { + var r = t.data[e] + null != r && (t.data[e] = null) + } while ((t = t.parent)) + }), + (e.prototype.init = function() { + this.references || this.crawl() + }), + (e.prototype.crawl = function() { + var e = this.path + if ( + ((this.references = w(null)), + (this.bindings = w(null)), + (this.globals = w(null)), + (this.uids = w(null)), + (this.data = w(null)), + e.isLoop()) + ) + for (var t = K.FOR_INIT_KEYS, r = 0; r < t.length; r++) { + var n = t[r], + i = e.get(n) + i.isBlockScoped() && this.registerBinding(i.node.kind, i) + } + if ( + (e.isFunctionExpression() && + e.has("id") && + (e.get("id").node[K.NOT_LOCAL_BINDING] || + this.registerBinding("local", e.get("id"), e)), + e.isClassExpression() && + e.has("id") && + (e.get("id").node[K.NOT_LOCAL_BINDING] || + this.registerBinding("local", e)), + e.isFunction()) + ) + for (var s = e.get("params"), a = 0; a < s.length; a++) { + var o = s[a] + this.registerBinding("param", o) + } + e.isCatchClause() && this.registerBinding("let", e) + var u = this.getProgramParent() + if (!u.crawling) { + var l = { + references: [], + constantViolations: [], + assignments: [] + } + ;(this.crawling = !0), e.traverse($, l), (this.crawling = !1) + for ( + var c = l.assignments, + p = Array.isArray(c), + f = 0, + c = p ? c : F(c); + ; + + ) { + var h + if (p) { + if (f >= c.length) break + h = c[f++] + } else { + if (((f = c.next()), f.done)) break + h = f.value + } + var d = h, + m = d.getBindingIdentifiers(), + y = void 0 + for (var v in m) + d.scope.getBinding(v) || + ((y = y || d.scope.getProgramParent()), + y.addGlobal(m[v])) + d.scope.registerConstantViolation(d) + } + for ( + var g = l.references, + E = Array.isArray(g), + b = 0, + g = E ? g : F(g); + ; + + ) { + var x + if (E) { + if (b >= g.length) break + x = g[b++] + } else { + if (((b = g.next()), b.done)) break + x = b.value + } + var A = x, + D = A.scope.getBinding(A.node.name) + D + ? D.reference(A) + : A.scope.getProgramParent().addGlobal(A.node) + } + for ( + var C = l.constantViolations, + S = Array.isArray(C), + _ = 0, + C = S ? C : F(C); + ; + + ) { + var T + if (S) { + if (_ >= C.length) break + T = C[_++] + } else { + if (((_ = C.next()), _.done)) break + T = _.value + } + var P = T + P.scope.registerConstantViolation(P) + } + } + }), + (e.prototype.push = function(e) { + var t = this.path + t.isBlockStatement() || + t.isProgram() || + (t = this.getBlockParent().path), + t.isSwitchStatement() && (t = this.getFunctionParent().path), + (t.isLoop() || t.isCatchClause() || t.isFunction()) && + (K.ensureBlock(t.node), (t = t.get("body"))) + var r = e.unique, + n = e.kind || "var", + i = null == e._blockHoist ? 2 : e._blockHoist, + s = "declaration:" + n + ":" + i, + a = !r && t.getData(s) + if (!a) { + var o = K.variableDeclaration(n, []) + ;(o._generated = !0), (o._blockHoist = i) + var u = t.unshiftContainer("body", [o]) + ;(a = u[0]), r || t.setData(s, a) + } + var l = K.variableDeclarator(e.id, e.init) + a.node.declarations.push(l), + this.registerBinding(n, a.get("declarations").pop()) + }), + (e.prototype.getProgramParent = function() { + var e = this + do if (e.path.isProgram()) return e + while ((e = e.parent)) + throw new Error("We couldn't find a Function or Program...") + }), + (e.prototype.getFunctionParent = function() { + var e = this + do if (e.path.isFunctionParent()) return e + while ((e = e.parent)) + throw new Error("We couldn't find a Function or Program...") + }), + (e.prototype.getBlockParent = function() { + var e = this + do if (e.path.isBlockParent()) return e + while ((e = e.parent)) + throw new Error( + "We couldn't find a BlockStatement, For, Switch, Function, Loop or Program..." + ) + }), + (e.prototype.getAllBindings = function() { + var e = w(null), + t = this + do U["default"](e, t.bindings), (t = t.parent) + while (t) + return e + }), + (e.prototype.getAllBindingsOfKind = function() { + for (var e = w(null), t = arguments, r = 0; r < t.length; r++) { + var n = t[r], + i = this + do { + for (var s in i.bindings) { + var a = i.bindings[s] + a.kind === n && (e[s] = a) + } + i = i.parent + } while (i) + } + return e + }), + (e.prototype.bindingIdentifierEquals = function(e, t) { + return this.getBindingIdentifier(e) === t + }), + (e.prototype.getBinding = function(e) { + var t = this + do { + var r = t.getOwnBinding(e) + if (r) return r + } while ((t = t.parent)) + }), + (e.prototype.getOwnBinding = function(e) { + return this.bindings[e] + }), + (e.prototype.getBindingIdentifier = function(e) { + var t = this.getBinding(e) + return t && t.identifier + }), + (e.prototype.getOwnBindingIdentifier = function(e) { + var t = this.bindings[e] + return t && t.identifier + }), + (e.prototype.hasOwnBinding = function(e) { + return !!this.getOwnBinding(e) + }), + (e.prototype.hasBinding = function(t, r) { + return t + ? this.hasOwnBinding(t) + ? !0 + : this.parentHasBinding(t, r) + ? !0 + : this.hasUid(t) + ? !0 + : !r && k["default"](e.globals, t) + ? !0 + : !(r || !k["default"](e.contextVariables, t)) + : !1 + }), + (e.prototype.parentHasBinding = function(e, t) { + return this.parent && this.parent.hasBinding(e, t) + }), + (e.prototype.moveBindingTo = function(e, t) { + var r = this.getBinding(e) + r && + (r.scope.removeOwnBinding(e), + (r.scope = t), + (t.bindings[e] = r)) + }), + (e.prototype.removeOwnBinding = function(e) { + delete this.bindings[e] + }), + (e.prototype.removeBinding = function(e) { + var t = this.getBinding(e) + t && t.scope.removeOwnBinding(e) + var r = this + do r.uids[e] && (r.uids[e] = !1) + while ((r = r.parent)) + }), + D(e, null, [ + { key: "globals", value: _(Y["default"].builtin), enumerable: !0 }, + { + key: "contextVariables", + value: ["arguments", "undefined", "Infinity", "NaN"], + enumerable: !0 + } + ]), + e + ) + })() + ;(t["default"] = Z), (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o) { + "use strict" + var u = r(n)["default"], + l = r(i)["default"], + c = r(s)["default"] + t.__esModule = !0 + var p = r(a), + f = (l(p), r(o)), + h = c(f), + d = { + ReferencedIdentifier: function(e, t) { + var r = e.node + r.name === t.oldName && (r.name = t.newName) + }, + Scope: function(e, t) { + e.scope.bindingIdentifierEquals(t.oldName, t.binding.identifier) || + e.skip() + }, + "AssignmentExpression|Declaration": function(e, t) { + var r = e.getOuterBindingIdentifiers() + for (var n in r) n === t.oldName && (r[n].name = t.newName) + } + }, + m = (function() { + function e(t, r, n) { + u(this, e), (this.newName = n), (this.oldName = r), (this.binding = t) + } + return ( + (e.prototype.maybeConvertFromExportDeclaration = function(e) { + var t = e.parentPath.isExportDeclaration() && e.parentPath + if (t) { + var r = t.isExportDefaultDeclaration() + r && + (e.isFunctionDeclaration() || e.isClassDeclaration()) && + !e.node.id && + (e.node.id = e.scope.generateUidIdentifier("default")) + var n = e.getOuterBindingIdentifiers(), + i = [] + for (var s in n) { + var a = s === this.oldName ? this.newName : s, + o = r ? "default" : s + i.push(h.exportSpecifier(h.identifier(a), h.identifier(o))) + } + var u = h.exportNamedDeclaration(null, i) + e.isFunctionDeclaration() && (u._blockHoist = 3), + t.insertAfter(u), + t.replaceWith(e.node) + } + }), + (e.prototype.maybeConvertFromClassFunctionDeclaration = function(e) {}), + (e.prototype.maybeConvertFromClassFunctionExpression = function(e) {}), + (e.prototype.rename = function(e) { + var t = this.binding, + r = this.oldName, + n = this.newName, + i = t.scope, + s = t.path, + a = s.find(function(e) { + return e.isDeclaration() || e.isFunctionExpression() + }) + a && this.maybeConvertFromExportDeclaration(a), + i.traverse(e || i.block, d, this), + e || + (i.removeOwnBinding(r), + (i.bindings[n] = t), + (this.binding.identifier.name = n)), + "hoisted" === t.type, + a && + (this.maybeConvertFromClassFunctionDeclaration(a), + this.maybeConvertFromClassFunctionExpression(a)) + }), + e + ) + })() + ;(t["default"] = m), (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o, u, l, c) { + "use strict" + function p(e) { + if (e._exploded) return e + e._exploded = !0 + for (var t in e) + if (!E(t)) { + var r = t.split("|") + if (1 !== r.length) { + var n = e[t] + delete e[t] + for (var i = 0; i < r.length; i++) { + var s = r[i] + e[s] = n + } + } + } + f(e), delete e.__esModule, y(e), v(e) + for (var a = x(e), o = 0; o < a.length; o++) { + var t = a[o] + if (!E(t)) { + var u = F[t] + if (u) { + var n = e[t] + for (var l in n) n[l] = g(u, n[l]) + if ((delete e[t], u.types)) + for (var c = u.types, p = 0; p < c.length; p++) { + var l = c[p] + e[l] ? b(e[l], n) : (e[l] = n) + } + else b(e, n) + } + } + } + for (var t in e) + if (!E(t)) { + var n = e[t], + h = P.FLIPPED_ALIAS_KEYS[t], + d = P.DEPRECATED_KEYS[t] + if ( + (d && + (console.trace( + "Visitor defined for " + + t + + " but it has been renamed to " + + d + ), + (h = [d])), + h) + ) { + delete e[t] + for (var m = h, D = Array.isArray(m), C = 0, m = D ? m : A(m); ; ) { + var S + if (D) { + if (C >= m.length) break + S = m[C++] + } else { + if (((C = m.next()), C.done)) break + S = C.value + } + var w = S, + _ = e[w] + _ ? b(_, n) : (e[w] = k["default"](n)) + } + } + } + for (var t in e) E(t) || v(e[t]) + return e + } + function f(e) { + if (!e._verified) { + if ("function" == typeof e) + throw new Error(_.get("traverseVerifyRootFunction")) + for (var t in e) + if ((("enter" !== t && "exit" !== t) || h(t, e[t]), !E(t))) { + if (P.TYPES.indexOf(t) < 0) + throw new Error(_.get("traverseVerifyNodeType", t)) + var r = e[t] + if ("object" == typeof r) + for (var n in r) { + if ("enter" !== n && "exit" !== n) + throw new Error( + _.get("traverseVerifyVisitorProperty", t, n) + ) + h(t + "." + n, r[n]) + } + } + e._verified = !0 + } + } + function h(e, t) { + for ( + var r = [].concat(t), n = r, i = Array.isArray(n), s = 0, n = i ? n : A(n); + ; + + ) { + var a + if (i) { + if (s >= n.length) break + a = n[s++] + } else { + if (((s = n.next()), s.done)) break + a = s.value + } + var o = a + if ("function" != typeof o) + throw new TypeError( + "Non-function found defined in " + e + " with type " + typeof o + ) + } + } + function d(e) { + for ( + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? [] + : arguments[1], + r = {}, + n = 0; + n < e.length; + n++ + ) { + var i = e[n], + s = t[n] + p(i) + for (var a in i) { + var o = i[a] + s && (o = m(o, s)) + var u = (r[a] = r[a] || {}) + b(u, o) + } + } + return r + } + function m(e, t) { + var r = {} + for (var n in e) { + var i = e[n] + Array.isArray(i) && + ((i = i.map(function(e) { + var r = function(r) { + return e.call(t, r, t) + } + return ( + (r.toString = function() { + return e.toString() + }), + r + ) + })), + (r[n] = i)) + } + return r + } + function y(e) { + for (var t in e) + if (!E(t)) { + var r = e[t] + "function" == typeof r && (e[t] = { enter: r }) + } + } + function v(e) { + e.enter && !Array.isArray(e.enter) && (e.enter = [e.enter]), + e.exit && !Array.isArray(e.exit) && (e.exit = [e.exit]) + } + function g(e, t) { + var r = function(r) { + return e.checkPath(r) ? t.apply(this, arguments) : void 0 + } + return ( + (r.toString = function() { + return t.toString() + }), + r + ) + } + function E(e) { + return "_" === e[0] + ? !0 + : "enter" === e || "exit" === e || "shouldSkip" === e + ? !0 + : "blacklist" === e || "noScope" === e || "skipKeys" === e + } + function b(e, t) { + for (var r in t) e[r] = [].concat(e[r] || [], t[r]) + } + var x = r(n)["default"], + A = r(i)["default"], + D = r(s)["default"], + C = r(a)["default"] + ;(t.__esModule = !0), (t.explode = p), (t.verify = f), (t.merge = d) + var S = r(o), + F = D(S), + w = r(u), + _ = D(w), + T = r(l), + P = D(T), + B = r(c), + k = C(B) + }, + function(e, t, r, n) { + e.exports = r(n) + }, + function(e, t, r, n) { + "use strict" + var i = r(n)["default"] + t.__esModule = !0 + var s = ["consequent", "body", "alternate"] + t.STATEMENT_OR_BLOCK_KEYS = s + var a = ["body", "expressions"] + t.FLATTENABLE_KEYS = a + var o = ["left", "init"] + t.FOR_INIT_KEYS = o + var u = ["leadingComments", "trailingComments", "innerComments"] + t.COMMENT_KEYS = u + var l = ["||", "&&"] + t.LOGICAL_OPERATORS = l + var c = ["++", "--"] + t.UPDATE_OPERATORS = c + var p = [">", "<", ">=", "<="] + t.BOOLEAN_NUMBER_BINARY_OPERATORS = p + var f = ["==", "===", "!=", "!=="] + t.EQUALITY_BINARY_OPERATORS = f + var h = [].concat(f, ["in", "instanceof"]) + t.COMPARISON_BINARY_OPERATORS = h + var d = [].concat(h, p) + t.BOOLEAN_BINARY_OPERATORS = d + var m = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"] + t.NUMBER_BINARY_OPERATORS = m + var y = ["+"].concat(m, d) + t.BINARY_OPERATORS = y + var v = ["delete", "!"] + t.BOOLEAN_UNARY_OPERATORS = v + var g = ["+", "-", "++", "--", "~"] + t.NUMBER_UNARY_OPERATORS = g + var E = ["typeof"] + t.STRING_UNARY_OPERATORS = E + var b = ["void"].concat(v, g, E) + t.UNARY_OPERATORS = b + var x = { + optional: ["typeAnnotation", "typeParameters", "returnType"], + force: ["start", "loc", "end"] + } + t.INHERIT_KEYS = x + var A = i("var used to be block scoped") + t.BLOCK_SCOPED_SYMBOL = A + var D = i("should not be considered a local binding") + t.NOT_LOCAL_BINDING = D + }, + function(e, t, r, n, i, s, a, o, u, l, c, p) { + "use strict" + function f(e) { + var t = + arguments.length <= 1 || void 0 === arguments[1] + ? e.key || e.property + : arguments[1] + return (function() { + return e.computed || (M.isIdentifier(t) && (t = M.stringLiteral(t.name))), t + })() + } + function h(e, t) { + function r(e) { + for (var s = !1, a = [], o = e, u = 0; u < o.length; u++) { + var l = o[u] + if (M.isExpression(l)) a.push(l) + else if (M.isExpressionStatement(l)) a.push(l.expression) + else { + if (M.isVariableDeclaration(l)) { + if ("var" !== l.kind) return (i = !0) + for (var c = l.declarations, p = 0; p < c.length; p++) { + var f = c[p], + h = M.getBindingIdentifiers(f) + for (var d in h) n.push({ kind: l.kind, id: h[d] }) + f.init && a.push(M.assignmentExpression("=", f.id, f.init)) + } + s = !0 + continue + } + if (M.isIfStatement(l)) { + var m = l.consequent + ? r([l.consequent]) + : t.buildUndefinedNode(), + y = l.alternate ? r([l.alternate]) : t.buildUndefinedNode() + if (!m || !y) return (i = !0) + a.push(M.conditionalExpression(l.test, m, y)) + } else { + if (!M.isBlockStatement(l)) { + if (M.isEmptyStatement(l)) { + s = !0 + continue + } + return (i = !0) + } + a.push(r(l.body)) + } + } + s = !1 + } + return ( + (s || 0 === a.length) && a.push(t.buildUndefinedNode()), + 1 === a.length ? a[0] : M.sequenceExpression(a) + ) + } + if (e && e.length) { + var n = [], + i = !1, + s = r(e) + if (!i) { + for (var a = 0; a < n.length; a++) t.push(n[a]) + return s + } + } + } + function d(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? e.key : arguments[1] + return (function() { + var r = void 0 + return "method" === e.kind + ? d.increment() + "" + : ((r = M.isIdentifier(t) + ? t.name + : M.isStringLiteral(t) + ? JSON.stringify(t.value) + : JSON.stringify(I["default"].removeProperties(M.cloneDeep(t)))), + e.computed && (r = "[" + r + "]"), + e["static"] && (r = "static:" + r), + r) + })() + } + function m(e) { + return ( + (e += ""), + (e = e.replace(/[^a-zA-Z0-9$_]/g, "-")), + (e = e.replace(/^[-0-9]+/, "")), + (e = e.replace(/[-\s]+(.)?/g, function(e, t) { + return t ? t.toUpperCase() : "" + })), + M.isValidIdentifier(e) || (e = "_" + e), + e || "_" + ) + } + function y(e) { + return (e = m(e)), ("eval" !== e && "arguments" !== e) || (e = "_" + e), e + } + function v(e, t) { + if (M.isStatement(e)) return e + var r = !1, + n = void 0 + if (M.isClass(e)) (r = !0), (n = "ClassDeclaration") + else if (M.isFunction(e)) (r = !0), (n = "FunctionDeclaration") + else if (M.isAssignmentExpression(e)) return M.expressionStatement(e) + if ((r && !e.id && (n = !1), !n)) { + if (t) return !1 + throw new Error("cannot turn " + e.type + " to a statement") + } + return (e.type = n), e + } + function g(e) { + if ( + (M.isExpressionStatement(e) && (e = e.expression), + M.isClass(e) + ? (e.type = "ClassExpression") + : M.isFunction(e) && (e.type = "FunctionExpression"), + M.isExpression(e)) + ) + return e + throw new Error("cannot turn " + e.type + " to an expression") + } + function E(e, t) { + return M.isBlockStatement(e) + ? e + : (M.isEmptyStatement(e) && (e = []), + Array.isArray(e) || + (M.isStatement(e) || + (e = M.isFunction(t) + ? M.returnStatement(e) + : M.expressionStatement(e)), + (e = [e])), + M.blockStatement(e)) + } + function b(e) { + if (void 0 === e) return M.identifier("undefined") + if (e === !0 || e === !1) return M.booleanLiteral(e) + if (null === e) return M.nullLiteral() + if (B["default"](e)) return M.stringLiteral(e) + if (w["default"](e)) return M.numericLiteral(e) + if (T["default"](e)) { + var t = e.source, + r = e.toString().match(/\/([a-z]+|)$/)[1] + return M.regExpLiteral(t, r) + } + if (Array.isArray(e)) return M.arrayExpression(e.map(M.valueToNode)) + if (S["default"](e)) { + var n = [] + for (var i in e) { + var s = void 0 + ;(s = M.isValidIdentifier(i) ? M.identifier(i) : M.stringLiteral(i)), + n.push(M.objectProperty(s, M.valueToNode(e[i]))) + } + return M.objectExpression(n) + } + throw new Error("don't know how to turn this value into a node") + } + var x = r(n)["default"], + A = r(i)["default"], + D = r(s)["default"] + ;(t.__esModule = !0), + (t.toComputedKey = f), + (t.toSequenceExpression = h), + (t.toKeyAlias = d), + (t.toIdentifier = m), + (t.toBindingIdentifierName = y), + (t.toStatement = v), + (t.toExpression = g), + (t.toBlock = E), + (t.valueToNode = b) + var C = r(a), + S = A(C), + F = r(o), + w = A(F), + _ = r(u), + T = A(_), + P = r(l), + B = A(P), + k = r(c), + I = A(k), + O = r(p), + M = D(O) + ;(d.uid = 0), + (d.increment = function() { + return d.uid >= x ? (d.uid = 0) : d.uid++ + }) + }, + function(e, t, r, n, i, s, a, o) { + "use strict" + var u = r(n)["default"], + l = r(i)["default"], + c = r(s), + p = u(c), + f = r(a), + h = r(o), + d = l(h) + d["default"]("ArrayExpression", { + fields: { + elements: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach( + h.assertNodeOrValueType("null", "Expression", "SpreadElement") + ) + ), + default: [] + } + }, + visitor: ["elements"], + aliases: ["Expression"] + }), + d["default"]("AssignmentExpression", { + fields: { + operator: { validate: h.assertValueType("string") }, + left: { validate: h.assertNodeType("LVal") }, + right: { validate: h.assertNodeType("Expression") } + }, + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Expression"] + }), + d["default"]("BinaryExpression", { + builder: ["operator", "left", "right"], + fields: { + operator: { validate: h.assertOneOf.apply(void 0, f.BINARY_OPERATORS) }, + left: { validate: h.assertNodeType("Expression") }, + right: { validate: h.assertNodeType("Expression") } + }, + visitor: ["left", "right"], + aliases: ["Binary", "Expression"] + }), + d["default"]("Directive", { + visitor: ["value"], + fields: { value: { validate: h.assertNodeType("DirectiveLiteral") } } + }), + d["default"]("DirectiveLiteral", { + builder: ["value"], + fields: { value: { validate: h.assertValueType("string") } } + }), + d["default"]("BlockStatement", { + builder: ["body", "directives"], + visitor: ["directives", "body"], + fields: { + directives: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Directive")) + ), + default: [] + }, + body: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Statement")) + ) + } + }, + aliases: ["Scopable", "BlockParent", "Block", "Statement"] + }), + d["default"]("BreakStatement", { + visitor: ["label"], + fields: { + label: { validate: h.assertNodeType("Identifier"), optional: !0 } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }), + d["default"]("CallExpression", { + visitor: ["callee", "arguments"], + fields: { + callee: { validate: h.assertNodeType("Expression") }, + arguments: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Expression", "SpreadElement")) + ) + } + }, + aliases: ["Expression"] + }), + d["default"]("CatchClause", { + visitor: ["param", "body"], + fields: { + param: { validate: h.assertNodeType("Identifier") }, + body: { validate: h.assertNodeType("BlockStatement") } + }, + aliases: ["Scopable"] + }), + d["default"]("ConditionalExpression", { + visitor: ["test", "consequent", "alternate"], + fields: { + test: { validate: h.assertNodeType("Expression") }, + consequent: { validate: h.assertNodeType("Expression") }, + alternate: { validate: h.assertNodeType("Expression") } + }, + aliases: ["Expression", "Conditional"] + }), + d["default"]("ContinueStatement", { + visitor: ["label"], + fields: { + label: { validate: h.assertNodeType("Identifier"), optional: !0 } + }, + aliases: ["Statement", "Terminatorless", "CompletionStatement"] + }), + d["default"]("DebuggerStatement", { aliases: ["Statement"] }), + d["default"]("DoWhileStatement", { + visitor: ["test", "body"], + fields: { + test: { validate: h.assertNodeType("Expression") }, + body: { validate: h.assertNodeType("Statement") } + }, + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"] + }), + d["default"]("EmptyStatement", { aliases: ["Statement"] }), + d["default"]("ExpressionStatement", { + visitor: ["expression"], + fields: { expression: { validate: h.assertNodeType("Expression") } }, + aliases: ["Statement", "ExpressionWrapper"] + }), + d["default"]("File", { + builder: ["program", "comments", "tokens"], + visitor: ["program"], + fields: { program: { validate: h.assertNodeType("Program") } } + }), + d["default"]("ForInStatement", { + visitor: ["left", "right", "body"], + aliases: [ + "Scopable", + "Statement", + "For", + "BlockParent", + "Loop", + "ForXStatement" + ], + fields: { + left: { validate: h.assertNodeType("VariableDeclaration", "LVal") }, + right: { validate: h.assertNodeType("Expression") }, + body: { validate: h.assertNodeType("Statement") } + } + }), + d["default"]("ForStatement", { + visitor: ["init", "test", "update", "body"], + aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"], + fields: { + init: { + validate: h.assertNodeType("VariableDeclaration", "Expression"), + optional: !0 + }, + test: { validate: h.assertNodeType("Expression"), optional: !0 }, + update: { validate: h.assertNodeType("Expression"), optional: !0 }, + body: { validate: h.assertNodeType("Statement") } + } + }), + d["default"]("FunctionDeclaration", { + builder: ["id", "params", "body", "generator", "async"], + visitor: ["id", "params", "body", "returnType", "typeParameters"], + fields: { + id: { validate: h.assertNodeType("Identifier") }, + params: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("LVal")) + ) + }, + body: { validate: h.assertNodeType("BlockStatement") }, + generator: { default: !1, validate: h.assertValueType("boolean") }, + async: { default: !1, validate: h.assertValueType("boolean") } + }, + aliases: [ + "Scopable", + "Function", + "BlockParent", + "FunctionParent", + "Statement", + "Pureish", + "Declaration" + ] + }), + d["default"]("FunctionExpression", { + inherits: "FunctionDeclaration", + aliases: [ + "Scopable", + "Function", + "BlockParent", + "FunctionParent", + "Expression", + "Pureish" + ], + fields: { + id: { validate: h.assertNodeType("Identifier"), optional: !0 }, + params: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("LVal")) + ) + }, + body: { validate: h.assertNodeType("BlockStatement") }, + generator: { default: !1, validate: h.assertValueType("boolean") }, + async: { default: !1, validate: h.assertValueType("boolean") } + } + }), + d["default"]("Identifier", { + builder: ["name"], + visitor: ["typeAnnotation"], + aliases: ["Expression", "LVal"], + fields: { + name: { + validate: function(e, t, r) { + !p.isValidIdentifier(r) + } + } + } + }), + d["default"]("IfStatement", { + visitor: ["test", "consequent", "alternate"], + aliases: ["Statement", "Conditional"], + fields: { + test: { validate: h.assertNodeType("Expression") }, + consequent: { validate: h.assertNodeType("Statement") }, + alternate: { optional: !0, validate: h.assertNodeType("Statement") } + } + }), + d["default"]("LabeledStatement", { + visitor: ["label", "body"], + aliases: ["Statement"], + fields: { + label: { validate: h.assertNodeType("Identifier") }, + body: { validate: h.assertNodeType("Statement") } + } + }), + d["default"]("StringLiteral", { + builder: ["value"], + fields: { value: { validate: h.assertValueType("string") } }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }), + d["default"]("NumericLiteral", { + builder: ["value"], + deprecatedAlias: "NumberLiteral", + fields: { value: { validate: h.assertValueType("number") } }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }), + d["default"]("NullLiteral", { + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }), + d["default"]("BooleanLiteral", { + builder: ["value"], + fields: { value: { validate: h.assertValueType("boolean") } }, + aliases: ["Expression", "Pureish", "Literal", "Immutable"] + }), + d["default"]("RegExpLiteral", { + builder: ["pattern", "flags"], + deprecatedAlias: "RegexLiteral", + aliases: ["Expression", "Literal"], + fields: { + pattern: { validate: h.assertValueType("string") }, + flags: { validate: h.assertValueType("string"), default: "" } + } + }), + d["default"]("LogicalExpression", { + builder: ["operator", "left", "right"], + visitor: ["left", "right"], + aliases: ["Binary", "Expression"], + fields: { + operator: { + validate: h.assertOneOf.apply(void 0, f.LOGICAL_OPERATORS) + }, + left: { validate: h.assertNodeType("Expression") }, + right: { validate: h.assertNodeType("Expression") } + } + }), + d["default"]("MemberExpression", { + builder: ["object", "property", "computed"], + visitor: ["object", "property"], + aliases: ["Expression", "LVal"], + fields: { + object: { validate: h.assertNodeType("Expression") }, + property: { + validate: function(e, t, r) { + var n = e.computed ? "Expression" : "Identifier" + h.assertNodeType(n)(e, t, r) + } + }, + computed: { default: !1 } + } + }), + d["default"]("NewExpression", { + visitor: ["callee", "arguments"], + aliases: ["Expression"], + fields: { + callee: { validate: h.assertNodeType("Expression") }, + arguments: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Expression", "SpreadElement")) + ) + } + } + }), + d["default"]("Program", { + visitor: ["directives", "body"], + builder: ["body", "directives"], + fields: { + directives: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Directive")) + ), + default: [] + }, + body: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Statement")) + ) + } + }, + aliases: ["Scopable", "BlockParent", "Block", "FunctionParent"] + }), + d["default"]("ObjectExpression", { + visitor: ["properties"], + aliases: ["Expression"], + fields: { + properties: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach( + h.assertNodeType( + "ObjectMethod", + "ObjectProperty", + "SpreadProperty" + ) + ) + ) + } + } + }), + d["default"]("ObjectMethod", { + builder: ["kind", "key", "params", "body", "computed"], + fields: { + kind: { + validate: h.chain( + h.assertValueType("string"), + h.assertOneOf("method", "get", "set") + ), + default: "method" + }, + computed: { validate: h.assertValueType("boolean"), default: !1 }, + key: { + validate: function(e, t, r) { + var n = e.computed + ? ["Expression"] + : ["Identifier", "StringLiteral", "NumericLiteral"] + h.assertNodeType.apply(void 0, n)(e, t, r) + } + }, + decorators: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Decorator")) + ) + }, + body: { validate: h.assertNodeType("BlockStatement") }, + generator: { default: !1, validate: h.assertValueType("boolean") }, + async: { default: !1, validate: h.assertValueType("boolean") } + }, + visitor: [ + "key", + "params", + "body", + "decorators", + "returnType", + "typeParameters" + ], + aliases: [ + "UserWhitespacable", + "Function", + "Scopable", + "BlockParent", + "FunctionParent", + "Method", + "ObjectMember" + ] + }), + d["default"]("ObjectProperty", { + builder: ["key", "value", "computed", "shorthand", "decorators"], + fields: { + computed: { validate: h.assertValueType("boolean"), default: !1 }, + key: { + validate: function(e, t, r) { + var n = e.computed + ? ["Expression"] + : ["Identifier", "StringLiteral", "NumericLiteral"] + h.assertNodeType.apply(void 0, n)(e, t, r) + } + }, + value: { validate: h.assertNodeType("Expression") }, + shorthand: { validate: h.assertValueType("boolean"), default: !1 }, + decorators: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Decorator")) + ), + optional: !0 + } + }, + visitor: ["key", "value", "decorators"], + aliases: ["UserWhitespacable", "Property", "ObjectMember"] + }), + d["default"]("RestElement", { + visitor: ["argument", "typeAnnotation"], + aliases: ["LVal"], + fields: { argument: { validate: h.assertNodeType("LVal") } } + }), + d["default"]("ReturnStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { + argument: { validate: h.assertNodeType("Expression"), optional: !0 } + } + }), + d["default"]("SequenceExpression", { + visitor: ["expressions"], + fields: { + expressions: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Expression")) + ) + } + }, + aliases: ["Expression"] + }), + d["default"]("SwitchCase", { + visitor: ["test", "consequent"], + fields: { + test: { validate: h.assertNodeType("Expression"), optional: !0 }, + consequent: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("Statement")) + ) + } + } + }), + d["default"]("SwitchStatement", { + visitor: ["discriminant", "cases"], + aliases: ["Statement", "BlockParent", "Scopable"], + fields: { + discriminant: { validate: h.assertNodeType("Expression") }, + cases: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("SwitchCase")) + ) + } + } + }), + d["default"]("ThisExpression", { aliases: ["Expression"] }), + d["default"]("ThrowStatement", { + visitor: ["argument"], + aliases: ["Statement", "Terminatorless", "CompletionStatement"], + fields: { argument: { validate: h.assertNodeType("Expression") } } + }), + d["default"]("TryStatement", { + visitor: ["block", "handler", "finalizer"], + aliases: ["Statement"], + fields: { + body: { validate: h.assertNodeType("BlockStatement") }, + handler: { optional: !0, handler: h.assertNodeType("BlockStatement") }, + finalizer: { + optional: !0, + validate: h.assertNodeType("BlockStatement") + } + } + }), + d["default"]("UnaryExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { default: !0 }, + argument: { validate: h.assertNodeType("Expression") }, + operator: { validate: h.assertOneOf.apply(void 0, f.UNARY_OPERATORS) } + }, + visitor: ["argument"], + aliases: ["UnaryLike", "Expression"] + }), + d["default"]("UpdateExpression", { + builder: ["operator", "argument", "prefix"], + fields: { + prefix: { default: !1 }, + argument: { validate: h.assertNodeType("Expression") }, + operator: { validate: h.assertOneOf.apply(void 0, f.UPDATE_OPERATORS) } + }, + visitor: ["argument"], + aliases: ["Expression"] + }), + d["default"]("VariableDeclaration", { + builder: ["kind", "declarations"], + visitor: ["declarations"], + aliases: ["Statement", "Declaration"], + fields: { + kind: { + validate: h.chain( + h.assertValueType("string"), + h.assertOneOf("var", "let", "const") + ) + }, + declarations: { + validate: h.chain( + h.assertValueType("array"), + h.assertEach(h.assertNodeType("VariableDeclarator")) + ) + } + } + }), + d["default"]("VariableDeclarator", { + visitor: ["id", "init"], + fields: { + id: { validate: h.assertNodeType("LVal") }, + init: { optional: !0, validate: h.assertNodeType("Expression") } + } + }), + d["default"]("WhileStatement", { + visitor: ["test", "body"], + aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"], + fields: { + test: { validate: h.assertNodeType("Expression") }, + body: { validate: h.assertNodeType("BlockStatement", "Statement") } + } + }), + d["default"]("WithStatement", { + visitor: ["object", "body"], + aliases: ["Statement"], + fields: { + object: { object: h.assertNodeType("Expression") }, + body: { validate: h.assertNodeType("BlockStatement", "Statement") } + } + }) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i), + o = s(a) + o["default"]("AssignmentPattern", { + visitor: ["left", "right"], + aliases: ["Pattern", "LVal"], + fields: { + left: { validate: a.assertNodeType("Identifier") }, + right: { validate: a.assertNodeType("Expression") } + } + }), + o["default"]("ArrayPattern", { + visitor: ["elements", "typeAnnotation"], + aliases: ["Pattern", "LVal"], + fields: { + elements: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("Expression")) + ) + } + } + }), + o["default"]("ArrowFunctionExpression", { + builder: ["params", "body", "async"], + visitor: ["params", "body", "returnType"], + aliases: [ + "Scopable", + "Function", + "BlockParent", + "FunctionParent", + "Expression", + "Pureish" + ], + fields: { + params: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("LVal")) + ) + }, + body: { validate: a.assertNodeType("BlockStatement", "Expression") }, + async: { validate: a.assertValueType("boolean"), default: !1 } + } + }), + o["default"]("ClassBody", { + visitor: ["body"], + fields: { + body: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("ClassMethod", "ClassProperty")) + ) + } + } + }), + o["default"]("ClassDeclaration", { + builder: ["id", "superClass", "body", "decorators"], + visitor: [ + "id", + "body", + "superClass", + "mixins", + "typeParameters", + "superTypeParameters", + "implements", + "decorators" + ], + aliases: ["Scopable", "Class", "Statement", "Declaration", "Pureish"], + fields: { + id: { validate: a.assertNodeType("Identifier") }, + body: { validate: a.assertNodeType("ClassBody") }, + superClass: { optional: !0, validate: a.assertNodeType("Expression") }, + decorators: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("Decorator")) + ) + } + } + }), + o["default"]("ClassExpression", { + inherits: "ClassDeclaration", + aliases: ["Scopable", "Class", "Expression", "Pureish"], + fields: { + id: { optional: !0, validate: a.assertNodeType("Identifier") }, + body: { validate: a.assertNodeType("ClassBody") }, + superClass: { optional: !0, validate: a.assertNodeType("Expression") }, + decorators: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("Decorator")) + ) + } + } + }), + o["default"]("ExportAllDeclaration", { + visitor: ["source"], + aliases: [ + "Statement", + "Declaration", + "ModuleDeclaration", + "ExportDeclaration" + ], + fields: { source: { validate: a.assertNodeType("StringLiteral") } } + }), + o["default"]("ExportDefaultDeclaration", { + visitor: ["declaration"], + aliases: [ + "Statement", + "Declaration", + "ModuleDeclaration", + "ExportDeclaration" + ], + fields: { + declaration: { + validate: a.assertNodeType( + "FunctionDeclaration", + "ClassDeclaration", + "Expression" + ) + } + } + }), + o["default"]("ExportNamedDeclaration", { + visitor: ["declaration", "specifiers", "source"], + aliases: [ + "Statement", + "Declaration", + "ModuleDeclaration", + "ExportDeclaration" + ], + fields: { + declaration: { + validate: a.assertNodeType("Declaration"), + optional: !0 + }, + specifiers: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("ExportSpecifier")) + ) + }, + source: { validate: a.assertNodeType("StringLiteral"), optional: !0 } + } + }), + o["default"]("ExportSpecifier", { + visitor: ["local", "exported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { validate: a.assertNodeType("Identifier") }, + exported: { validate: a.assertNodeType("Identifier") } + } + }), + o["default"]("ForOfStatement", { + visitor: ["left", "right", "body"], + aliases: [ + "Scopable", + "Statement", + "For", + "BlockParent", + "Loop", + "ForXStatement" + ], + fields: { + left: { validate: a.assertNodeType("VariableDeclaration", "LVal") }, + right: { validate: a.assertNodeType("Expression") }, + body: { validate: a.assertNodeType("Statement") } + } + }), + o["default"]("ImportDeclaration", { + visitor: ["specifiers", "source"], + aliases: ["Statement", "Declaration", "ModuleDeclaration"], + fields: { + specifiers: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach( + a.assertNodeType( + "ImportSpecifier", + "ImportDefaultSpecifier", + "ImportNamespaceSpecifier" + ) + ) + ) + }, + source: { validate: a.assertNodeType("StringLiteral") } + } + }), + o["default"]("ImportDefaultSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { local: { validate: a.assertNodeType("Identifier") } } + }), + o["default"]("ImportNamespaceSpecifier", { + visitor: ["local"], + aliases: ["ModuleSpecifier"], + fields: { local: { validate: a.assertNodeType("Identifier") } } + }), + o["default"]("ImportSpecifier", { + visitor: ["local", "imported"], + aliases: ["ModuleSpecifier"], + fields: { + local: { validate: a.assertNodeType("Identifier") }, + imported: { validate: a.assertNodeType("Identifier") } + } + }), + o["default"]("MetaProperty", { + visitor: ["meta", "property"], + aliases: ["Expression"], + fields: { + meta: { validate: a.assertValueType("string") }, + property: { validate: a.assertValueType("string") } + } + }), + o["default"]("ClassMethod", { + aliases: [ + "Function", + "Scopable", + "BlockParent", + "FunctionParent", + "Method" + ], + builder: ["kind", "key", "params", "body", "computed", "static"], + visitor: [ + "key", + "params", + "body", + "decorators", + "returnType", + "typeParameters" + ], + fields: { + kind: { + validate: a.chain( + a.assertValueType("string"), + a.assertOneOf("get", "set", "method", "constructor") + ), + default: "method" + }, + computed: { + default: !1, + validate: a.assertValueType("boolean") + }, + static: { default: !1, validate: a.assertValueType("boolean") }, + key: { + validate: function(e, t, r) { + var n = e.computed + ? ["Expression"] + : ["Identifier", "StringLiteral", "NumericLiteral"] + a.assertNodeType.apply(void 0, n)(e, t, r) + } + }, + params: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("LVal")) + ) + }, + body: { validate: a.assertNodeType("BlockStatement") }, + generator: { default: !1, validate: a.assertValueType("boolean") }, + async: { default: !1, validate: a.assertValueType("boolean") } + } + }), + o["default"]("ObjectPattern", { + visitor: ["properties", "typeAnnotation"], + aliases: ["Pattern", "LVal"], + fields: { + properties: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("RestProperty", "Property")) + ) + } + } + }), + o["default"]("SpreadElement", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { argument: { validate: a.assertNodeType("Expression") } } + }), + o["default"]("Super", { aliases: ["Expression"] }), + o["default"]("TaggedTemplateExpression", { + visitor: ["tag", "quasi"], + aliases: ["Expression"], + fields: { + tag: { validate: a.assertNodeType("Expression") }, + quasi: { validate: a.assertNodeType("TemplateLiteral") } + } + }), + o["default"]("TemplateElement", { + builder: ["value", "tail"], + fields: { + value: {}, + tail: { validate: a.assertValueType("boolean"), default: !1 } + } + }), + o["default"]("TemplateLiteral", { + visitor: ["quasis", "expressions"], + aliases: ["Expression", "Literal"], + fields: { + quasis: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("TemplateElement")) + ) + }, + expressions: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach(a.assertNodeType("Expression")) + ) + } + } + }), + o["default"]("YieldExpression", { + builder: ["argument", "delegate"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { + delegate: { validate: a.assertValueType("boolean"), default: !1 }, + argument: { optional: !0, validate: a.assertNodeType("Expression") } + } + }) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i), + o = s(a) + o["default"]("AwaitExpression", { + builder: ["argument"], + visitor: ["argument"], + aliases: ["Expression", "Terminatorless"], + fields: { argument: { validate: a.assertNodeType("Expression") } } + }), + o["default"]("BindExpression", { + visitor: ["object", "callee"], + aliases: ["Expression"], + fields: {} + }), + o["default"]("Decorator", { + visitor: ["expression"], + fields: { expression: { validate: a.assertNodeType("Expression") } } + }), + o["default"]("DoExpression", { + visitor: ["body"], + aliases: ["Expression"], + fields: { body: { validate: a.assertNodeType("BlockStatement") } } + }), + o["default"]("ExportDefaultSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { exported: { validate: a.assertNodeType("Identifier") } } + }), + o["default"]("ExportNamespaceSpecifier", { + visitor: ["exported"], + aliases: ["ModuleSpecifier"], + fields: { exported: { validate: a.assertNodeType("Identifier") } } + }), + o["default"]("RestProperty", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { argument: { validate: a.assertNodeType("LVal") } } + }), + o["default"]("SpreadProperty", { + visitor: ["argument"], + aliases: ["UnaryLike"], + fields: { argument: { validate: a.assertNodeType("Expression") } } + }) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i), + o = s(a) + o["default"]("AnyTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("ArrayTypeAnnotation", { + visitor: ["elementType"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("BooleanTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("BooleanLiteralTypeAnnotation", { aliases: ["Flow"], fields: {} }), + o["default"]("NullLiteralTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("ClassImplements", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("ClassProperty", { + visitor: ["key", "value", "typeAnnotation", "decorators"], + aliases: ["Flow", "Property"], + fields: {} + }), + o["default"]("DeclareClass", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("DeclareFunction", { + visitor: ["id"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("DeclareInterface", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("DeclareModule", { + visitor: ["id", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("DeclareTypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("DeclareVariable", { + visitor: ["id"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("ExistentialTypeParam", { aliases: ["Flow"] }), + o["default"]("FunctionTypeAnnotation", { + visitor: ["typeParameters", "params", "rest", "returnType"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("FunctionTypeParam", { + visitor: ["name", "typeAnnotation"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("GenericTypeAnnotation", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("InterfaceExtends", { + visitor: ["id", "typeParameters"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("InterfaceDeclaration", { + visitor: ["id", "typeParameters", "extends", "body"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("IntersectionTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("MixedTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"] + }), + o["default"]("NullableTypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("NumericLiteralTypeAnnotation", { aliases: ["Flow"], fields: {} }), + o["default"]("NumberTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("StringLiteralTypeAnnotation", { aliases: ["Flow"], fields: {} }), + o["default"]("StringTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("ThisTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }), + o["default"]("TupleTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("TypeofTypeAnnotation", { + visitor: ["argument"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("TypeAlias", { + visitor: ["id", "typeParameters", "right"], + aliases: ["Flow", "FlowDeclaration", "Statement", "Declaration"], + fields: {} + }), + o["default"]("TypeAnnotation", { + visitor: ["typeAnnotation"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("TypeCastExpression", { + visitor: ["expression", "typeAnnotation"], + aliases: ["Flow", "ExpressionWrapper", "Expression"], + fields: {} + }), + o["default"]("TypeParameterDeclaration", { + visitor: ["params"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("TypeParameterInstantiation", { + visitor: ["params"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("ObjectTypeAnnotation", { + visitor: ["properties", "indexers", "callProperties"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("ObjectTypeCallProperty", { + visitor: ["value"], + aliases: ["Flow", "UserWhitespacable"], + fields: {} + }), + o["default"]("ObjectTypeIndexer", { + visitor: ["id", "key", "value"], + aliases: ["Flow", "UserWhitespacable"], + fields: {} + }), + o["default"]("ObjectTypeProperty", { + visitor: ["key", "value"], + aliases: ["Flow", "UserWhitespacable"], + fields: {} + }), + o["default"]("QualifiedTypeIdentifier", { + visitor: ["id", "qualification"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("UnionTypeAnnotation", { + visitor: ["types"], + aliases: ["Flow"], + fields: {} + }), + o["default"]("VoidTypeAnnotation", { + aliases: ["Flow", "FlowBaseAnnotation"], + fields: {} + }) + }, + function(e, t, r, n, i, s) { + "use strict" + function a(e) { + return Array.isArray(e) + ? "array" + : null === e + ? "null" + : void 0 === e + ? "undefined" + : typeof e + } + function o(e) { + function t(t, r, n) { + if (Array.isArray(n)) + for (var i = 0; i < n.length; i++) e(t, r + "[" + i + "]", n[i]) + } + return (t.each = e), t + } + function u() { + function e(e, t, n) { + if (r.indexOf(n) < 0) + throw new TypeError( + "Property " + + t + + " expected value to be one of " + + JSON.stringify(r) + + " but got " + + JSON.stringify(n) + ) + } + for (var t = arguments.length, r = Array(t), n = 0; t > n; n++) + r[n] = arguments[n] + return (e.oneOf = r), e + } + function l() { + function e(e, t, n) { + for (var i = !1, s = r, a = Array.isArray(s), o = 0, s = a ? s : d(s); ; ) { + var u + if (a) { + if (o >= s.length) break + u = s[o++] + } else { + if (((o = s.next()), o.done)) break + u = o.value + } + var l = u + if (v.is(l, n)) { + i = !0 + break + } + } + if (!i) + throw new TypeError( + "Property " + + t + + " of " + + e.type + + " expected node to be of a type " + + JSON.stringify(r) + + " but instead got " + + JSON.stringify(n && n.type) + ) + } + for (var t = arguments.length, r = Array(t), n = 0; t > n; n++) + r[n] = arguments[n] + return (e.oneOfNodeTypes = r), e + } + function c() { + function e(e, t, n) { + for (var i = !1, s = r, o = Array.isArray(s), u = 0, s = o ? s : d(s); ; ) { + var l + if (o) { + if (u >= s.length) break + l = s[u++] + } else { + if (((u = s.next()), u.done)) break + l = u.value + } + var c = l + if (a(n) === c || v.is(c, n)) { + i = !0 + break + } + } + if (!i) + throw new TypeError( + "Property " + + t + + " of " + + e.type + + " expected node to be of a type " + + JSON.stringify(r) + + " but instead got " + + JSON.stringify(n && n.type) + ) + } + for (var t = arguments.length, r = Array(t), n = 0; t > n; n++) + r[n] = arguments[n] + return (e.oneOfNodeOrValueTypes = r), e + } + function p(e) { + function t(t, r, n) { + var i = a(n) === e + if (!i) + throw new TypeError( + "Property " + r + " expected type of " + e + " but got " + a(n) + ) + } + return (t.type = e), t + } + function f() { + function e() { + for (var e = r, t = Array.isArray(e), n = 0, e = t ? e : d(e); ; ) { + var i + if (t) { + if (n >= e.length) break + i = e[n++] + } else { + if (((n = e.next()), n.done)) break + i = n.value + } + var s = i + s.apply(void 0, arguments) + } + } + for (var t = arguments.length, r = Array(t), n = 0; t > n; n++) + r[n] = arguments[n] + return (e.chainOf = r), e + } + function h(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? {} : arguments[1], + r = (t.inherits && D[t.inherits]) || {} + ;(t.fields = t.fields || r.fields || {}), + (t.visitor = t.visitor || r.visitor || []), + (t.aliases = t.aliases || r.aliases || []), + (t.builder = t.builder || r.builder || t.visitor || []), + t.deprecatedAlias && (A[t.deprecatedAlias] = e) + for (var n = t.visitor.concat(t.builder), i = 0; i < n.length; i++) { + var s = n[i] + t.fields[s] = t.fields[s] || {} + } + for (var s in t.fields) { + var o = t.fields[s] + void 0 === o["default"] + ? (o["default"] = null) + : o.validate || (o.validate = p(a(o["default"]))) + } + ;(g[e] = t.visitor), + (x[e] = t.builder), + (b[e] = t.fields), + (E[e] = t.aliases), + (D[e] = t) + } + var d = r(n)["default"], + m = r(i)["default"] + ;(t.__esModule = !0), + (t.assertEach = o), + (t.assertOneOf = u), + (t.assertNodeType = l), + (t.assertNodeOrValueType = c), + (t.assertValueType = p), + (t.chain = f), + (t["default"] = h) + var y = r(s), + v = m(y), + g = {} + t.VISITOR_KEYS = g + var E = {} + t.ALIAS_KEYS = E + var b = {} + t.NODE_FIELDS = b + var x = {} + t.BUILDER_KEYS = x + var A = {} + t.DEPRECATED_KEYS = A + var D = {} + }, + function(e, t, r, n, i, s, a, o, u, l) { + "use strict" + r(n), r(i), r(s), r(a), r(o), r(u), r(l) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i), + o = s(a) + o["default"]("JSXAttribute", { + visitor: ["name", "value"], + aliases: ["JSX", "Immutable"], + fields: { + name: { validate: a.assertNodeType("JSXIdentifier", "JSXNamespacedName") }, + value: { + optional: !0, + validate: a.assertNodeType( + "JSXElement", + "StringLiteral", + "JSXExpressionContainer" + ) + } + } + }), + o["default"]("JSXClosingElement", { + visitor: ["name"], + aliases: ["JSX", "Immutable"], + fields: { + name: { + validate: a.assertNodeType("JSXIdentifier", "JSXMemberExpression") + } + } + }), + o["default"]("JSXElement", { + builder: ["openingElement", "closingElement", "children", "selfClosing"], + visitor: ["openingElement", "children", "closingElement"], + aliases: ["JSX", "Immutable", "Expression"], + fields: { + openingElement: { validate: a.assertNodeType("JSXOpeningElement") }, + closingElement: { + optional: !0, + validate: a.assertNodeType("JSXClosingElement") + }, + children: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach( + a.assertNodeType( + "JSXText", + "JSXExpressionContainer", + "JSXElement" + ) + ) + ) + } + } + }), + o["default"]("JSXEmptyExpression", { aliases: ["JSX", "Expression"] }), + o["default"]("JSXExpressionContainer", { + visitor: ["expression"], + aliases: ["JSX", "Immutable"], + fields: { expression: { validate: a.assertNodeType("Expression") } } + }), + o["default"]("JSXIdentifier", { + builder: ["name"], + aliases: ["JSX", "Expression"], + fields: { name: { validate: a.assertValueType("string") } } + }), + o["default"]("JSXMemberExpression", { + visitor: ["object", "property"], + aliases: ["JSX", "Expression"], + fields: { + object: { + validate: a.assertNodeType("JSXMemberExpression", "JSXIdentifier") + }, + property: { validate: a.assertNodeType("JSXIdentifier") } + } + }), + o["default"]("JSXNamespacedName", { + visitor: ["namespace", "name"], + aliases: ["JSX"], + fields: { + namespace: { validate: a.assertNodeType("JSXIdentifier") }, + name: { validate: a.assertNodeType("JSXIdentifier") } + } + }), + o["default"]("JSXOpeningElement", { + builder: ["name", "attributes", "selfClosing"], + visitor: ["name", "attributes"], + aliases: ["JSX", "Immutable"], + fields: { + name: { + validate: a.assertNodeType("JSXIdentifier", "JSXMemberExpression") + }, + selfClosing: { default: !1, validate: a.assertValueType("boolean") }, + attributes: { + validate: a.chain( + a.assertValueType("array"), + a.assertEach( + a.assertNodeType("JSXAttribute", "JSXSpreadAttribute") + ) + ) + } + } + }), + o["default"]("JSXSpreadAttribute", { + visitor: ["argument"], + aliases: ["JSX"], + fields: { argument: { validate: a.assertNodeType("Expression") } } + }), + o["default"]("JSXText", { + aliases: ["JSX"], + builder: ["value"], + fields: { value: { validate: a.assertValueType("string") } } + }) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"], + a = r(i), + o = s(a) + o["default"]("Noop", { visitor: [] }), + o["default"]("ParenthesizedExpression", { + visitor: ["expression"], + aliases: ["Expression", "ExpressionWrapper"], + fields: { expression: { validate: a.assertNodeType("Expression") } } + }) + }, + function(e, t, r, n, i) { + "use strict" + function s(e) { + var t = a(e) + return 1 === t.length ? t[0] : c.unionTypeAnnotation(t) + } + function a(e) { + for (var t = {}, r = {}, n = [], i = [], s = 0; s < e.length; s++) { + var o = e[s] + if (o && !(i.indexOf(o) >= 0)) { + if (c.isAnyTypeAnnotation(o)) return [o] + if (c.isFlowBaseAnnotation(o)) r[o.type] = o + else if (c.isUnionTypeAnnotation(o)) + n.indexOf(o.types) < 0 && ((e = e.concat(o.types)), n.push(o.types)) + else if (c.isGenericTypeAnnotation(o)) { + var u = o.id.name + if (t[u]) { + var l = t[u] + l.typeParameters + ? o.typeParameters && + (l.typeParameters.params = a( + l.typeParameters.params.concat( + o.typeParameters.params + ) + )) + : (l = o.typeParameters) + } else t[u] = o + } else i.push(o) + } + } + for (var p in r) i.push(r[p]) + for (var f in t) i.push(t[f]) + return i + } + function o(e) { + if ("string" === e) return c.stringTypeAnnotation() + if ("number" === e) return c.numberTypeAnnotation() + if ("undefined" === e) return c.voidTypeAnnotation() + if ("boolean" === e) return c.booleanTypeAnnotation() + if ("function" === e) return c.genericTypeAnnotation(c.identifier("Function")) + if ("object" === e) return c.genericTypeAnnotation(c.identifier("Object")) + if ("symbol" === e) return c.genericTypeAnnotation(c.identifier("Symbol")) + throw new Error("Invalid typeof value") + } + var u = r(n)["default"] + ;(t.__esModule = !0), + (t.createUnionTypeAnnotation = s), + (t.removeTypeDuplicates = a), + (t.createTypeAnnotationBasedOnTypeof = o) + var l = r(i), + c = u(l) + }, + function(e, t, r, n, i, s, a, o, u, l, c, p, f, h, d, m, y, v, g, E, b, x) { + "use strict" + function A(e) { + var t = (ue["is" + e] = function(t, r) { + return ue.is(e, t, r) + }) + ue["assert" + e] = function(r, n) { + if (((n = n || {}), !t(r, n))) + throw new Error( + "Expected type " + + JSON.stringify(e) + + " with option " + + JSON.stringify(n) + ) + } + } + function D(e, t, r) { + if (!t) return !1 + var n = C(t.type, e) + return n ? ("undefined" == typeof r ? !0 : ue.shallowEqual(t, r)) : !1 + } + function C(e, t) { + if (e === t) return !0 + var r = ue.FLIPPED_ALIAS_KEYS[t] + if (r) { + if (r[0] === e) return !0 + for (var n = r, i = Array.isArray(n), s = 0, n = i ? n : q(n); ; ) { + var a + if (i) { + if (s >= n.length) break + a = n[s++] + } else { + if (((s = n.next()), s.done)) break + a = s.value + } + var o = a + if (e === o) return !0 + } + } + return !1 + } + function S(e, t, r) { + if (e) { + var n = ue.NODE_FIELDS[e.type] + if (n) { + var i = n[t] + i && i.validate && ((i.optional && null == r) || i.validate(e, t, r)) + } + } + } + function F(e, t) { + for (var r = W(t), n = r, i = 0; i < n.length; i++) { + var s = n[i] + if (e[s] !== t[s]) return !1 + } + return !0 + } + function w(e, t, r) { + return ( + (e.object = ue.memberExpression(e.object, e.property, e.computed)), + (e.property = t), + (e.computed = !!r), + e + ) + } + function _(e, t) { + return (e.object = ue.memberExpression(t, e.object)), e + } + function T(e) { + var t = arguments.length <= 1 || void 0 === arguments[1] ? "body" : arguments[1] + return (e[t] = ue.toBlock(e[t], e)) + } + function P(e) { + var t = {} + for (var r in e) "_" !== r[0] && (t[r] = e[r]) + return t + } + function B(e) { + var t = P(e) + return delete t.loc, t + } + function k(e) { + var t = {} + for (var r in e) + if ("_" !== r[0]) { + var n = e[r] + n && + (n.type + ? (n = ue.cloneDeep(n)) + : Array.isArray(n) && (n = n.map(ue.cloneDeep))), + (t[r] = n) + } + return t + } + function I(e, t) { + var r = e.split(".") + return function(e) { + if (!ue.isMemberExpression(e)) return !1 + for (var n = [e], i = 0; n.length; ) { + var s = n.shift() + if (t && i === r.length) return !0 + if (ue.isIdentifier(s)) { + if (r[i] !== s.name) return !1 + } else { + if (!ue.isStringLiteral(s)) { + if (ue.isMemberExpression(s)) { + if (s.computed && !ue.isStringLiteral(s.property)) return !1 + n.push(s.object), n.push(s.property) + continue + } + return !1 + } + if (r[i] !== s.value) return !1 + } + if (++i > r.length) return !1 + } + return !0 + } + } + function O(e) { + for ( + var t = ue.COMMENT_KEYS, r = Array.isArray(t), n = 0, t = r ? t : q(t); + ; + + ) { + var i + if (r) { + if (n >= t.length) break + i = t[n++] + } else { + if (((n = t.next()), n.done)) break + i = n.value + } + var s = i + delete e[s] + } + return e + } + function M(e, t) { + return R(e, t), L(e, t), N(e, t), e + } + function R(e, t) { + j("trailingComments", e, t) + } + function L(e, t) { + j("leadingComments", e, t) + } + function N(e, t) { + j("innerComments", e, t) + } + function j(e, t, r) { + t && r && (t[e] = ie["default"](Q["default"]([].concat(t[e], r[e])))) + } + function U(e, t) { + if (!e || !t) return e + for (var r = ue.INHERIT_KEYS.optional, n = 0; n < r.length; n++) { + var i = r[n] + null == e[i] && (e[i] = t[i]) + } + for (var i in t) "_" === i[0] && (e[i] = t[i]) + for (var s = ue.INHERIT_KEYS.force, a = 0; a < s.length; a++) { + var i = s[a] + e[i] = t[i] + } + return ue.inheritsComments(e, t), e + } + function V(e) { + if (!G(e)) throw new TypeError("Not a valid node " + (e && e.type)) + } + function G(e) { + return !(!e || !se.VISITOR_KEYS[e.type]) + } + var W = r(n)["default"], + q = r(i)["default"], + H = r(s)["default"], + Y = r(a)["default"], + J = r(o)["default"], + K = r(u)["default"] + ;(t.__esModule = !0), + (t.is = D), + (t.isType = C), + (t.validate = S), + (t.shallowEqual = F), + (t.appendToMemberExpression = w), + (t.prependToMemberExpression = _), + (t.ensureBlock = T), + (t.clone = P), + (t.cloneWithoutLoc = B), + (t.cloneDeep = k), + (t.buildMatchMemberExpression = I), + (t.removeComments = O), + (t.inheritsComments = M), + (t.inheritTrailingComments = R), + (t.inheritLeadingComments = L), + (t.inheritInnerComments = N), + (t.inherits = U), + (t.assertNode = V), + (t.isNode = G) + var X = r(l), + z = H(X), + $ = r(c), + Q = H($), + Z = r(p), + ee = H(Z), + te = r(f), + re = H(te), + ne = r(h), + ie = H(ne) + r(d) + var se = r(m), + ae = r(y), + oe = Y(ae), + ue = t, + le = r(v) + J(t, K(le, J)), + (t.VISITOR_KEYS = se.VISITOR_KEYS), + (t.ALIAS_KEYS = se.ALIAS_KEYS), + (t.NODE_FIELDS = se.NODE_FIELDS), + (t.BUILDER_KEYS = se.BUILDER_KEYS), + (t.DEPRECATED_KEYS = se.DEPRECATED_KEYS), + (t.react = oe) + for (var ce in ue.VISITOR_KEYS) A(ce) + ;(ue.FLIPPED_ALIAS_KEYS = {}), + re["default"](ue.ALIAS_KEYS, function(e, t) { + re["default"](e, function(e) { + var r = (ue.FLIPPED_ALIAS_KEYS[e] = ue.FLIPPED_ALIAS_KEYS[e] || []) + r.push(t) + }) + }), + re["default"](ue.FLIPPED_ALIAS_KEYS, function(e, t) { + ;(ue[t.toUpperCase() + "_TYPES"] = e), A(t) + }) + var pe = W(ue.VISITOR_KEYS) + .concat(W(ue.FLIPPED_ALIAS_KEYS)) + .concat(W(ue.DEPRECATED_KEYS)) + ;(t.TYPES = pe), + re["default"](ue.BUILDER_KEYS, function(e, t) { + function r() { + if (arguments.length > e.length) + throw new Error( + "t." + + t + + ": Too many arguments passed. Received " + + arguments.length + + " but can receive no more than " + + e.length + ) + var r = {} + r.type = t + for (var n = 0, i = e, s = 0; s < i.length; s++) { + var a = i[s], + o = ue.NODE_FIELDS[t][a], + u = arguments[n++] + void 0 === u && (u = ee["default"](o["default"])), (r[a] = u) + } + for (var a in r) S(r, a, r[a]) + return r + } + ;(ue[t] = r), (ue[t[0].toLowerCase() + t.slice(1)] = r) + }) + var fe = function(e) { + var t = function(t) { + return function() { + return ( + console.trace( + "The node type " + e + " has been renamed to " + r + ), + t.apply(this, arguments) + ) + } + }, + r = ue.DEPRECATED_KEYS[e] + ;(ue[e] = ue[e[0].toLowerCase() + e.slice(1)] = t(ue[r])), + (ue["is" + e] = t(ue["is" + r])), + (ue["assert" + e] = t(ue["assert" + r])) + } + for (var ce in ue.DEPRECATED_KEYS) fe(ce) + z["default"](ue), z["default"](ue.VISITOR_KEYS) + var he = r(g) + J(t, K(he, J)) + var de = r(E) + J(t, K(de, J)) + var me = r(b) + J(t, K(me, J)) + var ye = r(x) + J(t, K(ye, J)) + }, + function(e, t, r, n, i) { + "use strict" + function s(e) { + return !!e && /^[a-z]|\-/.test(e) + } + function a(e, t) { + for (var r = e.value.split(/\r\n|\n|\r/), n = 0, i = 0; i < r.length; i++) + r[i].match(/[^ \t]/) && (n = i) + for (var s = "", i = 0; i < r.length; i++) { + var a = r[i], + o = 0 === i, + u = i === r.length - 1, + l = i === n, + p = a.replace(/\t/g, " ") + o || (p = p.replace(/^[ ]+/, "")), + u || (p = p.replace(/[ ]+$/, "")), + p && (l || (p += " "), (s += p)) + } + s && t.push(c.stringLiteral(s)) + } + function o(e) { + for (var t = [], r = 0; r < e.children.length; r++) { + var n = e.children[r] + c.isJSXText(n) + ? a(n, t) + : (c.isJSXExpressionContainer(n) && (n = n.expression), + c.isJSXEmptyExpression(n) || t.push(n)) + } + return t + } + var u = r(n)["default"] + ;(t.__esModule = !0), (t.isCompatTag = s), (t.buildChildren = o) + var l = r(i), + c = u(l), + p = c.buildMatchMemberExpression("React.Component") + t.isReactComponent = p + }, + function(e, t, r, n, i, s) { + "use strict" + function a(e, t, r) { + for (var n = [].concat(e), i = u(null); n.length; ) { + var s = n.shift() + if (s) { + var a = p.getBindingIdentifiers.keys[s.type] + if (p.isIdentifier(s)) + if (t) { + var o = (i[s.name] = i[s.name] || []) + o.push(s) + } else i[s.name] = s + else if (p.isExportDeclaration(s)) + p.isDeclaration(e.declaration) && n.push(e.declaration) + else { + if (r) { + if (p.isFunctionDeclaration(s)) { + n.push(s.id) + continue + } + if (p.isFunctionExpression(s)) continue + } + if (a) + for (var l = 0; l < a.length; l++) { + var c = a[l] + s[c] && (n = n.concat(s[c])) + } + } + } + } + return i + } + function o(e, t) { + return a(e, t, !0) + } + var u = r(n)["default"], + l = r(i)["default"] + ;(t.__esModule = !0), + (t.getBindingIdentifiers = a), + (t.getOuterBindingIdentifiers = o) + var c = r(s), + p = l(c) + a.keys = { + DeclareClass: ["id"], + DeclareFunction: ["id"], + DeclareModule: ["id"], + DeclareVariable: ["id"], + InterfaceDeclaration: ["id"], + TypeAlias: ["id"], + CatchClause: ["param"], + LabeledStatement: ["label"], + UnaryExpression: ["argument"], + AssignmentExpression: ["left"], + ImportSpecifier: ["local"], + ImportNamespaceSpecifier: ["local"], + ImportDefaultSpecifier: ["local"], + ImportDeclaration: ["specifiers"], + ExportSpecifier: ["exported"], + ExportNamespaceSpecifier: ["exported"], + ExportDefaultSpecifier: ["exported"], + FunctionDeclaration: ["id", "params"], + FunctionExpression: ["id", "params"], + ClassDeclaration: ["id"], + ClassExpression: ["id"], + RestElement: ["argument"], + UpdateExpression: ["argument"], + RestProperty: ["argument"], + ObjectProperty: ["value"], + AssignmentPattern: ["left"], + ArrayPattern: ["elements"], + ObjectPattern: ["properties"], + VariableDeclaration: ["declarations"], + VariableDeclarator: ["id"] + } + }, + function(e, t, r, n, i, s, a, o, u) { + "use strict" + function l(e, t) { + var r = b.getBindingIdentifiers.keys[t.type] + if (r) + for (var n = 0; n < r.length; n++) { + var i = r[n], + s = t[i] + if (Array.isArray(s)) { + if (s.indexOf(e) >= 0) return !0 + } else if (s === e) return !0 + } + return !1 + } + function c(e, t) { + switch (t.type) { + case "BindExpression": + return t.object === e || t.callee === e + case "MemberExpression": + case "JSXMemberExpression": + return t.property === e && t.computed ? !0 : t.object === e + case "MetaProperty": + return !1 + case "ObjectProperty": + if (t.key === e) return t.computed + case "VariableDeclarator": + return t.id !== e + case "ArrowFunctionExpression": + case "FunctionDeclaration": + case "FunctionExpression": + for (var r = t.params, n = 0; n < r.length; n++) { + var i = r[n] + if (i === e) return !1 + } + return t.id !== e + case "ExportSpecifier": + return t.source ? !1 : t.local === e + case "ExportNamespaceSpecifier": + case "ExportDefaultSpecifier": + return !1 + case "JSXAttribute": + return t.name !== e + case "ClassProperty": + return t.value === e + case "ImportDefaultSpecifier": + case "ImportNamespaceSpecifier": + case "ImportSpecifier": + return !1 + case "ClassDeclaration": + case "ClassExpression": + return t.id !== e + case "ClassMethod": + case "ObjectMethod": + return t.key === e && t.computed + case "LabeledStatement": + return !1 + case "CatchClause": + return t.param !== e + case "RestElement": + return !1 + case "AssignmentExpression": + return t.right === e + case "AssignmentPattern": + return t.right === e + case "ObjectPattern": + case "ArrayPattern": + return !1 + } + return !0 + } + function p(e) { + return "string" != typeof e || A["default"].keyword.isReservedWordES6(e, !0) + ? !1 + : A["default"].keyword.isIdentifierNameES6(e) + } + function f(e) { + return ( + C.isVariableDeclaration(e) && ("var" !== e.kind || e[S.BLOCK_SCOPED_SYMBOL]) + ) + } + function h(e) { + return C.isFunctionDeclaration(e) || C.isClassDeclaration(e) || C.isLet(e) + } + function d(e) { + return C.isVariableDeclaration(e, { kind: "var" }) && !e[S.BLOCK_SCOPED_SYMBOL] + } + function m(e) { + return ( + C.isImportDefaultSpecifier(e) || + C.isIdentifier(e.imported || e.exported, { name: "default" }) + ) + } + function y(e, t) { + return C.isBlockStatement(e) && C.isFunction(t, { body: e }) + ? !1 + : C.isScopable(e) + } + function v(e) { + return C.isType(e.type, "Immutable") + ? !0 + : C.isIdentifier(e) + ? "undefined" === e.name + : !1 + } + var g = r(n)["default"], + E = r(i)["default"] + ;(t.__esModule = !0), + (t.isBinding = l), + (t.isReferenced = c), + (t.isValidIdentifier = p), + (t.isLet = f), + (t.isBlockScoped = h), + (t.isVar = d), + (t.isSpecifierDefault = m), + (t.isScope = y), + (t.isImmutable = v) + var b = r(s), + x = r(a), + A = g(x), + D = r(o), + C = E(D), + S = r(u) + }, + function(e, t, r, n) { + function i() { + return ( + "WebkitAppearance" in document.documentElement.style || + (window.console && + (console.firebug || (console.exception && console.table))) || + (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && + parseInt(RegExp.$1, 10) >= 31) + ) + } + function s() { + var e = arguments, + r = this.useColors + if ( + ((e[0] = + (r ? "%c" : "") + + this.namespace + + (r ? " %c" : " ") + + e[0] + + (r ? "%c " : " ") + + "+" + + t.humanize(this.diff)), + !r) + ) + return e + var n = "color: " + this.color + e = [e[0], n, "color: inherit"].concat(Array.prototype.slice.call(e, 1)) + var i = 0, + s = 0 + return ( + e[0].replace(/%[a-z%]/g, function(e) { + "%%" !== e && (i++, "%c" === e && (s = i)) + }), + e.splice(s, 0, n), + e + ) + } + function a() { + return ( + "object" == typeof console && + console.log && + Function.prototype.apply.call(console.log, console, arguments) + ) + } + function o(e) { + try { + null == e ? t.storage.removeItem("debug") : (t.storage.debug = e) + } catch (r) {} + } + function u() { + var e + try { + e = t.storage.debug + } catch (r) {} + return e + } + function l() { + try { + return window.localStorage + } catch (e) {} + } + ;(t = e.exports = r(n)), + (t.log = a), + (t.formatArgs = s), + (t.save = o), + (t.load = u), + (t.useColors = i), + (t.storage = + "undefined" != typeof chrome && "undefined" != typeof chrome.storage + ? chrome.storage.local + : l()), + (t.colors = [ + "lightseagreen", + "forestgreen", + "goldenrod", + "dodgerblue", + "darkorchid", + "crimson" + ]), + (t.formatters.j = function(e) { + return JSON.stringify(e) + }), + t.enable(u()) + }, + function(e, t, r, n) { + function i() { + return t.colors[p++ % t.colors.length] + } + function s(e) { + function r() {} + function n() { + var e = n, + r = +new Date(), + s = r - (c || r) + ;(e.diff = s), + (e.prev = c), + (e.curr = r), + (c = r), + null == e.useColors && (e.useColors = t.useColors()), + null == e.color && e.useColors && (e.color = i()) + var a = Array.prototype.slice.call(arguments) + ;(a[0] = t.coerce(a[0])), "string" != typeof a[0] && (a = ["%o"].concat(a)) + var o = 0 + ;(a[0] = a[0].replace(/%([a-z%])/g, function(r, n) { + if ("%%" === r) return r + o++ + var i = t.formatters[n] + if ("function" == typeof i) { + var s = a[o] + ;(r = i.call(e, s)), a.splice(o, 1), o-- + } + return r + })), + "function" == typeof t.formatArgs && (a = t.formatArgs.apply(e, a)) + var u = n.log || t.log || console.log.bind(console) + u.apply(e, a) + } + ;(r.enabled = !1), (n.enabled = !0) + var s = t.enabled(e) ? n : r + return (s.namespace = e), s + } + function a(e) { + t.save(e) + for (var r = (e || "").split(/[\s,]+/), n = r.length, i = 0; n > i; i++) + r[i] && + ((e = r[i].replace(/\*/g, ".*?")), + "-" === e[0] + ? t.skips.push(new RegExp("^" + e.substr(1) + "$")) + : t.names.push(new RegExp("^" + e + "$"))) + } + function o() { + t.enable("") + } + function u(e) { + var r, n + for (r = 0, n = t.skips.length; n > r; r++) if (t.skips[r].test(e)) return !1 + for (r = 0, n = t.names.length; n > r; r++) if (t.names[r].test(e)) return !0 + return !1 + } + function l(e) { + return e instanceof Error ? e.stack || e.message : e + } + ;(t = e.exports = s), + (t.coerce = l), + (t.disable = o), + (t.enable = a), + (t.enabled = u), + (t.humanize = r(n)), + (t.names = []), + (t.skips = []), + (t.formatters = {}) + var c, + p = 0 + }, + function(e, t, r, n, i, s, a) { + function o(e, t, r, n) { + var i = e ? e.length : 0 + return i + ? (null != t && + "boolean" != typeof t && + ((n = r), (r = c(e, t, n) ? void 0 : t), (t = !1)), + (r = null == r ? r : u(r, n, 3)), + t ? p(e, r) : l(e, r)) + : [] + } + var u = r(n), + l = r(i), + c = r(s), + p = r(a) + e.exports = o + }, + function(e, t, r, n) { + e.exports = r(n) + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s), + l = u(a, o) + e.exports = l + }, + function(e, t, r, n, i, s, a, o, u, l) { + function c(e, t, r, n) { + var i = e ? f(e) : 0 + return ( + m(i) || ((e = v(e)), (i = e.length)), + (r = + "number" != typeof r || (n && d(t, r, n)) + ? 0 + : 0 > r + ? g(i + r, 0) + : r || 0), + "string" == typeof e || (!h(e) && y(e)) + ? i >= r && e.indexOf(t, r) > -1 + : !!i && p(e, t, r) > -1 + ) + } + var p = r(n), + f = r(i), + h = r(s), + d = r(a), + m = r(o), + y = r(u), + v = r(l), + g = Math.max + e.exports = c + }, + function(e, t, r, n, i) { + ;(function(t) { + function s(e) { + var t = e ? e.length : 0 + for (this.data = { hash: l(null), set: new u() }; t--; ) this.push(e[t]) + } + var a = r(n), + o = r(i), + u = o(t, "Set"), + l = o(Object, "create") + ;(s.prototype.push = a), (e.exports = s) + }.call( + t, + (function() { + return this + })() + )) + }, + function(e, t, r, n) { + function i(e, t, r) { + for (var n = -1, i = s(t), a = i.length; ++n < a; ) { + var o = i[n], + u = e[o], + l = r(u, t[o], o, e, t) + ;((l === l ? l === u : u !== u) && (void 0 !== u || o in e)) || (e[o] = l) + } + return e + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i) { + function s(e, t) { + return null == t ? e : a(t, o(t), e) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i, s, a, o) { + function u(e, t, r) { + var n = typeof e + return "function" == n + ? void 0 === t + ? e + : p(e, t, r) + : null == e + ? f + : "object" == n + ? l(e) + : void 0 === t + ? h(e) + : c(e, t) + } + var l = r(n), + c = r(i), + p = r(s), + f = r(a), + h = r(o) + e.exports = u + }, + function(e, t, r, n, i, s, a, o, u, l, c, p) { + function f(e, t, r, n, i, s, a) { + var o + if ((r && (o = i ? r(e, n, i) : r(e)), void 0 !== o)) return o + if (!x(e)) return e + var u = b(e) + if (u) { + if (((o = v(e)), !t)) return h(e, o) + } else { + var l = J.call(e), + c = l == w + if (l != P && l != A && (!c || i)) return H[l] ? g(e, l, t) : i ? e : {} + if (((o = E(c ? {} : e)), !t)) return m(o, e) + } + s || (s = []), a || (a = []) + for (var p = s.length; p--; ) if (s[p] == e) return a[p] + return ( + s.push(e), + a.push(o), + (u ? d : y)(e, function(n, i) { + o[i] = f(n, t, r, i, e, s, a) + }), + o + ) + } + var h = r(n), + d = r(i), + m = r(s), + y = r(a), + v = r(o), + g = r(u), + E = r(l), + b = r(c), + x = r(p), + A = "[object Arguments]", + D = "[object Array]", + C = "[object Boolean]", + S = "[object Date]", + F = "[object Error]", + w = "[object Function]", + _ = "[object Map]", + T = "[object Number]", + P = "[object Object]", + B = "[object RegExp]", + k = "[object Set]", + I = "[object String]", + O = "[object WeakMap]", + M = "[object ArrayBuffer]", + R = "[object Float32Array]", + L = "[object Float64Array]", + N = "[object Int8Array]", + j = "[object Int16Array]", + U = "[object Int32Array]", + V = "[object Uint8Array]", + G = "[object Uint8ClampedArray]", + W = "[object Uint16Array]", + q = "[object Uint32Array]", + H = {} + ;(H[A] = H[D] = H[M] = H[C] = H[S] = H[R] = H[L] = H[N] = H[j] = H[U] = H[T] = H[ + P + ] = H[B] = H[I] = H[V] = H[G] = H[W] = H[q] = !0), + (H[F] = H[w] = H[_] = H[k] = H[O] = !1) + var Y = Object.prototype, + J = Y.toString + e.exports = f + }, + function(e, t, r, n, i) { + var s = r(n), + a = r(i), + o = a(s) + e.exports = o + }, + function(e, t, r, n) { + var i = r(n), + s = i() + e.exports = s + }, + function(e, t, r, n, i) { + function s(e, t) { + return a(e, t, o) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i) { + function s(e, t) { + return a(e, t, o) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n) { + function i(e, t, r) { + if (null != e) { + void 0 !== r && r in s(e) && (t = [r]) + for (var n = 0, i = t.length; null != e && i > n; ) e = e[t[n++]] + return n && n == i ? e : void 0 + } + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n) { + function i(e, t, r) { + if (t !== t) return s(e, r) + for (var n = r - 1, i = e.length; ++n < i; ) if (e[n] === t) return n + return -1 + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i, s) { + function a(e, t, r, n, i, s) { + return e === t + ? !0 + : null == e || null == t || (!u(e) && !l(t)) + ? e !== e && t !== t + : o(e, t, a, r, n, i, s) + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i, s, a, o) { + function u(e, t, r, n, i, s, a) { + var o = f(e), + u = f(t), + v = m, + b = m + o || ((v = E.call(e)), v == d ? (v = y) : v != y && (o = h(e))), + u || ((b = E.call(t)), b == d ? (b = y) : b != y && (u = h(t))) + var x = v == y, + A = b == y, + D = v == b + if (D && !o && !x) return c(e, t, v) + if (!i) { + var C = x && g.call(e, "__wrapped__"), + S = A && g.call(t, "__wrapped__") + if (C || S) return r(C ? e.value() : e, S ? t.value() : t, n, i, s, a) + } + if (!D) return !1 + s || (s = []), a || (a = []) + for (var F = s.length; F--; ) if (s[F] == e) return a[F] == t + s.push(e), a.push(t) + var w = (o ? l : p)(e, t, r, n, i, s, a) + return s.pop(), a.pop(), w + } + var l = r(n), + c = r(i), + p = r(s), + f = r(a), + h = r(o), + d = "[object Arguments]", + m = "[object Array]", + y = "[object Object]", + v = Object.prototype, + g = v.hasOwnProperty, + E = v.toString + e.exports = u + }, + function(e, t, r, n, i) { + function s(e, t, r) { + var n = t.length, + i = n, + s = !r + if (null == e) return !i + for (e = o(e); n--; ) { + var u = t[n] + if (s && u[2] ? u[1] !== e[u[0]] : !(u[0] in e)) return !1 + } + for (; ++n < i; ) { + u = t[n] + var l = u[0], + c = e[l], + p = u[1] + if (s && u[2]) { + if (void 0 === c && !(l in e)) return !1 + } else { + var f = r ? r(c, p, l) : void 0 + if (!(void 0 === f ? a(p, c, r, !0) : f)) return !1 + } + } + return !0 + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i, s) { + function a(e) { + var t = u(e) + if (1 == t.length && t[0][2]) { + var r = t[0][0], + n = t[0][1] + return function(e) { + return null == e ? !1 : e[r] === n && (void 0 !== n || r in l(e)) + } + } + return function(e) { + return o(e, t) + } + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i, s, a, o, u, l, c, p) { + function f(e, t) { + var r = y(e), + n = v(e) && g(t), + i = e + "" + return ( + (e = x(e)), + function(s) { + if (null == s) return !1 + var a = i + if (((s = b(s)), (r || !n) && !(a in s))) { + if (((s = 1 == e.length ? s : h(s, m(e, 0, -1))), null == s)) + return !1 + ;(a = E(e)), (s = b(s)) + } + return s[a] === t ? void 0 !== t || a in s : d(t, s[a], void 0, !0) + } + ) + } + var h = r(n), + d = r(i), + m = r(s), + y = r(a), + v = r(o), + g = r(u), + E = r(l), + b = r(c), + x = r(p) + e.exports = f + }, + function(e, t, r, n, i) { + function s(e) { + var t = e + "" + return ( + (e = o(e)), + function(r) { + return a(r, e, t) + } + ) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i, s) { + function a(e, t) { + var r = -1, + n = o, + i = e.length, + s = !0, + a = s && i >= c, + p = a ? l() : null, + f = [] + p ? ((n = u), (s = !1)) : ((a = !1), (p = t ? [] : f)) + e: for (; ++r < i; ) { + var h = e[r], + d = t ? t(h, r, e) : h + if (s && h === h) { + for (var m = p.length; m--; ) if (p[m] === d) continue e + t && p.push(d), f.push(h) + } else n(p, d, 0) < 0 && ((t || a) && p.push(d), f.push(h)) + } + return f + } + var o = r(n), + u = r(i), + l = r(s), + c = 200 + e.exports = a + }, + function(e, t, r, n) { + function i(e, t, r) { + if ("function" != typeof e) return s + if (void 0 === t) return e + switch (r) { + case 1: + return function(r) { + return e.call(t, r) + } + case 3: + return function(r, n, i) { + return e.call(t, r, n, i) + } + case 4: + return function(r, n, i, s) { + return e.call(t, r, n, i, s) + } + case 5: + return function(r, n, i, s, a) { + return e.call(t, r, n, i, s, a) + } + } + return function() { + return e.apply(t, arguments) + } + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n) { + function i(e, t) { + var r = e.data, + n = "string" == typeof t || s(t) ? r.set.has(t) : r.hash[t] + return n ? 0 : -1 + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n) { + function i(e) { + var t = this.data + "string" == typeof e || s(e) ? t.set.add(e) : (t.hash[e] = !0) + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i, s) { + function a(e) { + return l(function(t, r) { + var n = -1, + i = null == t ? 0 : r.length, + s = i > 2 ? r[i - 2] : void 0, + a = i > 2 ? r[2] : void 0, + l = i > 1 ? r[i - 1] : void 0 + for ( + "function" == typeof s + ? ((s = o(s, l, 5)), (i -= 2)) + : ((s = "function" == typeof l ? l : void 0), (i -= s ? 1 : 0)), + a && u(r[0], r[1], a) && ((s = 3 > i ? void 0 : s), (i = 1)); + ++n < i; + + ) { + var c = r[n] + c && e(t, c, s) + } + return t + }) + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i, s) { + function a(e, t) { + return function(r, n) { + var i = r ? o(r) : 0 + if (!u(i)) return e(r, n) + for ( + var s = t ? i : -1, a = l(r); + (t ? s-- : ++s < i) && n(a[s], s, a) !== !1; + + ); + return r + } + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n) { + function i(e) { + return function(t, r, n) { + for ( + var i = s(t), a = n(t), o = a.length, u = e ? o : -1; + e ? u-- : ++u < o; + + ) { + var l = a[u] + if (r(i[l], l, i) === !1) break + } + return t + } + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i) { + ;(function(t) { + function s(e) { + return l && u ? new a(e) : null + } + var a = r(n), + o = r(i), + u = o(t, "Set"), + l = o(Object, "create") + e.exports = s + }.call( + t, + (function() { + return this + })() + )) + }, + function(e, t, r, n) { + function i(e, t) { + return s(function(r) { + var n = r[0] + return null == n ? n : (r.push(t), e.apply(void 0, r)) + }) + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i) { + function s(e, t) { + return function(r, n, i) { + return "function" == typeof n && void 0 === i && o(r) + ? e(r, n) + : t(r, a(n, i, 3)) + } + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n) { + function i(e, t, r, n, i, a, o) { + var u = -1, + l = e.length, + c = t.length + if (l != c && !(i && c > l)) return !1 + for (; ++u < l; ) { + var p = e[u], + f = t[u], + h = n ? n(i ? f : p, i ? p : f, u) : void 0 + if (void 0 !== h) { + if (h) continue + return !1 + } + if (i) { + if ( + !s(t, function(e) { + return p === e || r(p, e, n, i, a, o) + }) + ) + return !1 + } else if (p !== f && !r(p, f, n, i, a, o)) return !1 + } + return !0 + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n) { + function i(e, t, r, n, i, a, u) { + var l = s(e), + c = l.length, + p = s(t), + f = p.length + if (c != f && !i) return !1 + for (var h = c; h--; ) { + var d = l[h] + if (!(i ? d in t : o.call(t, d))) return !1 + } + for (var m = i; ++h < c; ) { + d = l[h] + var y = e[d], + v = t[d], + g = n ? n(i ? v : y, i ? y : v, d) : void 0 + if (!(void 0 === g ? r(y, v, n, i, a, u) : g)) return !1 + m || (m = "constructor" == d) + } + if (!m) { + var E = e.constructor, + b = t.constructor + if ( + E != b && + "constructor" in e && + "constructor" in t && + !( + "function" == typeof E && + E instanceof E && + "function" == typeof b && + b instanceof b + ) + ) + return !1 + } + return !0 + } + var s = r(n), + a = Object.prototype, + o = a.hasOwnProperty + e.exports = i + }, + function(e, t, r, n) { + var i = r(n), + s = i("length") + e.exports = s + }, + function(e, t, r, n, i) { + function s(e) { + for (var t = o(e), r = t.length; r--; ) t[r][2] = a(t[r][1]) + return t + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n) { + function i(e, t) { + var r = null == e ? void 0 : e[t] + return s(r) ? r : void 0 + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n) { + function i(e, t, r) { + var n = e.constructor + switch (t) { + case p: + return s(e) + case a: + case o: + return new n(+e) + case f: + case h: + case d: + case m: + case y: + case v: + case g: + case E: + case b: + var i = e.buffer + return new n(r ? s(i) : i, e.byteOffset, e.length) + case u: + case c: + return new n(e) + case l: + var A = new n(e.source, x.exec(e)) + A.lastIndex = e.lastIndex + } + return A + } + var s = r(n), + a = "[object Boolean]", + o = "[object Date]", + u = "[object Number]", + l = "[object RegExp]", + c = "[object String]", + p = "[object ArrayBuffer]", + f = "[object Float32Array]", + h = "[object Float64Array]", + d = "[object Int8Array]", + m = "[object Int16Array]", + y = "[object Int32Array]", + v = "[object Uint8Array]", + g = "[object Uint8ClampedArray]", + E = "[object Uint16Array]", + b = "[object Uint32Array]", + x = /\w*$/ + e.exports = i + }, + function(e, t, r, n, i) { + function s(e) { + return null != e && o(a(e)) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i, s) { + function a(e, t, r) { + if (!l(r)) return !1 + var n = typeof t + if ("number" == n ? o(r) && u(t, r.length) : "string" == n && t in r) { + var i = r[t] + return e === e ? e === i : i !== i + } + return !1 + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i) { + function s(e, t) { + var r = typeof e + if (("string" == r && l.test(e)) || "number" == r) return !0 + if (a(e)) return !1 + var n = !u.test(e) + return n || (null != t && e in o(t)) + } + var a = r(n), + o = r(i), + u = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + l = /^\w*$/ + e.exports = s + }, + function(e, t, r, n) { + function i(e) { + return e === e && !s(e) + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i, s, a, o) { + function u(e) { + for ( + var t = h(e), + r = t.length, + n = r && e.length, + i = !!n && f(n) && (c(e) || l(e)), + s = -1, + a = []; + ++s < r; + + ) { + var o = t[s] + ;((i && p(o, n)) || m.call(e, o)) && a.push(o) + } + return a + } + var l = r(n), + c = r(i), + p = r(s), + f = r(a), + h = r(o), + d = Object.prototype, + m = d.hasOwnProperty + e.exports = u + }, + function(e, t, r, n) { + function i(e) { + return s(e) ? e : Object(e) + } + var s = r(n) + e.exports = i + }, + function(e, t, r, n, i) { + function s(e) { + if (o(e)) return e + var t = [] + return ( + a(e).replace(u, function(e, r, n, i) { + t.push(n ? i.replace(l, "$1") : r || e) + }), + t + ) + } + var a = r(n), + o = r(i), + u = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g, + l = /\\(\\)?/g + e.exports = s + }, + function(e, t, r, n, i, s) { + function a(e, t, r, n) { + return ( + t && "boolean" != typeof t && l(e, t, r) + ? (t = !1) + : "function" == typeof t && ((n = r), (r = t), (t = !1)), + "function" == typeof r ? o(e, t, u(r, n, 3)) : o(e, t) + ) + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i) { + function s(e, t, r) { + return "function" == typeof t ? a(e, !0, o(t, r, 3)) : a(e, !0) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i) { + function s(e) { + return o(e) && a(e) && l.call(e, "callee") && !c.call(e, "callee") + } + var a = r(n), + o = r(i), + u = Object.prototype, + l = u.hasOwnProperty, + c = u.propertyIsEnumerable + e.exports = s + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s), + l = "[object Array]", + c = Object.prototype, + p = c.toString, + f = a(Array, "isArray"), + h = + f || + function(e) { + return u(e) && o(e.length) && p.call(e) == l + } + e.exports = h + }, + function(e, t, r, n) { + function i(e) { + return s(e) && u.call(e) == a + } + var s = r(n), + a = "[object Function]", + o = Object.prototype, + u = o.toString + e.exports = i + }, + function(e, t, r, n, i) { + function s(e) { + return null == e ? !1 : a(e) ? f.test(c.call(e)) : o(e) && u.test(e) + } + var a = r(n), + o = r(i), + u = /^\[object .+?Constructor\]$/, + l = Object.prototype, + c = Function.prototype.toString, + p = l.hasOwnProperty, + f = RegExp( + "^" + + c + .call(p) + .replace(/[\\^$.*+?()[\]{}|]/g, "\\$&") + .replace( + /hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, + "$1.*?" + ) + + "$" + ) + e.exports = s + }, + function(e, t, r, n) { + function i(e) { + return "number" == typeof e || (s(e) && u.call(e) == a) + } + var s = r(n), + a = "[object Number]", + o = Object.prototype, + u = o.toString + e.exports = i + }, + function(e, t, r, n, i, s) { + function a(e) { + var t + if ( + !l(e) || + h.call(e) != c || + u(e) || + (!f.call(e, "constructor") && + ((t = e.constructor), "function" == typeof t && !(t instanceof t))) + ) + return !1 + var r + return ( + o(e, function(e, t) { + r = t + }), + void 0 === r || f.call(e, r) + ) + } + var o = r(n), + u = r(i), + l = r(s), + c = "[object Object]", + p = Object.prototype, + f = p.hasOwnProperty, + h = p.toString + e.exports = a + }, + function(e, t, r, n) { + function i(e) { + return s(e) && u.call(e) == a + } + var s = r(n), + a = "[object RegExp]", + o = Object.prototype, + u = o.toString + e.exports = i + }, + function(e, t, r, n) { + function i(e) { + return "string" == typeof e || (s(e) && u.call(e) == a) + } + var s = r(n), + a = "[object String]", + o = Object.prototype, + u = o.toString + e.exports = i + }, + function(e, t, r, n, i) { + function s(e) { + return o(e) && a(e.length) && !!B[I.call(e)] + } + var a = r(n), + o = r(i), + u = "[object Arguments]", + l = "[object Array]", + c = "[object Boolean]", + p = "[object Date]", + f = "[object Error]", + h = "[object Function]", + d = "[object Map]", + m = "[object Number]", + y = "[object Object]", + v = "[object RegExp]", + g = "[object Set]", + E = "[object String]", + b = "[object WeakMap]", + x = "[object ArrayBuffer]", + A = "[object Float32Array]", + D = "[object Float64Array]", + C = "[object Int8Array]", + S = "[object Int16Array]", + F = "[object Int32Array]", + w = "[object Uint8Array]", + _ = "[object Uint8ClampedArray]", + T = "[object Uint16Array]", + P = "[object Uint32Array]", + B = {} + ;(B[A] = B[D] = B[C] = B[S] = B[F] = B[w] = B[_] = B[T] = B[P] = !0), + (B[u] = B[l] = B[x] = B[c] = B[p] = B[f] = B[h] = B[d] = B[m] = B[y] = B[v] = B[ + g + ] = B[E] = B[b] = !1) + var k = Object.prototype, + I = k.toString + e.exports = s + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s), + l = u(function(e, t, r) { + return r ? a(e, t, r) : o(e, t) + }) + e.exports = l + }, + function(e, t, r, n, i, s) { + var a = r(n), + o = r(i), + u = r(s), + l = u(a, o) + e.exports = l + }, + function(e, t, r, n, i, s, a, o, u, l, c, p) { + function f(e, t) { + if (null == e) return !1 + var r = D.call(e, t) + if (!r && !g(t)) { + if (((t = x(t)), (e = 1 == t.length ? e : h(e, d(t, 0, -1))), null == e)) + return !1 + ;(t = b(t)), (r = D.call(e, t)) + } + return r || (E(e.length) && v(t, e.length) && (y(e) || m(e))) + } + var h = r(n), + d = r(i), + m = r(s), + y = r(a), + v = r(o), + g = r(u), + E = r(l), + b = r(c), + x = r(p), + A = Object.prototype, + D = A.hasOwnProperty + e.exports = f + }, + function(e, t, r, n, i, s, a) { + var o = r(n), + u = r(i), + l = r(s), + c = r(a), + p = o(Object, "keys"), + f = p + ? function(e) { + var t = null == e ? void 0 : e.constructor + return ("function" == typeof t && t.prototype === e) || + ("function" != typeof e && u(e)) + ? c(e) + : l(e) + ? p(e) + : [] + } + : c + e.exports = f + }, + function(e, t, r, n, i, s, a, o) { + function u(e) { + if (null == e) return [] + h(e) || (e = Object(e)) + var t = e.length + t = (t && f(t) && (c(e) || l(e)) && t) || 0 + for ( + var r = e.constructor, + n = -1, + i = "function" == typeof r && r.prototype === e, + s = Array(t), + a = t > 0; + ++n < t; + + ) + s[n] = n + "" + for (var o in e) + (a && p(o, t)) || ("constructor" == o && (i || !m.call(e, o))) || s.push(o) + return s + } + var l = r(n), + c = r(i), + p = r(s), + f = r(a), + h = r(o), + d = Object.prototype, + m = d.hasOwnProperty + e.exports = u + }, + function(e, t, r, n, i) { + function s(e) { + e = o(e) + for (var t = -1, r = a(e), n = r.length, i = Array(n); ++t < n; ) { + var s = r[t] + i[t] = [s, e[s]] + } + return i + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i) { + function s(e) { + return a(e, o(e)) + } + var a = r(n), + o = r(i) + e.exports = s + }, + function(e, t, r, n, i, s) { + function a(e) { + return l(e) ? o(e) : u(e) + } + var o = r(n), + u = r(i), + l = r(s) + e.exports = a + }, + function(e, t, r, n, i, s, a, o, u) { + "use strict" + function l(e, t) { + var r = e.node, + n = r.body + r.async = !1 + var i = E.functionExpression(null, [], E.blockStatement(n.body), !0) + ;(i.shadow = !0), + (n.body = [ + E.returnStatement(E.callExpression(E.callExpression(t, [i]), [])) + ]) + } + function c(e, t) { + var r = e.node, + n = b + e.isArrowFunctionExpression() && (e.arrowFunctionToShadowed(), (n = x)), + (r.async = !1), + (r.generator = !0), + r.shadow && (r.shadow = p({}, r.shadow, { arguments: !1 })) + var i = r.id + r.id = null + var s = e.isFunctionDeclaration() + s && (r.type = "FunctionExpression") + var a = E.callExpression(t, [r]), + o = n({ + FUNCTION: a, + PARAMS: r.params.map(function() { + return e.scope.generateUidIdentifier("x") + }) + }).expression, + u = o.body.body[1].argument + if (s) { + var l = E.variableDeclaration("let", [ + E.variableDeclarator(E.identifier(i.name), E.callExpression(o, [])) + ]) + ;(l._blockHoist = !0), (u.id = i), e.replaceWith(l) + } else + i && i.name + ? (u.id = i) + : m["default"]({ node: u, parent: e.parent, scope: e.scope }), + u.id || r.params.length + ? e.replaceWith(E.callExpression(o, [])) + : e.replaceWith(a) + } + var p = r(n)["default"], + f = r(i)["default"], + h = r(s)["default"] + t.__esModule = !0 + var d = r(a), + m = f(d), + y = r(o), + v = f(y), + g = r(u), + E = h(g), + b = v["default"]( + "\n (function () {\n var ref = FUNCTION;\n return function (PARAMS) {\n return ref.apply(this, arguments);\n };\n })\n" + ), + x = v["default"]( + "\n (() => {\n var ref = FUNCTION, _this = this;\n return function(PARAMS) {\n return ref.apply(_this, arguments);\n };\n })\n" + ), + A = { + ArrowFunctionExpression: function(e) { + e.node.async || e.arrowFunctionToShadowed() + }, + AwaitExpression: function(e) { + var t = e.node + t.type = "YieldExpression" + } + } + ;(t["default"] = function(e, t) { + var r = e.node + if (!r.generator) + return ( + e.traverse(A), + e.isClassMethod() || e.isObjectMethod() ? l(e, t) : c(e, t) + ) + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o) { + "use strict" + function u(e, t, r, n) { + if (e.selfReference) { + if (!n.hasBinding(r.name) || n.hasGlobal(r.name)) { + if (!v.isFunction(t)) return + var i = g + t.generator && (i = E) + var s = i({ + FUNCTION: t, + FUNCTION_ID: r, + FUNCTION_KEY: n.generateUidIdentifier(r.name) + }).expression + s.callee._skipModulesRemap = !0 + for ( + var a = s.callee.body.body[0].params, o = 0, u = h["default"](t); + u > o; + o++ + ) + a.push(n.generateUidIdentifier("x")) + return s + } + n.rename(r.name) + } + ;(t.id = r), (n.getProgramParent().references[r.name] = !0) + } + function l(e, t, r) { + var n = { + selfAssignment: !1, + selfReference: !1, + outerDeclar: r.getBindingIdentifier(t), + references: [], + name: t + }, + i = r.getOwnBinding(t) + return ( + i + ? "param" === i.kind && (n.selfReference = !0) + : (n.outerDeclar || r.hasGlobal(t)) && r.traverse(e, b, n), + n + ) + } + var c = r(n)["default"], + p = r(i)["default"] + t.__esModule = !0 + var f = r(s), + h = c(f), + d = r(a), + m = c(d), + y = r(o), + v = p(y), + g = m["default"]( + "\n (function (FUNCTION_KEY) {\n function FUNCTION_ID() {\n return FUNCTION_KEY.apply(this, arguments);\n }\n\n FUNCTION_ID.toString = function () {\n return FUNCTION_KEY.toString();\n }\n\n return FUNCTION_ID;\n })(FUNCTION)\n" + ), + E = m["default"]( + "\n (function (FUNCTION_KEY) {\n function* FUNCTION_ID() {\n return yield* FUNCTION_KEY.apply(this, arguments);\n }\n\n FUNCTION_ID.toString = function () {\n return FUNCTION_KEY.toString();\n };\n\n return FUNCTION_ID;\n })(FUNCTION)\n" + ), + b = { + "ReferencedIdentifier|BindingIdentifier": function(e, t) { + if (e.node.name === t.name) { + var r = e.scope.getBindingIdentifier(t.name) + r === t.outerDeclar && ((t.selfReference = !0), e.stop()) + } + } + } + ;(t["default"] = function(e) { + var t = e.node, + r = e.parent, + n = e.scope, + i = e.id + if (!t.id) { + if ( + (!v.isObjectProperty(r) && !v.isObjectMethod(r, { kind: "method" })) || + (r.computed && !v.isLiteral(r.key)) + ) { + if (v.isVariableDeclarator(r)) { + if (((i = r.id), v.isIdentifier(i))) { + var s = n.parent.getBinding(i.name) + if (s && s.constant && n.getBinding(i.name) === s) + return (t.id = i), void (t.id[v.NOT_LOCAL_BINDING] = !0) + } + } else if (v.isAssignmentExpression(r)) i = r.left + else if (!i) return + } else i = r.key + var a = void 0 + if (i && v.isLiteral(i)) a = i.value + else { + if (!i || !v.isIdentifier(i)) return + a = i.name + } + ;(a = v.toBindingIdentifierName(a)), + (i = v.identifier(a)), + (i[v.NOT_LOCAL_BINDING] = !0) + var o = l(t, a, n) + return u(o, t, i, n) || t + } + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"] + t.__esModule = !0 + var a = r(i), + o = s(a) + ;(t["default"] = function(e) { + for (var t = e.params, r = 0; r < t.length; r++) { + var n = t[r] + if (o.isAssignmentPattern(n) || o.isRestElement(n)) return r + } + return t.length + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o, u) { + "use strict" + function l(e) { + return (!C.isClassMethod(e) && !C.isObjectMethod(e)) || + ("get" !== e.kind && "set" !== e.kind) + ? "value" + : e.kind + } + function c(e, t, r, n, i) { + var s = C.toKeyAlias(t), + a = {} + if ( + (A["default"](e, s) && (a = e[s]), + (e[s] = a), + (a._inherits = a._inherits || []), + a._inherits.push(t), + (a._key = t.key), + t.computed && (a._computed = !0), + t.decorators) + ) { + var o = (a.decorators = a.decorators || C.arrayExpression([])) + o.elements = o.elements.concat( + t.decorators + .map(function(e) { + return e.expression + }) + .reverse() + ) + } + if (a.value || a.initializer) + throw n.buildCodeFrameError(t, "Key conflict with sibling node") + var u = void 0, + c = void 0 + ;(C.isObjectProperty(t) || C.isObjectMethod(t) || C.isClassMethod(t)) && + (u = C.toComputedKey(t, t.key)), + C.isObjectProperty(t) || C.isClassProperty(t) + ? (c = t.value) + : (C.isObjectMethod(t) || C.isClassMethod(t)) && + (c = C.functionExpression( + null, + t.params, + t.body, + t.generator, + t.async + )) + var p = l(t) + return ( + (r && "value" === p) || (r = p), + i && + C.isStringLiteral(u) && + ("value" === r || "initializer" === r) && + C.isFunctionExpression(c) && + (c = g["default"]({ id: u, node: c, scope: i })), + c && (C.inheritsComments(c, t), (a[r] = c)), + a + ) + } + function p(e) { + for (var t in e) if (e[t]._computed) return !0 + return !1 + } + function f(e) { + for (var t = C.arrayExpression([]), r = 0; r < e.properties.length; r++) { + var n = e.properties[r], + i = n.value + i.properties.unshift( + C.objectProperty(C.identifier("key"), C.toComputedKey(n)) + ), + t.elements.push(i) + } + return t + } + function h(e) { + var t = C.objectExpression([]) + return ( + b["default"](e, function(e) { + var r = C.objectExpression([]), + n = C.objectProperty(e._key, r, e._computed) + b["default"](e, function(e, t) { + if ("_" !== t[0]) { + var n = e + ;(C.isClassMethod(e) || C.isClassProperty(e)) && (e = e.value) + var i = C.objectProperty(C.identifier(t), e) + C.inheritsComments(i, n), + C.removeComments(n), + r.properties.push(i) + } + }), + t.properties.push(n) + }), + t + ) + } + function d(e) { + return ( + b["default"](e, function(e) { + e.value && (e.writable = C.booleanLiteral(!0)), + (e.configurable = C.booleanLiteral(!0)), + (e.enumerable = C.booleanLiteral(!0)) + }), + h(e) + ) + } + var m = r(n)["default"], + y = r(i)["default"] + ;(t.__esModule = !0), + (t.push = c), + (t.hasComputed = p), + (t.toComputedObjectFromClass = f), + (t.toClassObject = h), + (t.toDefineObject = d) + var v = r(s), + g = m(v), + E = r(a), + b = m(E), + x = r(o), + A = m(x), + D = r(u), + C = y(D) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"] + t.__esModule = !0 + var a = r(i), + o = s(a) + ;(t["default"] = function(e, t, r) { + return 1 === r.length && + o.isSpreadElement(r[0]) && + o.isIdentifier(r[0].argument, { name: "arguments" }) + ? o.callExpression(o.memberExpression(e, o.identifier("apply")), [ + t, + r[0].argument + ]) + : o.callExpression( + o.memberExpression(e, o.identifier("call")), + [t].concat(r) + ) + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a, o, u, l) { + "use strict" + function c(e, t) { + return x.isSuper(e) + ? x.isMemberExpression(t, { computed: !1 }) + ? !1 + : !x.isCallExpression(t, { callee: e }) + : !1 + } + function p(e) { + return x.isMemberExpression(e) && x.isSuper(e.object) + } + var f = r(n)["default"], + h = r(i)["default"], + d = r(s)["default"], + m = r(a)["default"] + t.__esModule = !0 + var y = r(o), + v = d(y), + g = r(u), + E = m(g), + b = r(l), + x = m(b), + A = h(), + D = { + "ObjectMethod|ClassMethod": function(e) { + e.skip() + }, + "FunctionDeclaration|FunctionExpression": function(e) { + e.inShadow("this") || e.skip() + }, + ReturnStatement: function(e, t) { + e.inShadow("this") || t.returns.push(e) + }, + ThisExpression: function(e, t) { + e.node[A] || t.thises.push(e) + }, + enter: function(e, t) { + var r = t.specHandle + t.isLoose && (r = t.looseHandle) + var n = e.isCallExpression() && e.get("callee").isSuper(), + i = r.call(t, e) + i && (t.hasSuper = !0), + n && t.bareSupers.push(e), + i === !0 && e.requeue(), + i !== !0 && + i && + (Array.isArray(i) ? e.replaceWithMultiple(i) : e.replaceWith(i)) + } + }, + C = (function() { + function e(t) { + var r = + arguments.length <= 1 || void 0 === arguments[1] ? !1 : arguments[1] + f(this, e), + (this.forceSuperMemoisation = t.forceSuperMemoisation), + (this.methodPath = t.methodPath), + (this.methodNode = t.methodNode), + (this.superRef = t.superRef), + (this.isStatic = t.isStatic), + (this.hasSuper = !1), + (this.inClass = r), + (this.isLoose = t.isLoose), + (this.scope = this.methodPath.scope), + (this.file = t.file), + (this.opts = t), + (this.bareSupers = []), + (this.returns = []), + (this.thises = []) + } + return ( + (e.prototype.getObjectRef = function() { + return this.opts.objectRef || this.opts.getObjectRef() + }), + (e.prototype.setSuperProperty = function(e, t, r) { + return x.callExpression(this.file.addHelper("set"), [ + x.callExpression( + x.memberExpression( + x.identifier("Object"), + x.identifier("getPrototypeOf") + ), + [ + this.isStatic + ? this.getObjectRef() + : x.memberExpression( + this.getObjectRef(), + x.identifier("prototype") + ) + ] + ), + r ? e : x.stringLiteral(e.name), + t, + x.thisExpression() + ]) + }), + (e.prototype.getSuperProperty = function(e, t) { + return x.callExpression(this.file.addHelper("get"), [ + x.callExpression( + x.memberExpression( + x.identifier("Object"), + x.identifier("getPrototypeOf") + ), + [ + this.isStatic + ? this.getObjectRef() + : x.memberExpression( + this.getObjectRef(), + x.identifier("prototype") + ) + ] + ), + t ? e : x.stringLiteral(e.name), + x.thisExpression() + ]) + }), + (e.prototype.replace = function() { + this.methodPath.traverse(D, this) + }), + (e.prototype.getLooseSuperProperty = function(e, t) { + var r = this.methodNode, + n = this.superRef || x.identifier("Function") + return t.property === e + ? void 0 + : x.isCallExpression(t, { callee: e }) + ? void 0 + : x.isMemberExpression(t) && !r["static"] + ? x.memberExpression(n, x.identifier("prototype")) + : n + }), + (e.prototype.looseHandle = function(e) { + var t = e.node + if (e.isSuper()) return this.getLooseSuperProperty(t, e.parent) + if (e.isCallExpression()) { + var r = t.callee + if (!x.isMemberExpression(r)) return + if (!x.isSuper(r.object)) return + return ( + x.appendToMemberExpression(r, x.identifier("call")), + t.arguments.unshift(x.thisExpression()), + !0 + ) + } + }), + (e.prototype.specHandleAssignmentExpression = function(e, t, r) { + return "=" === r.operator + ? this.setSuperProperty( + r.left.property, + r.right, + r.left.computed + ) + : ((e = e || t.scope.generateUidIdentifier("ref")), + [ + x.variableDeclaration("var", [ + x.variableDeclarator(e, r.left) + ]), + x.expressionStatement( + x.assignmentExpression( + "=", + r.left, + x.binaryExpression(r.operator[0], e, r.right) + ) + ) + ]) + }), + (e.prototype.specHandle = function(e) { + var t = void 0, + r = void 0, + n = void 0, + i = void 0, + s = e.parent, + a = e.node + if (c(a, s)) + throw e.buildCodeFrameError(E.get("classesIllegalBareSuper")) + if (x.isCallExpression(a)) { + var o = a.callee + if (x.isSuper(o)) return + p(o) && ((t = o.property), (r = o.computed), (n = a.arguments)) + } else if (x.isMemberExpression(a) && x.isSuper(a.object)) + (t = a.property), (r = a.computed) + else { + if (x.isUpdateExpression(a) && p(a.argument)) { + var u = x.binaryExpression( + a.operator[0], + a.argument, + x.numericLiteral(1) + ) + if (a.prefix) + return this.specHandleAssignmentExpression(null, e, u) + var l = e.scope.generateUidIdentifier("ref") + return this.specHandleAssignmentExpression(l, e, u).concat( + x.expressionStatement(l) + ) + } + if (x.isAssignmentExpression(a) && p(a.left)) + return this.specHandleAssignmentExpression(null, e, a) + } + if (t) { + var f = this.getSuperProperty(t, r, i) + return n ? this.optimiseCall(f, n) : f + } + }), + (e.prototype.optimiseCall = function(e, t) { + var r = x.thisExpression() + return (r[A] = !0), v["default"](e, r, t) + }), + e + ) + })() + ;(t["default"] = C), (e.exports = t["default"]) + }, + function(e, t, r, n, i) { + "use strict" + var s = r(n)["default"] + t.__esModule = !0 + var a = r(i), + o = s(a), + u = { + Scope: function(e, t) { + "let" === t.kind && e.skip() + }, + Function: function(e) { + e.skip() + }, + VariableDeclaration: function(e, t) { + if (!t.kind || e.node.kind === t.kind) { + for ( + var r = [], n = e.get("declarations"), i = void 0, s = 0; + s < n.length; + s++ + ) { + var a = n[s] + ;(i = a.node.id), + a.node.init && + r.push( + o.expressionStatement( + o.assignmentExpression( + "=", + a.node.id, + a.node.init + ) + ) + ) + for (var u in a.getBindingIdentifiers()) + t.emit(o.identifier(u), u) + } + e.parentPath.isFor({ left: e.node }) + ? e.replaceWith(i) + : e.replaceWithMultiple(r) + } + } + } + ;(t["default"] = function(e, t) { + var r = arguments.length <= 2 || void 0 === arguments[2] ? "var" : arguments[2] + e.traverse(u, { kind: r, emit: t }) + }), + (e.exports = t["default"]) + }, + function(e, t, r, n, i, s, a) { + "use strict" + function o(e, t) { + return d.isRegExpLiteral(e) && e.flags.indexOf(t) >= 0 + } + function u(e, t) { + var r = e.flags.split("") + e.flags.indexOf(t) < 0 || (f["default"](r, t), (e.flags = r.join(""))) + } + var l = r(n)["default"], + c = r(i)["default"] + ;(t.__esModule = !0), (t.is = o), (t.pullFlag = u) + var p = r(s), + f = l(p), + h = r(a), + d = c(h) + }, + function(e, t, r, n) { + function i() { + var e = arguments, + t = e[0] + if (!t || !t.length) return t + for (var r = 0, n = s, i = e.length; ++r < i; ) + for (var a = 0, u = e[r]; (a = n(t, u, a)) > -1; ) o.call(t, a, 1) + return t + } + var s = r(n), + a = Array.prototype, + o = a.splice + e.exports = i + }, + function(e, t, r, n, i, s, a) { + "use strict" + var o = r(n)["default"], + u = r(i)["default"] + t.__esModule = !0 + var l = r(s), + c = o(l), + p = r(a), + f = u(p) + ;(t["default"] = function(e) { + function t(e, r) { + if (f.isJSXIdentifier(e)) { + if ("this" === e.name && f.isReferenced(e, r)) return f.thisExpression() + if (!c["default"].keyword.isIdentifierNameES6(e.name)) + return f.stringLiteral(e.name) + e.type = "Identifier" + } else if (f.isJSXMemberExpression(e)) + return f.memberExpression(t(e.object, e), t(e.property, e)) + return e + } + function r(e) { + return f.isJSXExpressionContainer(e) ? e.expression : e + } + function n(e) { + var t = r(e.value || f.booleanLiteral(!0)) + return ( + f.isStringLiteral(t) && (t.value = t.value.replace(/\n\s+/g, " ")), + f.isValidIdentifier(e.name.name) + ? (e.name.type = "Identifier") + : (e.name = f.stringLiteral(e.name.name)), + f.inherits(f.objectProperty(e.name, t), e) + ) + } + function i(r, n) { + r.parent.children = f.react.buildChildren(r.parent) + var i = t(r.node.name, r.node), + a = [], + o = void 0 + f.isIdentifier(i) ? (o = i.name) : f.isLiteral(i) && (o = i.value) + var u = { tagExpr: i, tagName: o, args: a } + e.pre && e.pre(u, n) + var l = r.node.attributes + return ( + (l = l.length ? s(l, n) : f.nullLiteral()), + a.push(l), + e.post && e.post(u, n), + u.call || f.callExpression(u.callee, a) + ) + } + function s(e, t) { + function r() { + i.length && (s.push(f.objectExpression(i)), (i = [])) + } + for (var i = [], s = []; e.length; ) { + var a = e.shift() + f.isJSXSpreadAttribute(a) ? (r(), s.push(a.argument)) : i.push(n(a)) + } + return ( + r(), + 1 === s.length + ? (e = s[0]) + : (f.isObjectExpression(s[0]) || s.unshift(f.objectExpression([])), + (e = f.callExpression(t.addHelper("extends"), s))), + e + ) + } + var a = {} + return ( + (a.JSXNamespacedName = function(e) { + throw e.buildCodeFrameError( + "Namespace tags are not supported. ReactJSX is not XML." + ) + }), + (a.JSXElement = { + exit: function(e, t) { + var r = i(e.get("openingElement"), t) + ;(r.arguments = r.arguments.concat(e.node.children)), + r.arguments.length >= 3 && (r._prettyCall = !0), + e.replaceWith(f.inherits(r, e.node)) + } + }), + a + ) + }), + (e.exports = t["default"]) + } + ]) + ) +}) diff --git a/website/static/getting-started-assets/derive.jpg b/website/static/getting-started-assets/derive.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7cdd70a9e1de6e2826b87c7347c8442bc9a6c073 GIT binary patch literal 695962 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 UrGz_CFD%+T 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≤gZY@fgngV=uFpUa4iQEik`8{4z?x; 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 =ii%U3_AUu27K;Z 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

    i`$=@7%eB#aPm-~(XPhEz6OZ*wP<`U9 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\~55djRh8 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 z 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

    q=Z=SHT+h|A%qw>=WFrRK{^R0lC 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 literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/bg_hr.png b/website/static/getting-started-assets/images/bg_hr.png new file mode 100755 index 0000000000000000000000000000000000000000..514aee5056a320b059a4b92fc31385b01f3fd707 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&E!3HD~tNk5798VX=5Q)pl2@*yR?(8i7?>Hmz b1S7-U!)%xJ1CQbP0l+XkKg_jic literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/blacktocat.png b/website/static/getting-started-assets/images/blacktocat.png new file mode 100755 index 0000000000000000000000000000000000000000..e160053a5bfc1f1891c5df1a04244b46132ed91c GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGW&u7Su0Z-f>EL7Xu|Ghaf+azI z!3+%h6VAUEXmGf1FkfMPe?Wo5`wP+x42q#I?$ zCZCHu*mLc{mj@jVb0qJie|tLrXx$RV*xy|DA2&%h)(GsqVy%>MraS!Shm183{#@F! zV^vm_@$^Y{GUuI-cUN0({K+A*SMX|j#GmyK98SEwQl?dz*($XqK|j>0;H2RlD{}=; zx7!XPy5}bEXEt-@-@Ngc#+nIgOgm!u=S(u>E&hLN(cd}Wb8P2o&P?9><1zE8l8pz9 zg==?S&3yIdUhdL~<_mg1Y!?@vTUiymeaGcy&vRcbOG}I6uI`9fxn}VP_6h8=I%b0Z Rq=4be;OXk;vd$@?2>`O9@hboT literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/dust.png b/website/static/getting-started-assets/images/dust.png new file mode 100755 index 0000000000000000000000000000000000000000..08876f68930677642498efbcc6ad4296744ecc0c GIT binary patch literal 91761 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%0AkB&5HbpiyPPs6JEwT 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 )_Zw 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 QoB#j-07*qoM6N<$f=HX@^8f$< literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/icon_download.png b/website/static/getting-started-assets/images/icon_download.png new file mode 100755 index 0000000000000000000000000000000000000000..5a793f17688b22d0c98f8b32855f69daff65afaf GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3^F3W0Lp+WrCrGd^PB3WLTm5|# z<3>ZVHGbLMPaA&Ni`7(Ic@)^~t}9m~#>{KX@F?FxM~Q7di>SquC^@HPOZ^)nnu6w= zPs-5Ln9{RS^v!FJ4Hk1|eLTx~WO~PjEv;gjQBoc84>y)53m9M4vW{f>=&v)a$*Fn% zwMt9Ivq1qGD=w^dyuiIx3lB69mQJ=Ex6cJ85q6@e`QPvJEsD4 ODubu1pUXO@geCwMBTRk( literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/mobservable.png b/website/static/getting-started-assets/images/mobservable.png new file mode 100755 index 0000000000000000000000000000000000000000..386c308ce0726de4ef1c8666b3002585d5c49128 GIT binary patch literal 3902 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 bAr$mDx#9{fhKK(bwTm`Z literal 0 HcmV?d00001 diff --git a/website/static/getting-started-assets/images/sprite_download.png b/website/static/getting-started-assets/images/sprite_download.png new file mode 100755 index 0000000000000000000000000000000000000000..f9f8de24c1c49ce421a44ce2a24ac22d045a39fe GIT binary patch literal 14832 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 WAV6(21mh6^0000 sourceLines.length) { + return "" + } + var erroneousLine = sourceLines[e.lineNumber - 1] + + // Removes any leading indenting spaces and gets the number of + // chars indenting the `erroneousLine` + var indentation = 0 + erroneousLine = erroneousLine.replace(/^\s+/, function(leadingSpaces) { + indentation = leadingSpaces.length + return "" + }) + + // Defines the number of characters that are going to show + // before and after the erroneous code + var LIMIT = 30 + var errorColumn = e.column - indentation + + if (errorColumn > LIMIT) { + erroneousLine = "... " + erroneousLine.slice(errorColumn - LIMIT) + errorColumn = 4 + LIMIT + } + if (erroneousLine.length - errorColumn > LIMIT) { + erroneousLine = erroneousLine.slice(0, errorColumn + LIMIT) + " ..." + } + var message = "\n\n" + erroneousLine + "\n" + message += new Array(errorColumn - 1).join(" ") + "^" + return message + } + + /** + * Actually transform the code. + * + * @param {string} code + * @param {string?} url + * @param {object?} options + * @return {string} The transformed code. + * @internal + */ + function transformCode(code, url, options) { + try { + var transformed = transformReact(code, options) + } catch (e) { + e.message += "\n at " + if (url) { + if ("fileName" in e) { + // We set `fileName` if it's supported by this error object and + // a `url` was provided. + // The error will correctly point to `url` in Firefox. + e.fileName = url + } + e.message += url + ":" + e.lineNumber + ":" + e.columnNumber + } else { + e.message += location.href + } + e.message += createSourceCodeErrorMessage(code, e) + throw e + } + + if (!transformed.sourceMap) { + return transformed.code + } + + var source + if (url == null) { + source = "Inline JSX script" + inlineScriptCount++ + if (inlineScriptCount > 1) { + source += " (" + inlineScriptCount + ")" + } + } else if (dummyAnchor) { + // Firefox has problems when the sourcemap source is a proper URL with a + // protocol and hostname, so use the pathname. We could use just the + // filename, but hopefully using the full path will prevent potential + // issues where the same filename exists in multiple directories. + dummyAnchor.href = url + source = dummyAnchor.pathname.substr(1) + } + + return ( + transformed.code + + "\n" + + inlineSourceMap(transformed.sourceMap, code, source) + ) + } + + /** + * Appends a script element at the end of the with the content of code, + * after transforming it. + * + * @param {string} code The original source code + * @param {string?} url Where the code came from. null if inline + * @param {object?} options Options to pass to jstransform + * @internal + */ + function run(code, url, options) { + var scriptEl = document.createElement("script") + scriptEl.text = transformCode(code, url, options) + headEl.appendChild(scriptEl) + } + + /** + * Load script from the provided url and pass the content to the callback. + * + * @param {string} url The location of the script src + * @param {function} callback Function to call with the content of url + * @internal + */ + function load(url, successCallback, errorCallback) { + var xhr + xhr = window.ActiveXObject + ? new window.ActiveXObject("Microsoft.XMLHTTP") + : new XMLHttpRequest() + + // async, however scripts will be executed in the order they are in the + // DOM to mirror normal script loading. + xhr.open("GET", url, true) + if ("overrideMimeType" in xhr) { + xhr.overrideMimeType("text/plain") + } + xhr.onreadystatechange = function() { + if (xhr.readyState === 4) { + if (xhr.status === 0 || xhr.status === 200) { + successCallback(xhr.responseText) + } else { + errorCallback() + throw new Error("Could not load " + url) + } + } + } + return xhr.send(null) + } + + /** + * Loop over provided script tags and get the content, via innerHTML if an + * inline script, or by using XHR. Transforms are applied if needed. The scripts + * are executed in the order they are found on the page. + * + * @param {array} scripts The + + + + + +

    + +
    +

    JavaScript mode

    + + +
    + + + +

    + JavaScript mode supports several configuration options: +

      +
    • json which will set the mode to expect JSON + data rather than a JavaScript program.
    • +
    • jsonld which will set the mode to expect + JSON-LD linked data rather + than a JavaScript program (demo).
    • +
    • typescript which will activate additional + syntax highlighting and some other things for TypeScript code + (demo).
    • +
    • statementIndent which (given a number) will + determine the amount of indentation to use for statements + continued on a new line.
    • +
    • wordCharacters, a regexp that indicates which + characters should be considered part of an identifier. + Defaults to /[\w$]/, which does not handle + non-ASCII identifiers. Can be set to something more elaborate + to improve Unicode support.
    • +
    +

    + +

    MIME types defined: text/javascript, application/json, application/ld+json, text/typescript, application/typescript.

    +
    diff --git a/website/static/getting-started-assets/javascripts/codemirror/javascript/javascript.js b/website/static/getting-started-assets/javascripts/codemirror/javascript/javascript.js new file mode 100755 index 000000000..a6796c04c --- /dev/null +++ b/website/static/getting-started-assets/javascripts/codemirror/javascript/javascript.js @@ -0,0 +1,894 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// TODO actually recognize syntax of TypeScript constructs + +;(function(mod) { + if (typeof exports == "object" && typeof module == "object") + // CommonJS + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + // AMD + define(["../../lib/codemirror"], mod) + // Plain browser env + else mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + + CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit + var statementIndent = parserConfig.statementIndent + var jsonldMode = parserConfig.jsonld + var jsonMode = parserConfig.json || jsonldMode + var isTS = parserConfig.typescript + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/ + + // Tokenizer + + var keywords = (function() { + function kw(type) { + return { type: type, style: "keyword" } + } + var A = kw("keyword a"), + B = kw("keyword b"), + C = kw("keyword c") + var operator = kw("operator"), + atom = { type: "atom", style: "atom" } + + var jsKeywords = { + if: kw("if"), + while: A, + with: A, + else: B, + do: B, + try: B, + finally: B, + return: C, + break: C, + continue: C, + new: C, + delete: C, + throw: C, + debugger: C, + var: kw("var"), + const: kw("var"), + let: kw("var"), + function: kw("function"), + catch: kw("catch"), + for: kw("for"), + switch: kw("switch"), + case: kw("case"), + default: kw("default"), + in: operator, + typeof: operator, + instanceof: operator, + true: atom, + false: atom, + null: atom, + undefined: atom, + NaN: atom, + Infinity: atom, + this: kw("this"), + module: kw("module"), + class: kw("class"), + super: kw("atom"), + yield: C, + export: kw("export"), + import: kw("import"), + extends: C + } + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = { type: "variable", style: "variable-3" } + var tsKeywords = { + // object-like things + interface: kw("interface"), + extends: kw("extends"), + constructor: kw("constructor"), + + // scope modifiers + public: kw("public"), + private: kw("private"), + protected: kw("protected"), + static: kw("static"), + + // types + string: type, + number: type, + bool: type, + any: type + } + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr] + } + } + + return jsKeywords + })() + + var isOperatorChar = /[+\-*&%=<>!?|~^]/ + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/ + + function readRegexp(stream) { + var escaped = false, + next, + inSet = false + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return + if (next == "[") inSet = true + else if (inSet && next == "]") inSet = false + } + escaped = !escaped && next == "\\" + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content + function ret(tp, style, cont) { + type = tp + content = cont + return style + } + function tokenBase(stream, state) { + var ch = stream.next() + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch) + return state.tokenize(stream, state) + } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { + return ret("number", "number") + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta") + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch) + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator") + } else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i) + return ret("number", "number") + } else if (/\d/.test(ch)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/) + return ret("number", "number") + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment + return tokenComment(stream, state) + } else if (stream.eat("/")) { + stream.skipToEnd() + return ret("comment", "comment") + } else if ( + state.lastType == "operator" || + state.lastType == "keyword c" || + state.lastType == "sof" || + /^[\[{}\(,;:]$/.test(state.lastType) + ) { + readRegexp(stream) + stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/) + return ret("regexp", "string-2") + } else { + stream.eatWhile(isOperatorChar) + return ret("operator", "operator", stream.current()) + } + } else if (ch == "`") { + state.tokenize = tokenQuasi + return tokenQuasi(stream, state) + } else if (ch == "#") { + stream.skipToEnd() + return ret("error", "error") + } else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar) + return ret("operator", "operator", stream.current()) + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE) + var word = stream.current(), + known = keywords.propertyIsEnumerable(word) && keywords[word] + return known && state.lastType != "." + ? ret(known.type, known.style, word) + : ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, + next + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)) { + state.tokenize = tokenBase + return ret("jsonld-keyword", "meta") + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break + escaped = !escaped && next == "\\" + } + if (!escaped) state.tokenize = tokenBase + return ret("string", "string") + } + } + + function tokenComment(stream, state) { + var maybeEnd = false, + ch + while ((ch = stream.next())) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase + break + } + maybeEnd = ch == "*" + } + return ret("comment", "comment") + } + + function tokenQuasi(stream, state) { + var escaped = false, + next + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || (next == "$" && stream.eat("{")))) { + state.tokenize = tokenBase + break + } + escaped = !escaped && next == "\\" + } + return ret("quasi", "string-2", stream.current()) + } + + var brackets = "([{}])" + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null + var arrow = stream.string.indexOf("=>", stream.start) + if (arrow < 0) return + + var depth = 0, + sawSomething = false + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos) + var bracket = brackets.indexOf(ch) + if (bracket >= 0 && bracket < 3) { + if (!depth) { + ++pos + break + } + if (--depth == 0) break + } else if (bracket >= 3 && bracket < 6) { + ++depth + } else if (wordRE.test(ch)) { + sawSomething = true + } else if (/["'\/]/.test(ch)) { + return + } else if (sawSomething && !depth) { + ++pos + break + } + } + if (sawSomething && !depth) state.fatArrowAt = pos + } + + // Parser + + var atomicTypes = { + atom: true, + number: true, + variable: true, + string: true, + regexp: true, + this: true, + "jsonld-keyword": true + } + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented + this.column = column + this.type = type + this.prev = prev + this.info = info + if (align != null) this.align = align + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) if (v.name == varname) return true + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state + cx.stream = stream + ;(cx.marked = null), (cx.cc = cc) + cx.style = style + + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true + + while (true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement + if (combinator(type, content)) { + while (cc.length && cc[cc.length - 1].lex) cc.pop()() + if (cx.marked) return cx.marked + if (type == "variable" && inScope(state, content)) return "variable-2" + return style + } + } + } + + // Combinator utils + + var cx = { state: null, column: null, marked: null, cc: null } + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]) + } + function cont() { + pass.apply(null, arguments) + return true + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) if (v.name == varname) return true + return false + } + var state = cx.state + if (state.context) { + cx.marked = "def" + if (inList(state.localVars)) return + state.localVars = { name: varname, next: state.localVars } + } else { + if (inList(state.globalVars)) return + if (parserConfig.globalVars) + state.globalVars = { name: varname, next: state.globalVars } + } + } + + // Combinators + + var defaultVars = { name: "this", next: { name: "arguments" } } + function pushcontext() { + cx.state.context = { prev: cx.state.context, vars: cx.state.localVars } + cx.state.localVars = defaultVars + } + function popcontext() { + cx.state.localVars = cx.state.context.vars + cx.state.context = cx.state.context.prev + } + function pushlex(type, info) { + var result = function() { + var state = cx.state, + indent = state.indented + if (state.lexical.type == "stat") indent = state.lexical.indented + else + for ( + var outer = state.lexical; + outer && outer.type == ")" && outer.align; + outer = outer.prev + ) + indent = outer.indented + state.lexical = new JSLexical( + indent, + cx.stream.column(), + type, + null, + state.lexical, + info + ) + } + result.lex = true + return result + } + function poplex() { + var state = cx.state + if (state.lexical.prev) { + if (state.lexical.type == ")") state.indented = state.lexical.indented + state.lexical = state.lexical.prev + } + } + poplex.lex = true + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont() + else if (wanted == ";") return pass() + else return cont(exp) + } + return exp + } + + function statement(type, value) { + if (type == "var") + return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex) + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex) + if (type == "keyword b") return cont(pushlex("form"), statement, poplex) + if (type == "{") return cont(pushlex("}"), block, poplex) + if (type == ";") return cont() + if (type == "if") { + if ( + cx.state.lexical.info == "else" && + cx.state.cc[cx.state.cc.length - 1] == poplex + ) + cx.state.cc.pop()() + return cont(pushlex("form"), expression, statement, poplex, maybeelse) + } + if (type == "function") return cont(functiondef) + if (type == "for") return cont(pushlex("form"), forspec, statement, poplex) + if (type == "variable") return cont(pushlex("stat"), maybelabel) + if (type == "switch") + return cont( + pushlex("form"), + expression, + pushlex("}", "switch"), + expect("{"), + block, + poplex, + poplex + ) + if (type == "case") return cont(expression, expect(":")) + if (type == "default") return cont(expect(":")) + if (type == "catch") + return cont( + pushlex("form"), + pushcontext, + expect("("), + funarg, + expect(")"), + statement, + poplex, + popcontext + ) + if (type == "module") + return cont(pushlex("form"), pushcontext, afterModule, popcontext, poplex) + if (type == "class") return cont(pushlex("form"), className, poplex) + if (type == "export") return cont(pushlex("form"), afterExport, poplex) + if (type == "import") return cont(pushlex("form"), afterImport, poplex) + return pass(pushlex("stat"), expression, expect(";"), poplex) + } + function expression(type) { + return expressionInner(type, false) + } + function expressionNoComma(type) { + return expressionInner(type, true) + } + function expressionInner(type, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody + if (type == "(") + return cont( + pushcontext, + pushlex(")"), + commasep(pattern, ")"), + poplex, + expect("=>"), + body, + popcontext + ) + else if (type == "variable") + return pass(pushcontext, pattern, expect("=>"), body, popcontext) + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop) + if (type == "function") return cont(functiondef, maybeop) + if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression) + if (type == "(") + return cont( + pushlex(")"), + maybeexpression, + comprehension, + expect(")"), + poplex, + maybeop + ) + if (type == "operator" || type == "spread") + return cont(noComma ? expressionNoComma : expression) + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop) + if (type == "{") return contCommasep(objprop, "}", null, maybeop) + if (type == "quasi") { + return pass(quasi, maybeop) + } + return cont() + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass() + return pass(expression) + } + function maybeexpressionNoComma(type) { + if (type.match(/[;\}\)\],]/)) return pass() + return pass(expressionNoComma) + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(expression) + return maybeoperatorNoComma(type, value, false) + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma + var expr = noComma == false ? expression : expressionNoComma + if (type == "=>") + return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext) + if (type == "operator") { + if (/\+\+|--/.test(value)) return cont(me) + if (value == "?") return cont(expression, expect(":"), expr) + return cont(expr) + } + if (type == "quasi") { + return pass(quasi, me) + } + if (type == ";") return + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me) + if (type == ".") return cont(property, me) + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me) + } + function quasi(type, value) { + if (type != "quasi") return pass() + if (value.slice(value.length - 2) != "${") return cont(quasi) + return cont(expression, continueQuasi) + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2" + cx.state.tokenize = tokenQuasi + return cont(quasi) + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state) + return pass(type == "{" ? statement : expression) + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state) + return pass(type == "{" ? statement : expressionNoComma) + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement) + return pass(maybeoperatorComma, expect(";"), poplex) + } + function property(type) { + if (type == "variable") { + cx.marked = "property" + return cont() + } + } + function objprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + if (value == "get" || value == "set") return cont(getterSetter) + return cont(afterprop) + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : cx.style + " property" + return cont(afterprop) + } else if (type == "jsonld-keyword") { + return cont(afterprop) + } else if (type == "[") { + return cont(expression, expect("]"), afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop) + cx.marked = "property" + return cont(functiondef) + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma) + if (type == "(") return pass(functiondef) + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") { + var lex = cx.state.lexical + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1 + return cont(what, proceed) + } + if (type == end) return cont() + return cont(expect(end)) + } + return function(type) { + if (type == end) return cont() + return pass(what, proceed) + } + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]) + return cont(pushlex(end, info), commasep(what, end), poplex) + } + function block(type) { + if (type == "}") return cont() + return pass(statement, block) + } + function maybetype(type) { + if (isTS && type == ":") return cont(typedef) + } + function maybedefault(_, value) { + if (value == "=") return cont(expressionNoComma) + } + function typedef(type) { + if (type == "variable") { + cx.marked = "variable-3" + return cont() + } + } + function vardef() { + return pass(pattern, maybetype, maybeAssign, vardefCont) + } + function pattern(type, value) { + if (type == "variable") { + register(value) + return cont() + } + if (type == "[") return contCommasep(pattern, "]") + if (type == "{") return contCommasep(proppattern, "}") + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value) + return cont(maybeAssign) + } + if (type == "variable") cx.marked = "property" + return cont(expect(":"), pattern, maybeAssign) + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma) + } + function vardefCont(type) { + if (type == ",") return cont(vardef) + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") + return cont(pushlex("form", "else"), statement, poplex) + } + function forspec(type) { + if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex) + } + function forspec1(type) { + if (type == "var") return cont(vardef, expect(";"), forspec2) + if (type == ";") return cont(forspec2) + if (type == "variable") return cont(formaybeinof) + return pass(expression, expect(";"), forspec2) + } + function formaybeinof(_type, value) { + if (value == "in" || value == "of") { + cx.marked = "keyword" + return cont(expression) + } + return cont(maybeoperatorComma, forspec2) + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3) + if (value == "in" || value == "of") { + cx.marked = "keyword" + return cont(expression) + } + return pass(expression, expect(";"), forspec3) + } + function forspec3(type) { + if (type != ")") cont(expression) + } + function functiondef(type, value) { + if (value == "*") { + cx.marked = "keyword" + return cont(functiondef) + } + if (type == "variable") { + register(value) + return cont(functiondef) + } + if (type == "(") + return cont( + pushcontext, + pushlex(")"), + commasep(funarg, ")"), + poplex, + statement, + popcontext + ) + } + function funarg(type) { + if (type == "spread") return cont(funarg) + return pass(pattern, maybetype, maybedefault) + } + function className(type, value) { + if (type == "variable") { + register(value) + return cont(classNameAfter) + } + } + function classNameAfter(type, value) { + if (value == "extends") return cont(expression, classNameAfter) + if (type == "{") return cont(pushlex("}"), classBody, poplex) + } + function classBody(type, value) { + if (type == "variable" || cx.style == "keyword") { + if (value == "static") { + cx.marked = "keyword" + return cont(classBody) + } + cx.marked = "property" + if (value == "get" || value == "set") + return cont(classGetterSetter, functiondef, classBody) + return cont(functiondef, classBody) + } + if (value == "*") { + cx.marked = "keyword" + return cont(classBody) + } + if (type == ";") return cont(classBody) + if (type == "}") return cont() + } + function classGetterSetter(type) { + if (type != "variable") return pass() + cx.marked = "property" + return cont() + } + function afterModule(type, value) { + if (type == "string") return cont(statement) + if (type == "variable") { + register(value) + return cont(maybeFrom) + } + } + function afterExport(_type, value) { + if (value == "*") { + cx.marked = "keyword" + return cont(maybeFrom, expect(";")) + } + if (value == "default") { + cx.marked = "keyword" + return cont(expression, expect(";")) + } + return pass(statement) + } + function afterImport(type) { + if (type == "string") return cont() + return pass(importSpec, maybeFrom) + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}") + if (type == "variable") register(value) + if (value == "*") cx.marked = "keyword" + return cont(maybeAs) + } + function maybeAs(_type, value) { + if (value == "as") { + cx.marked = "keyword" + return cont(importSpec) + } + } + function maybeFrom(_type, value) { + if (value == "from") { + cx.marked = "keyword" + return cont(expression) + } + } + function arrayLiteral(type) { + if (type == "]") return cont() + return pass(expressionNoComma, maybeArrayComprehension) + } + function maybeArrayComprehension(type) { + if (type == "for") return pass(comprehension, expect("]")) + if (type == ",") return cont(commasep(maybeexpressionNoComma, "]")) + return pass(commasep(expressionNoComma, "]")) + } + function comprehension(type) { + if (type == "for") return cont(forspec, comprehension) + if (type == "if") return cont(expression, comprehension) + } + + function isContinuedStatement(state, textAfter) { + return ( + state.lastType == "operator" || + state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)) + ) + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && { vars: parserConfig.localVars }, + indented: 0 + } + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars + return state + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false + state.indented = stream.indentation() + findFatArrow(stream, state) + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null + var style = state.tokenize(stream, state) + if (type == "comment") return style + state.lastType = + type == "operator" && (content == "++" || content == "--") ? "incdec" : type + return parseJS(state, style, type, content, stream) + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment) return CodeMirror.Pass + if (state.tokenize != tokenBase) return 0 + var firstChar = textAfter && textAfter.charAt(0), + lexical = state.lexical + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) + for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i] + if (c == poplex) lexical = lexical.prev + else if (c != maybeelse) break + } + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev + var type = lexical.type, + closing = firstChar == type + + if (type == "vardef") + return ( + lexical.indented + + (state.lastType == "operator" || state.lastType == "," + ? lexical.info + 1 + : 0) + ) + else if (type == "form" && firstChar == "{") return lexical.indented + else if (type == "form") return lexical.indented + indentUnit + else if (type == "stat") + return ( + lexical.indented + + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0) + ) + else if ( + lexical.info == "switch" && + !closing && + parserConfig.doubleIndentSwitch != false + ) + return ( + lexical.indented + + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit) + ) + else if (lexical.align) return lexical.column + (closing ? 0 : 1) + else return lexical.indented + (closing ? 0 : indentUnit) + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode + } + }) + + CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/) + + CodeMirror.defineMIME("text/javascript", "javascript") + CodeMirror.defineMIME("text/ecmascript", "javascript") + CodeMirror.defineMIME("application/javascript", "javascript") + CodeMirror.defineMIME("application/x-javascript", "javascript") + CodeMirror.defineMIME("application/ecmascript", "javascript") + CodeMirror.defineMIME("application/json", { name: "javascript", json: true }) + CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }) + CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }) + CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }) + CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }) +}) diff --git a/website/static/getting-started-assets/javascripts/codemirror/javascript/json-ld.html b/website/static/getting-started-assets/javascripts/codemirror/javascript/json-ld.html new file mode 100755 index 000000000..3a37f0bce --- /dev/null +++ b/website/static/getting-started-assets/javascripts/codemirror/javascript/json-ld.html @@ -0,0 +1,72 @@ + + +CodeMirror: JSON-LD mode + + + + + + + + + + + + +
    +

    JSON-LD mode

    + + +
    + + + +

    This is a specialization of the JavaScript mode.

    +
    diff --git a/website/static/getting-started-assets/javascripts/codemirror/javascript/test.js b/website/static/getting-started-assets/javascripts/codemirror/javascript/test.js new file mode 100755 index 000000000..fd207b194 --- /dev/null +++ b/website/static/getting-started-assets/javascripts/codemirror/javascript/test.js @@ -0,0 +1,252 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +;(function() { + var mode = CodeMirror.getMode({ indentUnit: 2 }, "javascript") + function MT(name) { + test.mode(name, mode, Array.prototype.slice.call(arguments, 1)) + } + + MT( + "locals", + "[keyword function] [variable foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }" + ) + + MT( + "comma-and-binop", + "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }" + ) + + MT( + "destructuring", + "([keyword function]([def a], [[[def b], [def c] ]]) {", + " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", + " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", + "})();" + ) + + MT( + "class_body", + "[keyword class] [variable Foo] {", + " [property constructor]() {}", + " [property sayName]() {", + " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", + " }", + "}" + ) + + MT( + "class", + "[keyword class] [variable Point] [keyword extends] [variable SuperThing] {", + " [property get] [property prop]() { [keyword return] [number 24]; }", + " [property constructor]([def x], [def y]) {", + " [keyword super]([string 'something']);", + " [keyword this].[property x] [operator =] [variable-2 x];", + " }", + "}" + ) + + MT( + "module", + "[keyword module] [string 'foo'] {", + " [keyword export] [keyword let] [def x] [operator =] [number 42];", + " [keyword export] [keyword *] [keyword from] [string 'somewhere'];", + "}" + ) + + MT( + "import", + "[keyword function] [variable foo]() {", + " [keyword import] [def $] [keyword from] [string 'jquery'];", + " [keyword module] [def crypto] [keyword from] [string 'crypto'];", + " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", + "}" + ) + + MT( + "const", + "[keyword function] [variable f]() {", + " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", + "}" + ) + + MT("for/of", "[keyword for]([keyword let] [variable of] [keyword of] [variable something]) {}") + + MT( + "generator", + "[keyword function*] [variable repeat]([def n]) {", + " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", + " [keyword yield] [variable-2 i];", + "}" + ) + + MT( + "quotedStringAddition", + "[keyword let] [variable f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];" + ) + + MT( + "quotedFatArrow", + "[keyword let] [variable f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];" + ) + + MT( + "fatArrow", + "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", + "[variable a];", // No longer in scope + "[keyword let] [variable f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", + "[variable c];" + ) + + MT( + "spread", + "[keyword function] [variable f]([def a], [meta ...][def b]) {", + " [variable something]([variable-2 a], [meta ...][variable-2 b]);", + "}" + ) + + MT( + "comprehension", + "[keyword function] [variable f]() {", + " [[([variable x] [operator +] [number 1]) [keyword for] ([keyword var] [def x] [keyword in] [variable y]) [keyword if] [variable pred]([variable-2 x]) ]];", + " ([variable u] [keyword for] ([keyword var] [def u] [keyword of] [variable generateValues]()) [keyword if] ([variable-2 u].[property color] [operator ===] [string 'blue']));", + "}" + ) + + MT( + "quasi", + "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]" + ) + + MT( + "quasi_no_function", + "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]" + ) + + MT( + "indent_statement", + "[keyword var] [variable x] [operator =] [number 10]", + "[variable x] [operator +=] [variable y] [operator +]", + " [atom Infinity]", + "[keyword debugger];" + ) + + MT( + "indent_if", + "[keyword if] ([number 1])", + " [keyword break];", + "[keyword else] [keyword if] ([number 2])", + " [keyword continue];", + "[keyword else]", + " [number 10];", + "[keyword if] ([number 1]) {", + " [keyword break];", + "} [keyword else] [keyword if] ([number 2]) {", + " [keyword continue];", + "} [keyword else] {", + " [number 10];", + "}" + ) + + MT( + "indent_for", + "[keyword for] ([keyword var] [variable i] [operator =] [number 0];", + " [variable i] [operator <] [number 100];", + " [variable i][operator ++])", + " [variable doSomething]([variable i]);", + "[keyword debugger];" + ) + + MT("indent_c_style", "[keyword function] [variable foo]()", "{", " [keyword debugger];", "}") + + MT( + "indent_else", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [keyword if] ([variable bar])", + " [number 1];", + " [keyword else]", + " [number 2];", + " [keyword else]", + " [number 3];" + ) + + MT( + "indent_funarg", + "[variable foo]([number 10000],", + " [keyword function]([def a]) {", + " [keyword debugger];", + "};" + ) + + MT( + "indent_below_if", + "[keyword for] (;;)", + " [keyword if] ([variable foo])", + " [number 1];", + "[number 2];" + ) + + MT( + "multilinestring", + "[keyword var] [variable x] [operator =] [string 'foo\\]", + "[string bar'];" + ) + + MT("scary_regexp", "[string-2 /foo[[/]]bar/];") + + MT( + "indent_strange_array", + "[keyword var] [variable x] [operator =] [[", + " [number 1],,", + " [number 2],", + "]];", + "[number 10];" + ) + + MT( + "param_default", + "[keyword function] [variable foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", + " [keyword return] [variable-2 x];", + "}" + ) + + var jsonld_mode = CodeMirror.getMode({ indentUnit: 2 }, { name: "javascript", jsonld: true }) + function LD(name) { + test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)) + } + + LD( + "json_ld_keywords", + "{", + ' [meta "@context"]: {', + ' [meta "@base"]: [string "http://example.com"],', + ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', + ' [property "likesFlavor"]: {', + ' [meta "@container"]: [meta "@list"]', + ' [meta "@reverse"]: [string "@beFavoriteOf"]', + " },", + ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', + ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', + " },", + ' [meta "@graph"]: [[ {', + ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', + ' [property "name"]: [string "John Lennon"],', + ' [property "modified"]: {', + ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', + ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', + " }", + " } ]]", + "}" + ) + + LD( + "json_ld_fake", + "{", + ' [property "@fake"]: [string "@fake"],', + ' [property "@contextual"]: [string "@identifier"],', + ' [property "user@domain.com"]: [string "@graphical"],', + ' [property "@ID"]: [string "@@ID"]', + "}" + ) +})() diff --git a/website/static/getting-started-assets/javascripts/codemirror/javascript/typescript.html b/website/static/getting-started-assets/javascripts/codemirror/javascript/typescript.html new file mode 100755 index 000000000..2cfc5381f --- /dev/null +++ b/website/static/getting-started-assets/javascripts/codemirror/javascript/typescript.html @@ -0,0 +1,61 @@ + + +CodeMirror: TypeScript mode + + + + + + + + + +
    +

    TypeScript mode

    + + +
    + + + +

    This is a specialization of the JavaScript mode.

    +
    diff --git a/website/static/getting-started-assets/javascripts/codemirror/theme/xq-light.css b/website/static/getting-started-assets/javascripts/codemirror/theme/xq-light.css new file mode 100755 index 000000000..20b5c7961 --- /dev/null +++ b/website/static/getting-started-assets/javascripts/codemirror/theme/xq-light.css @@ -0,0 +1,43 @@ +/* +Copyright (C) 2011 by MarkLogic Corporation +Author: Mike Brevoort + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +.cm-s-xq-light span.cm-keyword {line-height: 1em; font-weight: bold; color: #5A5CAD; } +.cm-s-xq-light span.cm-atom {color: #6C8CD5;} +.cm-s-xq-light span.cm-number {color: #164;} +.cm-s-xq-light span.cm-def {text-decoration:underline;} +.cm-s-xq-light span.cm-variable {color: black; } +.cm-s-xq-light span.cm-variable-2 {color:black;} +.cm-s-xq-light span.cm-variable-3 {color: black; } +.cm-s-xq-light span.cm-property {} +.cm-s-xq-light span.cm-operator {} +.cm-s-xq-light span.cm-comment {color: #0080FF; font-style: italic;} +.cm-s-xq-light span.cm-string {color: red;} +.cm-s-xq-light span.cm-meta {color: yellow;} +.cm-s-xq-light span.cm-qualifier {color: grey} +.cm-s-xq-light span.cm-builtin {color: #7EA656;} +.cm-s-xq-light span.cm-bracket {color: #cc7;} +.cm-s-xq-light span.cm-tag {color: #3F7F7F;} +.cm-s-xq-light span.cm-attribute {color: #7F007F;} +.cm-s-xq-light span.cm-error {color: #f00;} + +.cm-s-xq-light .CodeMirror-activeline-background {background: #e8f2ff !important;} +.cm-s-xq-light .CodeMirror-matchingbracket {outline:1px solid grey;color:black !important;background:yellow;} \ No newline at end of file diff --git a/website/static/getting-started-assets/javascripts/jquery-2.1.4.min.js b/website/static/getting-started-assets/javascripts/jquery-2.1.4.min.js new file mode 100755 index 000000000..7c734648a --- /dev/null +++ b/website/static/getting-started-assets/javascripts/jquery-2.1.4.min.js @@ -0,0 +1,4913 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!(function(a, b) { + "object" == typeof module && "object" == typeof module.exports + ? (module.exports = a.document + ? b(a, !0) + : function(a) { + if (!a.document) throw new Error("jQuery requires a window with a document") + return b(a) + }) + : b(a) +})("undefined" != typeof window ? window : this, function(a, b) { + var c = [], + d = c.slice, + e = c.concat, + f = c.push, + g = c.indexOf, + h = {}, + i = h.toString, + j = h.hasOwnProperty, + k = {}, + l = a.document, + m = "2.1.4", + n = function(a, b) { + return new n.fn.init(a, b) + }, + o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + p = /^-ms-/, + q = /-([\da-z])/gi, + r = function(a, b) { + return b.toUpperCase() + } + ;(n.fn = n.prototype = { + jquery: m, + constructor: n, + selector: "", + length: 0, + toArray: function() { + return d.call(this) + }, + get: function(a) { + return null != a ? (0 > a ? this[a + this.length] : this[a]) : d.call(this) + }, + pushStack: function(a) { + var b = n.merge(this.constructor(), a) + return (b.prevObject = this), (b.context = this.context), b + }, + each: function(a, b) { + return n.each(this, a, b) + }, + map: function(a) { + return this.pushStack( + n.map(this, function(b, c) { + return a.call(b, c, b) + }) + ) + }, + slice: function() { + return this.pushStack(d.apply(this, arguments)) + }, + first: function() { + return this.eq(0) + }, + last: function() { + return this.eq(-1) + }, + eq: function(a) { + var b = this.length, + c = +a + (0 > a ? b : 0) + return this.pushStack(c >= 0 && b > c ? [this[c]] : []) + }, + end: function() { + return this.prevObject || this.constructor(null) + }, + push: f, + sort: c.sort, + splice: c.splice + }), + (n.extend = n.fn.extend = function() { + var a, + b, + c, + d, + e, + f, + g = arguments[0] || {}, + h = 1, + i = arguments.length, + j = !1 + for ( + "boolean" == typeof g && ((j = g), (g = arguments[h] || {}), h++), + "object" == typeof g || n.isFunction(g) || (g = {}), + h === i && ((g = this), h--); + i > h; + h++ + ) + if (null != (a = arguments[h])) + for (b in a) + (c = g[b]), + (d = a[b]), + g !== d && + (j && d && (n.isPlainObject(d) || (e = n.isArray(d))) + ? (e + ? ((e = !1), (f = c && n.isArray(c) ? c : [])) + : (f = c && n.isPlainObject(c) ? c : {}), + (g[b] = n.extend(j, f, d))) + : void 0 !== d && (g[b] = d)) + return g + }), + n.extend({ + expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""), + isReady: !0, + error: function(a) { + throw new Error(a) + }, + noop: function() {}, + isFunction: function(a) { + return "function" === n.type(a) + }, + isArray: Array.isArray, + isWindow: function(a) { + return null != a && a === a.window + }, + isNumeric: function(a) { + return !n.isArray(a) && a - parseFloat(a) + 1 >= 0 + }, + isPlainObject: function(a) { + return "object" !== n.type(a) || a.nodeType || n.isWindow(a) + ? !1 + : a.constructor && !j.call(a.constructor.prototype, "isPrototypeOf") + ? !1 + : !0 + }, + isEmptyObject: function(a) { + var b + for (b in a) return !1 + return !0 + }, + type: function(a) { + return null == a + ? a + "" + : "object" == typeof a || "function" == typeof a + ? h[i.call(a)] || "object" + : typeof a + }, + globalEval: function(a) { + var b, + c = eval + ;(a = n.trim(a)), + a && + (1 === a.indexOf("use strict") + ? ((b = l.createElement("script")), + (b.text = a), + l.head.appendChild(b).parentNode.removeChild(b)) + : c(a)) + }, + camelCase: function(a) { + return a.replace(p, "ms-").replace(q, r) + }, + nodeName: function(a, b) { + return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase() + }, + each: function(a, b, c) { + var d, + e = 0, + f = a.length, + g = s(a) + if (c) { + if (g) { + for (; f > e; e++) if (((d = b.apply(a[e], c)), d === !1)) break + } else for (e in a) if (((d = b.apply(a[e], c)), d === !1)) break + } else if (g) { + for (; f > e; e++) if (((d = b.call(a[e], e, a[e])), d === !1)) break + } else for (e in a) if (((d = b.call(a[e], e, a[e])), d === !1)) break + return a + }, + trim: function(a) { + return null == a ? "" : (a + "").replace(o, "") + }, + makeArray: function(a, b) { + var c = b || [] + return ( + null != a && + (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : f.call(c, a)), + c + ) + }, + inArray: function(a, b, c) { + return null == b ? -1 : g.call(b, a, c) + }, + merge: function(a, b) { + for (var c = +b.length, d = 0, e = a.length; c > d; d++) a[e++] = b[d] + return (a.length = e), a + }, + grep: function(a, b, c) { + for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++) + (d = !b(a[f], f)), d !== h && e.push(a[f]) + return e + }, + map: function(a, b, c) { + var d, + f = 0, + g = a.length, + h = s(a), + i = [] + if (h) for (; g > f; f++) (d = b(a[f], f, c)), null != d && i.push(d) + else for (f in a) (d = b(a[f], f, c)), null != d && i.push(d) + return e.apply([], i) + }, + guid: 1, + proxy: function(a, b) { + var c, e, f + return ( + "string" == typeof b && ((c = a[b]), (b = a), (a = c)), + n.isFunction(a) + ? ((e = d.call(arguments, 2)), + (f = function() { + return a.apply(b || this, e.concat(d.call(arguments))) + }), + (f.guid = a.guid = a.guid || n.guid++), + f) + : void 0 + ) + }, + now: Date.now, + support: k + }), + n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function( + a, + b + ) { + h["[object " + b + "]"] = b.toLowerCase() + }) + function s(a) { + var b = "length" in a && a.length, + c = n.type(a) + return "function" === c || n.isWindow(a) + ? !1 + : 1 === a.nodeType && b + ? !0 + : "array" === c || 0 === b || ("number" == typeof b && b > 0 && b - 1 in a) + } + var t = (function(a) { + var b, + c, + d, + e, + f, + g, + h, + i, + j, + k, + l, + m, + n, + o, + p, + q, + r, + s, + t, + u = "sizzle" + 1 * new Date(), + v = a.document, + w = 0, + x = 0, + y = ha(), + z = ha(), + A = ha(), + B = function(a, b) { + return a === b && (l = !0), 0 + }, + C = 1 << 31, + D = {}.hasOwnProperty, + E = [], + F = E.pop, + G = E.push, + H = E.push, + I = E.slice, + J = function(a, b) { + for (var c = 0, d = a.length; d > c; c++) if (a[c] === b) return c + return -1 + }, + K = + "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + L = "[\\x20\\t\\r\\n\\f]", + M = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + N = M.replace("w", "w#"), + O = + "\\[" + + L + + "*(" + + M + + ")(?:" + + L + + "*([*^$|!~]?=)" + + L + + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + + N + + "))|)" + + L + + "*\\]", + P = + ":(" + + M + + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + + O + + ")*)|.*)\\)|)", + Q = new RegExp(L + "+", "g"), + R = new RegExp("^" + L + "+|((?:^|[^\\\\])(?:\\\\.)*)" + L + "+$", "g"), + S = new RegExp("^" + L + "*," + L + "*"), + T = new RegExp("^" + L + "*([>+~]|" + L + ")" + L + "*"), + U = new RegExp("=" + L + "*([^\\]'\"]*?)" + L + "*\\]", "g"), + V = new RegExp(P), + W = new RegExp("^" + N + "$"), + X = { + ID: new RegExp("^#(" + M + ")"), + CLASS: new RegExp("^\\.(" + M + ")"), + TAG: new RegExp("^(" + M.replace("w", "w*") + ")"), + ATTR: new RegExp("^" + O), + PSEUDO: new RegExp("^" + P), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + L + + "*(even|odd|(([+-]|)(\\d*)n|)" + + L + + "*(?:([+-]|)" + + L + + "*(\\d+)|))" + + L + + "*\\)|)", + "i" + ), + bool: new RegExp("^(?:" + K + ")$", "i"), + needsContext: new RegExp( + "^" + + L + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + L + + "*((?:-\\d)?\\d*)" + + L + + "*\\)|)(?=[^-]|$)", + "i" + ) + }, + Y = /^(?:input|select|textarea|button)$/i, + Z = /^h\d$/i, + $ = /^[^{]+\{\s*\[native \w/, + _ = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + aa = /[+~]/, + ba = /'|\\/g, + ca = new RegExp("\\\\([\\da-f]{1,6}" + L + "?|(" + L + ")|.)", "ig"), + da = function(a, b, c) { + var d = "0x" + b - 65536 + return d !== d || c + ? b + : 0 > d + ? String.fromCharCode(d + 65536) + : String.fromCharCode((d >> 10) | 55296, (1023 & d) | 56320) + }, + ea = function() { + m() + } + try { + H.apply((E = I.call(v.childNodes)), v.childNodes), E[v.childNodes.length].nodeType + } catch (fa) { + H = { + apply: E.length + ? function(a, b) { + G.apply(a, I.call(b)) + } + : function(a, b) { + var c = a.length, + d = 0 + while ((a[c++] = b[d++])); + a.length = c - 1 + } + } + } + function ga(a, b, d, e) { + var f, h, j, k, l, o, r, s, w, x + if ( + ((b ? b.ownerDocument || b : v) !== n && m(b), + (b = b || n), + (d = d || []), + (k = b.nodeType), + "string" != typeof a || !a || (1 !== k && 9 !== k && 11 !== k)) + ) + return d + if (!e && p) { + if (11 !== k && (f = _.exec(a))) + if ((j = f[1])) { + if (9 === k) { + if (((h = b.getElementById(j)), !h || !h.parentNode)) return d + if (h.id === j) return d.push(h), d + } else if ( + b.ownerDocument && + (h = b.ownerDocument.getElementById(j)) && + t(b, h) && + h.id === j + ) + return d.push(h), d + } else { + if (f[2]) return H.apply(d, b.getElementsByTagName(a)), d + if ((j = f[3]) && c.getElementsByClassName) + return H.apply(d, b.getElementsByClassName(j)), d + } + if (c.qsa && (!q || !q.test(a))) { + if ( + ((s = r = u), + (w = b), + (x = 1 !== k && a), + 1 === k && "object" !== b.nodeName.toLowerCase()) + ) { + ;(o = g(a)), + (r = b.getAttribute("id")) + ? (s = r.replace(ba, "\\$&")) + : b.setAttribute("id", s), + (s = "[id='" + s + "'] "), + (l = o.length) + while (l--) o[l] = s + ra(o[l]) + ;(w = (aa.test(a) && pa(b.parentNode)) || b), (x = o.join(",")) + } + if (x) + try { + return H.apply(d, w.querySelectorAll(x)), d + } catch (y) { + } finally { + r || b.removeAttribute("id") + } + } + } + return i(a.replace(R, "$1"), b, d, e) + } + function ha() { + var a = [] + function b(c, e) { + return a.push(c + " ") > d.cacheLength && delete b[a.shift()], (b[c + " "] = e) + } + return b + } + function ia(a) { + return (a[u] = !0), a + } + function ja(a) { + var b = n.createElement("div") + try { + return !!a(b) + } catch (c) { + return !1 + } finally { + b.parentNode && b.parentNode.removeChild(b), (b = null) + } + } + function ka(a, b) { + var c = a.split("|"), + e = a.length + while (e--) d.attrHandle[c[e]] = b + } + function la(a, b) { + var c = b && a, + d = + c && + 1 === a.nodeType && + 1 === b.nodeType && + (~b.sourceIndex || C) - (~a.sourceIndex || C) + if (d) return d + if (c) while ((c = c.nextSibling)) if (c === b) return -1 + return a ? 1 : -1 + } + function ma(a) { + return function(b) { + var c = b.nodeName.toLowerCase() + return "input" === c && b.type === a + } + } + function na(a) { + return function(b) { + var c = b.nodeName.toLowerCase() + return ("input" === c || "button" === c) && b.type === a + } + } + function oa(a) { + return ia(function(b) { + return ( + (b = +b), + ia(function(c, d) { + var e, + f = a([], c.length, b), + g = f.length + while (g--) c[(e = f[g])] && (c[e] = !(d[e] = c[e])) + }) + ) + }) + } + function pa(a) { + return a && "undefined" != typeof a.getElementsByTagName && a + } + ;(c = ga.support = {}), + (f = ga.isXML = function(a) { + var b = a && (a.ownerDocument || a).documentElement + return b ? "HTML" !== b.nodeName : !1 + }), + (m = ga.setDocument = function(a) { + var b, + e, + g = a ? a.ownerDocument || a : v + return g !== n && 9 === g.nodeType && g.documentElement + ? ((n = g), + (o = g.documentElement), + (e = g.defaultView), + e && + e !== e.top && + (e.addEventListener + ? e.addEventListener("unload", ea, !1) + : e.attachEvent && e.attachEvent("onunload", ea)), + (p = !f(g)), + (c.attributes = ja(function(a) { + return (a.className = "i"), !a.getAttribute("className") + })), + (c.getElementsByTagName = ja(function(a) { + return ( + a.appendChild(g.createComment("")), + !a.getElementsByTagName("*").length + ) + })), + (c.getElementsByClassName = $.test(g.getElementsByClassName)), + (c.getById = ja(function(a) { + return ( + (o.appendChild(a).id = u), + !g.getElementsByName || !g.getElementsByName(u).length + ) + })), + c.getById + ? ((d.find.ID = function(a, b) { + if ("undefined" != typeof b.getElementById && p) { + var c = b.getElementById(a) + return c && c.parentNode ? [c] : [] + } + }), + (d.filter.ID = function(a) { + var b = a.replace(ca, da) + return function(a) { + return a.getAttribute("id") === b + } + })) + : (delete d.find.ID, + (d.filter.ID = function(a) { + var b = a.replace(ca, da) + return function(a) { + var c = + "undefined" != typeof a.getAttributeNode && + a.getAttributeNode("id") + return c && c.value === b + } + })), + (d.find.TAG = c.getElementsByTagName + ? function(a, b) { + return "undefined" != typeof b.getElementsByTagName + ? b.getElementsByTagName(a) + : c.qsa + ? b.querySelectorAll(a) + : void 0 + } + : function(a, b) { + var c, + d = [], + e = 0, + f = b.getElementsByTagName(a) + if ("*" === a) { + while ((c = f[e++])) 1 === c.nodeType && d.push(c) + return d + } + return f + }), + (d.find.CLASS = + c.getElementsByClassName && + function(a, b) { + return p ? b.getElementsByClassName(a) : void 0 + }), + (r = []), + (q = []), + (c.qsa = $.test(g.querySelectorAll)) && + (ja(function(a) { + ;(o.appendChild(a).innerHTML = + ""), + a.querySelectorAll("[msallowcapture^='']").length && + q.push("[*^$]=" + L + "*(?:''|\"\")"), + a.querySelectorAll("[selected]").length || + q.push("\\[" + L + "*(?:value|" + K + ")"), + a.querySelectorAll("[id~=" + u + "-]").length || q.push("~="), + a.querySelectorAll(":checked").length || q.push(":checked"), + a.querySelectorAll("a#" + u + "+*").length || q.push(".#.+[+~]") + }), + ja(function(a) { + var b = g.createElement("input") + b.setAttribute("type", "hidden"), + a.appendChild(b).setAttribute("name", "D"), + a.querySelectorAll("[name=d]").length && + q.push("name" + L + "*[*^$|!~]?="), + a.querySelectorAll(":enabled").length || + q.push(":enabled", ":disabled"), + a.querySelectorAll("*,:x"), + q.push(",.*:") + })), + (c.matchesSelector = $.test( + (s = + o.matches || + o.webkitMatchesSelector || + o.mozMatchesSelector || + o.oMatchesSelector || + o.msMatchesSelector) + )) && + ja(function(a) { + ;(c.disconnectedMatch = s.call(a, "div")), + s.call(a, "[s!='']:x"), + r.push("!=", P) + }), + (q = q.length && new RegExp(q.join("|"))), + (r = r.length && new RegExp(r.join("|"))), + (b = $.test(o.compareDocumentPosition)), + (t = + b || $.test(o.contains) + ? function(a, b) { + var c = 9 === a.nodeType ? a.documentElement : a, + d = b && b.parentNode + return ( + a === d || + !( + !d || + 1 !== d.nodeType || + !(c.contains + ? c.contains(d) + : a.compareDocumentPosition && + 16 & a.compareDocumentPosition(d)) + ) + ) + } + : function(a, b) { + if (b) while ((b = b.parentNode)) if (b === a) return !0 + return !1 + }), + (B = b + ? function(a, b) { + if (a === b) return (l = !0), 0 + var d = !a.compareDocumentPosition - !b.compareDocumentPosition + return d + ? d + : ((d = + (a.ownerDocument || a) === (b.ownerDocument || b) + ? a.compareDocumentPosition(b) + : 1), + 1 & d || + (!c.sortDetached && b.compareDocumentPosition(a) === d) + ? a === g || (a.ownerDocument === v && t(v, a)) + ? -1 + : b === g || (b.ownerDocument === v && t(v, b)) + ? 1 + : k + ? J(k, a) - J(k, b) + : 0 + : 4 & d + ? -1 + : 1) + } + : function(a, b) { + if (a === b) return (l = !0), 0 + var c, + d = 0, + e = a.parentNode, + f = b.parentNode, + h = [a], + i = [b] + if (!e || !f) + return a === g + ? -1 + : b === g + ? 1 + : e + ? -1 + : f + ? 1 + : k + ? J(k, a) - J(k, b) + : 0 + if (e === f) return la(a, b) + c = a + while ((c = c.parentNode)) h.unshift(c) + c = b + while ((c = c.parentNode)) i.unshift(c) + while (h[d] === i[d]) d++ + return d ? la(h[d], i[d]) : h[d] === v ? -1 : i[d] === v ? 1 : 0 + }), + g) + : n + }), + (ga.matches = function(a, b) { + return ga(a, null, null, b) + }), + (ga.matchesSelector = function(a, b) { + if ( + ((a.ownerDocument || a) !== n && m(a), + (b = b.replace(U, "='$1']")), + !(!c.matchesSelector || !p || (r && r.test(b)) || (q && q.test(b)))) + ) + try { + var d = s.call(a, b) + if (d || c.disconnectedMatch || (a.document && 11 !== a.document.nodeType)) + return d + } catch (e) {} + return ga(b, n, null, [a]).length > 0 + }), + (ga.contains = function(a, b) { + return (a.ownerDocument || a) !== n && m(a), t(a, b) + }), + (ga.attr = function(a, b) { + ;(a.ownerDocument || a) !== n && m(a) + var e = d.attrHandle[b.toLowerCase()], + f = e && D.call(d.attrHandle, b.toLowerCase()) ? e(a, b, !p) : void 0 + return void 0 !== f + ? f + : c.attributes || !p + ? a.getAttribute(b) + : (f = a.getAttributeNode(b)) && f.specified + ? f.value + : null + }), + (ga.error = function(a) { + throw new Error("Syntax error, unrecognized expression: " + a) + }), + (ga.uniqueSort = function(a) { + var b, + d = [], + e = 0, + f = 0 + if (((l = !c.detectDuplicates), (k = !c.sortStable && a.slice(0)), a.sort(B), l)) { + while ((b = a[f++])) b === a[f] && (e = d.push(f)) + while (e--) a.splice(d[e], 1) + } + return (k = null), a + }), + (e = ga.getText = function(a) { + var b, + c = "", + d = 0, + f = a.nodeType + if (f) { + if (1 === f || 9 === f || 11 === f) { + if ("string" == typeof a.textContent) return a.textContent + for (a = a.firstChild; a; a = a.nextSibling) c += e(a) + } else if (3 === f || 4 === f) return a.nodeValue + } else while ((b = a[d++])) c += e(b) + return c + }), + (d = ga.selectors = { + cacheLength: 50, + createPseudo: ia, + match: X, + attrHandle: {}, + find: {}, + relative: { + ">": { dir: "parentNode", first: !0 }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: !0 }, + "~": { dir: "previousSibling" } + }, + preFilter: { + ATTR: function(a) { + return ( + (a[1] = a[1].replace(ca, da)), + (a[3] = (a[3] || a[4] || a[5] || "").replace(ca, da)), + "~=" === a[2] && (a[3] = " " + a[3] + " "), + a.slice(0, 4) + ) + }, + CHILD: function(a) { + return ( + (a[1] = a[1].toLowerCase()), + "nth" === a[1].slice(0, 3) + ? (a[3] || ga.error(a[0]), + (a[4] = +(a[4] + ? a[5] + (a[6] || 1) + : 2 * ("even" === a[3] || "odd" === a[3]))), + (a[5] = +(a[7] + a[8] || "odd" === a[3]))) + : a[3] && ga.error(a[0]), + a + ) + }, + PSEUDO: function(a) { + var b, + c = !a[6] && a[2] + return X.CHILD.test(a[0]) + ? null + : (a[3] + ? (a[2] = a[4] || a[5] || "") + : c && + V.test(c) && + (b = g(c, !0)) && + (b = c.indexOf(")", c.length - b) - c.length) && + ((a[0] = a[0].slice(0, b)), (a[2] = c.slice(0, b))), + a.slice(0, 3)) + } + }, + filter: { + TAG: function(a) { + var b = a.replace(ca, da).toLowerCase() + return "*" === a + ? function() { + return !0 + } + : function(a) { + return a.nodeName && a.nodeName.toLowerCase() === b + } + }, + CLASS: function(a) { + var b = y[a + " "] + return ( + b || + ((b = new RegExp("(^|" + L + ")" + a + "(" + L + "|$)")) && + y(a, function(a) { + return b.test( + ("string" == typeof a.className && a.className) || + ("undefined" != typeof a.getAttribute && + a.getAttribute("class")) || + "" + ) + })) + ) + }, + ATTR: function(a, b, c) { + return function(d) { + var e = ga.attr(d, a) + return null == e + ? "!=" === b + : b + ? ((e += ""), + "=" === b + ? e === c + : "!=" === b + ? e !== c + : "^=" === b + ? c && 0 === e.indexOf(c) + : "*=" === b + ? c && e.indexOf(c) > -1 + : "$=" === b + ? c && e.slice(-c.length) === c + : "~=" === b + ? (" " + e.replace(Q, " ") + " ").indexOf(c) > -1 + : "|=" === b + ? e === c || e.slice(0, c.length + 1) === c + "-" + : !1) + : !0 + } + }, + CHILD: function(a, b, c, d, e) { + var f = "nth" !== a.slice(0, 3), + g = "last" !== a.slice(-4), + h = "of-type" === b + return 1 === d && 0 === e + ? function(a) { + return !!a.parentNode + } + : function(b, c, i) { + var j, + k, + l, + m, + n, + o, + p = f !== g ? "nextSibling" : "previousSibling", + q = b.parentNode, + r = h && b.nodeName.toLowerCase(), + s = !i && !h + if (q) { + if (f) { + while (p) { + l = b + while ((l = l[p])) + if ( + h + ? l.nodeName.toLowerCase() === r + : 1 === l.nodeType + ) + return !1 + o = p = "only" === a && !o && "nextSibling" + } + return !0 + } + if (((o = [g ? q.firstChild : q.lastChild]), g && s)) { + ;(k = q[u] || (q[u] = {})), + (j = k[a] || []), + (n = j[0] === w && j[1]), + (m = j[0] === w && j[2]), + (l = n && q.childNodes[n]) + while ((l = (++n && l && l[p]) || (m = n = 0) || o.pop())) + if (1 === l.nodeType && ++m && l === b) { + k[a] = [w, n, m] + break + } + } else if (s && (j = (b[u] || (b[u] = {}))[a]) && j[0] === w) + m = j[1] + else + while ((l = (++n && l && l[p]) || (m = n = 0) || o.pop())) + if ( + (h + ? l.nodeName.toLowerCase() === r + : 1 === l.nodeType) && + ++m && + (s && ((l[u] || (l[u] = {}))[a] = [w, m]), + l === b) + ) + break + return (m -= e), m === d || (m % d === 0 && m / d >= 0) + } + } + }, + PSEUDO: function(a, b) { + var c, + e = + d.pseudos[a] || + d.setFilters[a.toLowerCase()] || + ga.error("unsupported pseudo: " + a) + return e[u] + ? e(b) + : e.length > 1 + ? ((c = [a, a, "", b]), + d.setFilters.hasOwnProperty(a.toLowerCase()) + ? ia(function(a, c) { + var d, + f = e(a, b), + g = f.length + while (g--) (d = J(a, f[g])), (a[d] = !(c[d] = f[g])) + }) + : function(a) { + return e(a, 0, c) + }) + : e + } + }, + pseudos: { + not: ia(function(a) { + var b = [], + c = [], + d = h(a.replace(R, "$1")) + return d[u] + ? ia(function(a, b, c, e) { + var f, + g = d(a, null, e, []), + h = a.length + while (h--) (f = g[h]) && (a[h] = !(b[h] = f)) + }) + : function(a, e, f) { + return (b[0] = a), d(b, null, f, c), (b[0] = null), !c.pop() + } + }), + has: ia(function(a) { + return function(b) { + return ga(a, b).length > 0 + } + }), + contains: ia(function(a) { + return ( + (a = a.replace(ca, da)), + function(b) { + return (b.textContent || b.innerText || e(b)).indexOf(a) > -1 + } + ) + }), + lang: ia(function(a) { + return ( + W.test(a || "") || ga.error("unsupported lang: " + a), + (a = a.replace(ca, da).toLowerCase()), + function(b) { + var c + do + if ( + (c = p + ? b.lang + : b.getAttribute("xml:lang") || b.getAttribute("lang")) + ) + return ( + (c = c.toLowerCase()), + c === a || 0 === c.indexOf(a + "-") + ) + while ((b = b.parentNode) && 1 === b.nodeType) + return !1 + } + ) + }), + target: function(b) { + var c = a.location && a.location.hash + return c && c.slice(1) === b.id + }, + root: function(a) { + return a === o + }, + focus: function(a) { + return ( + a === n.activeElement && + (!n.hasFocus || n.hasFocus()) && + !!(a.type || a.href || ~a.tabIndex) + ) + }, + enabled: function(a) { + return a.disabled === !1 + }, + disabled: function(a) { + return a.disabled === !0 + }, + checked: function(a) { + var b = a.nodeName.toLowerCase() + return ("input" === b && !!a.checked) || ("option" === b && !!a.selected) + }, + selected: function(a) { + return a.parentNode && a.parentNode.selectedIndex, a.selected === !0 + }, + empty: function(a) { + for (a = a.firstChild; a; a = a.nextSibling) if (a.nodeType < 6) return !1 + return !0 + }, + parent: function(a) { + return !d.pseudos.empty(a) + }, + header: function(a) { + return Z.test(a.nodeName) + }, + input: function(a) { + return Y.test(a.nodeName) + }, + button: function(a) { + var b = a.nodeName.toLowerCase() + return ("input" === b && "button" === a.type) || "button" === b + }, + text: function(a) { + var b + return ( + "input" === a.nodeName.toLowerCase() && + "text" === a.type && + (null == (b = a.getAttribute("type")) || "text" === b.toLowerCase()) + ) + }, + first: oa(function() { + return [0] + }), + last: oa(function(a, b) { + return [b - 1] + }), + eq: oa(function(a, b, c) { + return [0 > c ? c + b : c] + }), + even: oa(function(a, b) { + for (var c = 0; b > c; c += 2) a.push(c) + return a + }), + odd: oa(function(a, b) { + for (var c = 1; b > c; c += 2) a.push(c) + return a + }), + lt: oa(function(a, b, c) { + for (var d = 0 > c ? c + b : c; --d >= 0; ) a.push(d) + return a + }), + gt: oa(function(a, b, c) { + for (var d = 0 > c ? c + b : c; ++d < b; ) a.push(d) + return a + }) + } + }), + (d.pseudos.nth = d.pseudos.eq) + for (b in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) + d.pseudos[b] = ma(b) + for (b in { submit: !0, reset: !0 }) d.pseudos[b] = na(b) + function qa() {} + ;(qa.prototype = d.filters = d.pseudos), + (d.setFilters = new qa()), + (g = ga.tokenize = function(a, b) { + var c, + e, + f, + g, + h, + i, + j, + k = z[a + " "] + if (k) return b ? 0 : k.slice(0) + ;(h = a), (i = []), (j = d.preFilter) + while (h) { + ;(!c || (e = S.exec(h))) && + (e && (h = h.slice(e[0].length) || h), i.push((f = []))), + (c = !1), + (e = T.exec(h)) && + ((c = e.shift()), + f.push({ value: c, type: e[0].replace(R, " ") }), + (h = h.slice(c.length))) + for (g in d.filter) + !(e = X[g].exec(h)) || + (j[g] && !(e = j[g](e))) || + ((c = e.shift()), + f.push({ value: c, type: g, matches: e }), + (h = h.slice(c.length))) + if (!c) break + } + return b ? h.length : h ? ga.error(a) : z(a, i).slice(0) + }) + function ra(a) { + for (var b = 0, c = a.length, d = ""; c > b; b++) d += a[b].value + return d + } + function sa(a, b, c) { + var d = b.dir, + e = c && "parentNode" === d, + f = x++ + return b.first + ? function(b, c, f) { + while ((b = b[d])) if (1 === b.nodeType || e) return a(b, c, f) + } + : function(b, c, g) { + var h, + i, + j = [w, f] + if (g) { + while ((b = b[d])) if ((1 === b.nodeType || e) && a(b, c, g)) return !0 + } else + while ((b = b[d])) + if (1 === b.nodeType || e) { + if ( + ((i = b[u] || (b[u] = {})), + (h = i[d]) && h[0] === w && h[1] === f) + ) + return (j[2] = h[2]) + if (((i[d] = j), (j[2] = a(b, c, g)))) return !0 + } + } + } + function ta(a) { + return a.length > 1 + ? function(b, c, d) { + var e = a.length + while (e--) if (!a[e](b, c, d)) return !1 + return !0 + } + : a[0] + } + function ua(a, b, c) { + for (var d = 0, e = b.length; e > d; d++) ga(a, b[d], c) + return c + } + function va(a, b, c, d, e) { + for (var f, g = [], h = 0, i = a.length, j = null != b; i > h; h++) + (f = a[h]) && (!c || c(f, d, e)) && (g.push(f), j && b.push(h)) + return g + } + function wa(a, b, c, d, e, f) { + return ( + d && !d[u] && (d = wa(d)), + e && !e[u] && (e = wa(e, f)), + ia(function(f, g, h, i) { + var j, + k, + l, + m = [], + n = [], + o = g.length, + p = f || ua(b || "*", h.nodeType ? [h] : h, []), + q = !a || (!f && b) ? p : va(p, m, a, h, i), + r = c ? (e || (f ? a : o || d) ? [] : g) : q + if ((c && c(q, r, h, i), d)) { + ;(j = va(r, n)), d(j, [], h, i), (k = j.length) + while (k--) (l = j[k]) && (r[n[k]] = !(q[n[k]] = l)) + } + if (f) { + if (e || a) { + if (e) { + ;(j = []), (k = r.length) + while (k--) (l = r[k]) && j.push((q[k] = l)) + e(null, (r = []), j, i) + } + k = r.length + while (k--) + (l = r[k]) && (j = e ? J(f, l) : m[k]) > -1 && (f[j] = !(g[j] = l)) + } + } else (r = va(r === g ? r.splice(o, r.length) : r)), e ? e(null, g, r, i) : H.apply(g, r) + }) + ) + } + function xa(a) { + for ( + var b, + c, + e, + f = a.length, + g = d.relative[a[0].type], + h = g || d.relative[" "], + i = g ? 1 : 0, + k = sa( + function(a) { + return a === b + }, + h, + !0 + ), + l = sa( + function(a) { + return J(b, a) > -1 + }, + h, + !0 + ), + m = [ + function(a, c, d) { + var e = + (!g && (d || c !== j)) || + ((b = c).nodeType ? k(a, c, d) : l(a, c, d)) + return (b = null), e + } + ]; + f > i; + i++ + ) + if ((c = d.relative[a[i].type])) m = [sa(ta(m), c)] + else { + if (((c = d.filter[a[i].type].apply(null, a[i].matches)), c[u])) { + for (e = ++i; f > e; e++) if (d.relative[a[e].type]) break + return wa( + i > 1 && ta(m), + i > 1 && + ra( + a + .slice(0, i - 1) + .concat({ value: " " === a[i - 2].type ? "*" : "" }) + ).replace(R, "$1"), + c, + e > i && xa(a.slice(i, e)), + f > e && xa((a = a.slice(e))), + f > e && ra(a) + ) + } + m.push(c) + } + return ta(m) + } + function ya(a, b) { + var c = b.length > 0, + e = a.length > 0, + f = function(f, g, h, i, k) { + var l, + m, + o, + p = 0, + q = "0", + r = f && [], + s = [], + t = j, + u = f || (e && d.find.TAG("*", k)), + v = (w += null == t ? 1 : Math.random() || 0.1), + x = u.length + for (k && (j = g !== n && g); q !== x && null != (l = u[q]); q++) { + if (e && l) { + m = 0 + while ((o = a[m++])) + if (o(l, g, h)) { + i.push(l) + break + } + k && (w = v) + } + c && ((l = !o && l) && p--, f && r.push(l)) + } + if (((p += q), c && q !== p)) { + m = 0 + while ((o = b[m++])) o(r, s, g, h) + if (f) { + if (p > 0) while (q--) r[q] || s[q] || (s[q] = F.call(i)) + s = va(s) + } + H.apply(i, s), + k && !f && s.length > 0 && p + b.length > 1 && ga.uniqueSort(i) + } + return k && ((w = v), (j = t)), r + } + return c ? ia(f) : f + } + return ( + (h = ga.compile = function(a, b) { + var c, + d = [], + e = [], + f = A[a + " "] + if (!f) { + b || (b = g(a)), (c = b.length) + while (c--) (f = xa(b[c])), f[u] ? d.push(f) : e.push(f) + ;(f = A(a, ya(e, d))), (f.selector = a) + } + return f + }), + (i = ga.select = function(a, b, e, f) { + var i, + j, + k, + l, + m, + n = "function" == typeof a && a, + o = !f && g((a = n.selector || a)) + if (((e = e || []), 1 === o.length)) { + if ( + ((j = o[0] = o[0].slice(0)), + j.length > 2 && + "ID" === (k = j[0]).type && + c.getById && + 9 === b.nodeType && + p && + d.relative[j[1].type]) + ) { + if (((b = (d.find.ID(k.matches[0].replace(ca, da), b) || [])[0]), !b)) + return e + n && (b = b.parentNode), (a = a.slice(j.shift().value.length)) + } + i = X.needsContext.test(a) ? 0 : j.length + while (i--) { + if (((k = j[i]), d.relative[(l = k.type)])) break + if ( + (m = d.find[l]) && + (f = m( + k.matches[0].replace(ca, da), + (aa.test(j[0].type) && pa(b.parentNode)) || b + )) + ) { + if ((j.splice(i, 1), (a = f.length && ra(j)), !a)) + return H.apply(e, f), e + break + } + } + } + return (n || h(a, o))(f, b, !p, e, (aa.test(a) && pa(b.parentNode)) || b), e + }), + (c.sortStable = + u + .split("") + .sort(B) + .join("") === u), + (c.detectDuplicates = !!l), + m(), + (c.sortDetached = ja(function(a) { + return 1 & a.compareDocumentPosition(n.createElement("div")) + })), + ja(function(a) { + return (a.innerHTML = ""), "#" === a.firstChild.getAttribute("href") + }) || + ka("type|href|height|width", function(a, b, c) { + return c ? void 0 : a.getAttribute(b, "type" === b.toLowerCase() ? 1 : 2) + }), + (c.attributes && + ja(function(a) { + return ( + (a.innerHTML = ""), + a.firstChild.setAttribute("value", ""), + "" === a.firstChild.getAttribute("value") + ) + })) || + ka("value", function(a, b, c) { + return c || "input" !== a.nodeName.toLowerCase() ? void 0 : a.defaultValue + }), + ja(function(a) { + return null == a.getAttribute("disabled") + }) || + ka(K, function(a, b, c) { + var d + return c + ? void 0 + : a[b] === !0 + ? b.toLowerCase() + : (d = a.getAttributeNode(b)) && d.specified + ? d.value + : null + }), + ga + ) + })(a) + ;(n.find = t), + (n.expr = t.selectors), + (n.expr[":"] = n.expr.pseudos), + (n.unique = t.uniqueSort), + (n.text = t.getText), + (n.isXMLDoc = t.isXML), + (n.contains = t.contains) + var u = n.expr.match.needsContext, + v = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + w = /^.[^:#\[\.,]*$/ + function x(a, b, c) { + if (n.isFunction(b)) + return n.grep(a, function(a, d) { + return !!b.call(a, d, a) !== c + }) + if (b.nodeType) + return n.grep(a, function(a) { + return (a === b) !== c + }) + if ("string" == typeof b) { + if (w.test(b)) return n.filter(b, a, c) + b = n.filter(b, a) + } + return n.grep(a, function(a) { + return g.call(b, a) >= 0 !== c + }) + } + ;(n.filter = function(a, b, c) { + var d = b[0] + return ( + c && (a = ":not(" + a + ")"), + 1 === b.length && 1 === d.nodeType + ? n.find.matchesSelector(d, a) + ? [d] + : [] + : n.find.matches( + a, + n.grep(b, function(a) { + return 1 === a.nodeType + }) + ) + ) + }), + n.fn.extend({ + find: function(a) { + var b, + c = this.length, + d = [], + e = this + if ("string" != typeof a) + return this.pushStack( + n(a).filter(function() { + for (b = 0; c > b; b++) if (n.contains(e[b], this)) return !0 + }) + ) + for (b = 0; c > b; b++) n.find(a, e[b], d) + return ( + (d = this.pushStack(c > 1 ? n.unique(d) : d)), + (d.selector = this.selector ? this.selector + " " + a : a), + d + ) + }, + filter: function(a) { + return this.pushStack(x(this, a || [], !1)) + }, + not: function(a) { + return this.pushStack(x(this, a || [], !0)) + }, + is: function(a) { + return !!x(this, "string" == typeof a && u.test(a) ? n(a) : a || [], !1).length + } + }) + var y, + z = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + A = (n.fn.init = function(a, b) { + var c, d + if (!a) return this + if ("string" == typeof a) { + if ( + ((c = + "<" === a[0] && ">" === a[a.length - 1] && a.length >= 3 + ? [null, a, null] + : z.exec(a)), + !c || (!c[1] && b)) + ) + return !b || b.jquery ? (b || y).find(a) : this.constructor(b).find(a) + if (c[1]) { + if ( + ((b = b instanceof n ? b[0] : b), + n.merge( + this, + n.parseHTML(c[1], b && b.nodeType ? b.ownerDocument || b : l, !0) + ), + v.test(c[1]) && n.isPlainObject(b)) + ) + for (c in b) n.isFunction(this[c]) ? this[c](b[c]) : this.attr(c, b[c]) + return this + } + return ( + (d = l.getElementById(c[2])), + d && d.parentNode && ((this.length = 1), (this[0] = d)), + (this.context = l), + (this.selector = a), + this + ) + } + return a.nodeType + ? ((this.context = this[0] = a), (this.length = 1), this) + : n.isFunction(a) + ? "undefined" != typeof y.ready + ? y.ready(a) + : a(n) + : (void 0 !== a.selector && + ((this.selector = a.selector), (this.context = a.context)), + n.makeArray(a, this)) + }) + ;(A.prototype = n.fn), (y = n(l)) + var B = /^(?:parents|prev(?:Until|All))/, + C = { children: !0, contents: !0, next: !0, prev: !0 } + n.extend({ + dir: function(a, b, c) { + var d = [], + e = void 0 !== c + while ((a = a[b]) && 9 !== a.nodeType) + if (1 === a.nodeType) { + if (e && n(a).is(c)) break + d.push(a) + } + return d + }, + sibling: function(a, b) { + for (var c = []; a; a = a.nextSibling) 1 === a.nodeType && a !== b && c.push(a) + return c + } + }), + n.fn.extend({ + has: function(a) { + var b = n(a, this), + c = b.length + return this.filter(function() { + for (var a = 0; c > a; a++) if (n.contains(this, b[a])) return !0 + }) + }, + closest: function(a, b) { + for ( + var c, + d = 0, + e = this.length, + f = [], + g = u.test(a) || "string" != typeof a ? n(a, b || this.context) : 0; + e > d; + d++ + ) + for (c = this[d]; c && c !== b; c = c.parentNode) + if ( + c.nodeType < 11 && + (g ? g.index(c) > -1 : 1 === c.nodeType && n.find.matchesSelector(c, a)) + ) { + f.push(c) + break + } + return this.pushStack(f.length > 1 ? n.unique(f) : f) + }, + index: function(a) { + return a + ? "string" == typeof a + ? g.call(n(a), this[0]) + : g.call(this, a.jquery ? a[0] : a) + : this[0] && this[0].parentNode + ? this.first().prevAll().length + : -1 + }, + add: function(a, b) { + return this.pushStack(n.unique(n.merge(this.get(), n(a, b)))) + }, + addBack: function(a) { + return this.add(null == a ? this.prevObject : this.prevObject.filter(a)) + } + }) + function D(a, b) { + while ((a = a[b]) && 1 !== a.nodeType); + return a + } + n.each( + { + parent: function(a) { + var b = a.parentNode + return b && 11 !== b.nodeType ? b : null + }, + parents: function(a) { + return n.dir(a, "parentNode") + }, + parentsUntil: function(a, b, c) { + return n.dir(a, "parentNode", c) + }, + next: function(a) { + return D(a, "nextSibling") + }, + prev: function(a) { + return D(a, "previousSibling") + }, + nextAll: function(a) { + return n.dir(a, "nextSibling") + }, + prevAll: function(a) { + return n.dir(a, "previousSibling") + }, + nextUntil: function(a, b, c) { + return n.dir(a, "nextSibling", c) + }, + prevUntil: function(a, b, c) { + return n.dir(a, "previousSibling", c) + }, + siblings: function(a) { + return n.sibling((a.parentNode || {}).firstChild, a) + }, + children: function(a) { + return n.sibling(a.firstChild) + }, + contents: function(a) { + return a.contentDocument || n.merge([], a.childNodes) + } + }, + function(a, b) { + n.fn[a] = function(c, d) { + var e = n.map(this, b, c) + return ( + "Until" !== a.slice(-5) && (d = c), + d && "string" == typeof d && (e = n.filter(d, e)), + this.length > 1 && (C[a] || n.unique(e), B.test(a) && e.reverse()), + this.pushStack(e) + ) + } + } + ) + var E = /\S+/g, + F = {} + function G(a) { + var b = (F[a] = {}) + return ( + n.each(a.match(E) || [], function(a, c) { + b[c] = !0 + }), + b + ) + } + ;(n.Callbacks = function(a) { + a = "string" == typeof a ? F[a] || G(a) : n.extend({}, a) + var b, + c, + d, + e, + f, + g, + h = [], + i = !a.once && [], + j = function(l) { + for ( + b = a.memory && l, c = !0, g = e || 0, e = 0, f = h.length, d = !0; + h && f > g; + g++ + ) + if (h[g].apply(l[0], l[1]) === !1 && a.stopOnFalse) { + b = !1 + break + } + ;(d = !1), h && (i ? i.length && j(i.shift()) : b ? (h = []) : k.disable()) + }, + k = { + add: function() { + if (h) { + var c = h.length + !(function g(b) { + n.each(b, function(b, c) { + var d = n.type(c) + "function" === d + ? (a.unique && k.has(c)) || h.push(c) + : c && c.length && "string" !== d && g(c) + }) + })(arguments), + d ? (f = h.length) : b && ((e = c), j(b)) + } + return this + }, + remove: function() { + return ( + h && + n.each(arguments, function(a, b) { + var c + while ((c = n.inArray(b, h, c)) > -1) + h.splice(c, 1), d && (f >= c && f--, g >= c && g--) + }), + this + ) + }, + has: function(a) { + return a ? n.inArray(a, h) > -1 : !(!h || !h.length) + }, + empty: function() { + return (h = []), (f = 0), this + }, + disable: function() { + return (h = i = b = void 0), this + }, + disabled: function() { + return !h + }, + lock: function() { + return (i = void 0), b || k.disable(), this + }, + locked: function() { + return !i + }, + fireWith: function(a, b) { + return ( + !h || + (c && !i) || + ((b = b || []), + (b = [a, b.slice ? b.slice() : b]), + d ? i.push(b) : j(b)), + this + ) + }, + fire: function() { + return k.fireWith(this, arguments), this + }, + fired: function() { + return !!c + } + } + return k + }), + n.extend({ + Deferred: function(a) { + var b = [ + ["resolve", "done", n.Callbacks("once memory"), "resolved"], + ["reject", "fail", n.Callbacks("once memory"), "rejected"], + ["notify", "progress", n.Callbacks("memory")] + ], + c = "pending", + d = { + state: function() { + return c + }, + always: function() { + return e.done(arguments).fail(arguments), this + }, + then: function() { + var a = arguments + return n + .Deferred(function(c) { + n.each(b, function(b, f) { + var g = n.isFunction(a[b]) && a[b] + e[f[1]](function() { + var a = g && g.apply(this, arguments) + a && n.isFunction(a.promise) + ? a + .promise() + .done(c.resolve) + .fail(c.reject) + .progress(c.notify) + : c[f[0] + "With"]( + this === d ? c.promise() : this, + g ? [a] : arguments + ) + }) + }), + (a = null) + }) + .promise() + }, + promise: function(a) { + return null != a ? n.extend(a, d) : d + } + }, + e = {} + return ( + (d.pipe = d.then), + n.each(b, function(a, f) { + var g = f[2], + h = f[3] + ;(d[f[1]] = g.add), + h && + g.add( + function() { + c = h + }, + b[1 ^ a][2].disable, + b[2][2].lock + ), + (e[f[0]] = function() { + return e[f[0] + "With"](this === e ? d : this, arguments), this + }), + (e[f[0] + "With"] = g.fireWith) + }), + d.promise(e), + a && a.call(e, e), + e + ) + }, + when: function(a) { + var b = 0, + c = d.call(arguments), + e = c.length, + f = 1 !== e || (a && n.isFunction(a.promise)) ? e : 0, + g = 1 === f ? a : n.Deferred(), + h = function(a, b, c) { + return function(e) { + ;(b[a] = this), + (c[a] = arguments.length > 1 ? d.call(arguments) : e), + c === i ? g.notifyWith(b, c) : --f || g.resolveWith(b, c) + } + }, + i, + j, + k + if (e > 1) + for (i = new Array(e), j = new Array(e), k = new Array(e); e > b; b++) + c[b] && n.isFunction(c[b].promise) + ? c[b] + .promise() + .done(h(b, k, c)) + .fail(g.reject) + .progress(h(b, j, i)) + : --f + return f || g.resolveWith(k, c), g.promise() + } + }) + var H + ;(n.fn.ready = function(a) { + return n.ready.promise().done(a), this + }), + n.extend({ + isReady: !1, + readyWait: 1, + holdReady: function(a) { + a ? n.readyWait++ : n.ready(!0) + }, + ready: function(a) { + ;(a === !0 ? --n.readyWait : n.isReady) || + ((n.isReady = !0), + (a !== !0 && --n.readyWait > 0) || + (H.resolveWith(l, [n]), + n.fn.triggerHandler && (n(l).triggerHandler("ready"), n(l).off("ready")))) + } + }) + function I() { + l.removeEventListener("DOMContentLoaded", I, !1), + a.removeEventListener("load", I, !1), + n.ready() + } + ;(n.ready.promise = function(b) { + return ( + H || + ((H = n.Deferred()), + "complete" === l.readyState + ? setTimeout(n.ready) + : (l.addEventListener("DOMContentLoaded", I, !1), + a.addEventListener("load", I, !1))), + H.promise(b) + ) + }), + n.ready.promise() + var J = (n.access = function(a, b, c, d, e, f, g) { + var h = 0, + i = a.length, + j = null == c + if ("object" === n.type(c)) { + e = !0 + for (h in c) n.access(a, b, h, c[h], !0, f, g) + } else if ( + void 0 !== d && + ((e = !0), + n.isFunction(d) || (g = !0), + j && + (g + ? (b.call(a, d), (b = null)) + : ((j = b), + (b = function(a, b, c) { + return j.call(n(a), c) + }))), + b) + ) + for (; i > h; h++) b(a[h], c, g ? d : d.call(a[h], h, b(a[h], c))) + return e ? a : j ? b.call(a) : i ? b(a[0], c) : f + }) + n.acceptData = function(a) { + return 1 === a.nodeType || 9 === a.nodeType || !+a.nodeType + } + function K() { + Object.defineProperty((this.cache = {}), 0, { + get: function() { + return {} + } + }), + (this.expando = n.expando + K.uid++) + } + ;(K.uid = 1), + (K.accepts = n.acceptData), + (K.prototype = { + key: function(a) { + if (!K.accepts(a)) return 0 + var b = {}, + c = a[this.expando] + if (!c) { + c = K.uid++ + try { + ;(b[this.expando] = { value: c }), Object.defineProperties(a, b) + } catch (d) { + ;(b[this.expando] = c), n.extend(a, b) + } + } + return this.cache[c] || (this.cache[c] = {}), c + }, + set: function(a, b, c) { + var d, + e = this.key(a), + f = this.cache[e] + if ("string" == typeof b) f[b] = c + else if (n.isEmptyObject(f)) n.extend(this.cache[e], b) + else for (d in b) f[d] = b[d] + return f + }, + get: function(a, b) { + var c = this.cache[this.key(a)] + return void 0 === b ? c : c[b] + }, + access: function(a, b, c) { + var d + return void 0 === b || (b && "string" == typeof b && void 0 === c) + ? ((d = this.get(a, b)), void 0 !== d ? d : this.get(a, n.camelCase(b))) + : (this.set(a, b, c), void 0 !== c ? c : b) + }, + remove: function(a, b) { + var c, + d, + e, + f = this.key(a), + g = this.cache[f] + if (void 0 === b) this.cache[f] = {} + else { + n.isArray(b) + ? (d = b.concat(b.map(n.camelCase))) + : ((e = n.camelCase(b)), + b in g ? (d = [b, e]) : ((d = e), (d = d in g ? [d] : d.match(E) || []))), + (c = d.length) + while (c--) delete g[d[c]] + } + }, + hasData: function(a) { + return !n.isEmptyObject(this.cache[a[this.expando]] || {}) + }, + discard: function(a) { + a[this.expando] && delete this.cache[a[this.expando]] + } + }) + var L = new K(), + M = new K(), + N = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + O = /([A-Z])/g + function P(a, b, c) { + var d + if (void 0 === c && 1 === a.nodeType) + if ( + ((d = "data-" + b.replace(O, "-$1").toLowerCase()), + (c = a.getAttribute(d)), + "string" == typeof c) + ) { + try { + c = + "true" === c + ? !0 + : "false" === c + ? !1 + : "null" === c + ? null + : +c + "" === c + ? +c + : N.test(c) + ? n.parseJSON(c) + : c + } catch (e) {} + M.set(a, b, c) + } else c = void 0 + return c + } + n.extend({ + hasData: function(a) { + return M.hasData(a) || L.hasData(a) + }, + data: function(a, b, c) { + return M.access(a, b, c) + }, + removeData: function(a, b) { + M.remove(a, b) + }, + _data: function(a, b, c) { + return L.access(a, b, c) + }, + _removeData: function(a, b) { + L.remove(a, b) + } + }), + n.fn.extend({ + data: function(a, b) { + var c, + d, + e, + f = this[0], + g = f && f.attributes + if (void 0 === a) { + if ( + this.length && + ((e = M.get(f)), 1 === f.nodeType && !L.get(f, "hasDataAttrs")) + ) { + c = g.length + while (c--) + g[c] && + ((d = g[c].name), + 0 === d.indexOf("data-") && + ((d = n.camelCase(d.slice(5))), P(f, d, e[d]))) + L.set(f, "hasDataAttrs", !0) + } + return e + } + return "object" == typeof a + ? this.each(function() { + M.set(this, a) + }) + : J( + this, + function(b) { + var c, + d = n.camelCase(a) + if (f && void 0 === b) { + if (((c = M.get(f, a)), void 0 !== c)) return c + if (((c = M.get(f, d)), void 0 !== c)) return c + if (((c = P(f, d, void 0)), void 0 !== c)) return c + } else + this.each(function() { + var c = M.get(this, d) + M.set(this, d, b), + -1 !== a.indexOf("-") && void 0 !== c && M.set(this, a, b) + }) + }, + null, + b, + arguments.length > 1, + null, + !0 + ) + }, + removeData: function(a) { + return this.each(function() { + M.remove(this, a) + }) + } + }), + n.extend({ + queue: function(a, b, c) { + var d + return a + ? ((b = (b || "fx") + "queue"), + (d = L.get(a, b)), + c && (!d || n.isArray(c) ? (d = L.access(a, b, n.makeArray(c))) : d.push(c)), + d || []) + : void 0 + }, + dequeue: function(a, b) { + b = b || "fx" + var c = n.queue(a, b), + d = c.length, + e = c.shift(), + f = n._queueHooks(a, b), + g = function() { + n.dequeue(a, b) + } + "inprogress" === e && ((e = c.shift()), d--), + e && ("fx" === b && c.unshift("inprogress"), delete f.stop, e.call(a, g, f)), + !d && f && f.empty.fire() + }, + _queueHooks: function(a, b) { + var c = b + "queueHooks" + return ( + L.get(a, c) || + L.access(a, c, { + empty: n.Callbacks("once memory").add(function() { + L.remove(a, [b + "queue", c]) + }) + }) + ) + } + }), + n.fn.extend({ + queue: function(a, b) { + var c = 2 + return ( + "string" != typeof a && ((b = a), (a = "fx"), c--), + arguments.length < c + ? n.queue(this[0], a) + : void 0 === b + ? this + : this.each(function() { + var c = n.queue(this, a, b) + n._queueHooks(this, a), + "fx" === a && "inprogress" !== c[0] && n.dequeue(this, a) + }) + ) + }, + dequeue: function(a) { + return this.each(function() { + n.dequeue(this, a) + }) + }, + clearQueue: function(a) { + return this.queue(a || "fx", []) + }, + promise: function(a, b) { + var c, + d = 1, + e = n.Deferred(), + f = this, + g = this.length, + h = function() { + --d || e.resolveWith(f, [f]) + } + "string" != typeof a && ((b = a), (a = void 0)), (a = a || "fx") + while (g--) + (c = L.get(f[g], a + "queueHooks")), c && c.empty && (d++, c.empty.add(h)) + return h(), e.promise(b) + } + }) + var Q = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + R = ["Top", "Right", "Bottom", "Left"], + S = function(a, b) { + return (a = b || a), "none" === n.css(a, "display") || !n.contains(a.ownerDocument, a) + }, + T = /^(?:checkbox|radio)$/i + !(function() { + var a = l.createDocumentFragment(), + b = a.appendChild(l.createElement("div")), + c = l.createElement("input") + c.setAttribute("type", "radio"), + c.setAttribute("checked", "checked"), + c.setAttribute("name", "t"), + b.appendChild(c), + (k.checkClone = b.cloneNode(!0).cloneNode(!0).lastChild.checked), + (b.innerHTML = ""), + (k.noCloneChecked = !!b.cloneNode(!0).lastChild.defaultValue) + })() + var U = "undefined" + k.focusinBubbles = "onfocusin" in a + var V = /^key/, + W = /^(?:mouse|pointer|contextmenu)|click/, + X = /^(?:focusinfocus|focusoutblur)$/, + Y = /^([^.]*)(?:\.(.+)|)$/ + function Z() { + return !0 + } + function $() { + return !1 + } + function _() { + try { + return l.activeElement + } catch (a) {} + } + ;(n.event = { + global: {}, + add: function(a, b, c, d, e) { + var f, + g, + h, + i, + j, + k, + l, + m, + o, + p, + q, + r = L.get(a) + if (r) { + c.handler && ((f = c), (c = f.handler), (e = f.selector)), + c.guid || (c.guid = n.guid++), + (i = r.events) || (i = r.events = {}), + (g = r.handle) || + (g = r.handle = function(b) { + return typeof n !== U && n.event.triggered !== b.type + ? n.event.dispatch.apply(a, arguments) + : void 0 + }), + (b = (b || "").match(E) || [""]), + (j = b.length) + while (j--) + (h = Y.exec(b[j]) || []), + (o = q = h[1]), + (p = (h[2] || "").split(".").sort()), + o && + ((l = n.event.special[o] || {}), + (o = (e ? l.delegateType : l.bindType) || o), + (l = n.event.special[o] || {}), + (k = n.extend( + { + type: o, + origType: q, + data: d, + handler: c, + guid: c.guid, + selector: e, + needsContext: e && n.expr.match.needsContext.test(e), + namespace: p.join(".") + }, + f + )), + (m = i[o]) || + ((m = i[o] = []), + (m.delegateCount = 0), + (l.setup && l.setup.call(a, d, p, g) !== !1) || + (a.addEventListener && a.addEventListener(o, g, !1))), + l.add && + (l.add.call(a, k), k.handler.guid || (k.handler.guid = c.guid)), + e ? m.splice(m.delegateCount++, 0, k) : m.push(k), + (n.event.global[o] = !0)) + } + }, + remove: function(a, b, c, d, e) { + var f, + g, + h, + i, + j, + k, + l, + m, + o, + p, + q, + r = L.hasData(a) && L.get(a) + if (r && (i = r.events)) { + ;(b = (b || "").match(E) || [""]), (j = b.length) + while (j--) + if ( + ((h = Y.exec(b[j]) || []), + (o = q = h[1]), + (p = (h[2] || "").split(".").sort()), + o) + ) { + ;(l = n.event.special[o] || {}), + (o = (d ? l.delegateType : l.bindType) || o), + (m = i[o] || []), + (h = + h[2] && + new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)")), + (g = f = m.length) + while (f--) + (k = m[f]), + (!e && q !== k.origType) || + (c && c.guid !== k.guid) || + (h && !h.test(k.namespace)) || + (d && d !== k.selector && ("**" !== d || !k.selector)) || + (m.splice(f, 1), + k.selector && m.delegateCount--, + l.remove && l.remove.call(a, k)) + g && + !m.length && + ((l.teardown && l.teardown.call(a, p, r.handle) !== !1) || + n.removeEvent(a, o, r.handle), + delete i[o]) + } else for (o in i) n.event.remove(a, o + b[j], c, d, !0) + n.isEmptyObject(i) && (delete r.handle, L.remove(a, "events")) + } + }, + trigger: function(b, c, d, e) { + var f, + g, + h, + i, + k, + m, + o, + p = [d || l], + q = j.call(b, "type") ? b.type : b, + r = j.call(b, "namespace") ? b.namespace.split(".") : [] + if ( + ((g = h = d = d || l), + 3 !== d.nodeType && + 8 !== d.nodeType && + !X.test(q + n.event.triggered) && + (q.indexOf(".") >= 0 && ((r = q.split(".")), (q = r.shift()), r.sort()), + (k = q.indexOf(":") < 0 && "on" + q), + (b = b[n.expando] ? b : new n.Event(q, "object" == typeof b && b)), + (b.isTrigger = e ? 2 : 3), + (b.namespace = r.join(".")), + (b.namespace_re = b.namespace + ? new RegExp("(^|\\.)" + r.join("\\.(?:.*\\.|)") + "(\\.|$)") + : null), + (b.result = void 0), + b.target || (b.target = d), + (c = null == c ? [b] : n.makeArray(c, [b])), + (o = n.event.special[q] || {}), + e || !o.trigger || o.trigger.apply(d, c) !== !1)) + ) { + if (!e && !o.noBubble && !n.isWindow(d)) { + for ( + i = o.delegateType || q, X.test(i + q) || (g = g.parentNode); + g; + g = g.parentNode + ) + p.push(g), (h = g) + h === (d.ownerDocument || l) && p.push(h.defaultView || h.parentWindow || a) + } + f = 0 + while ((g = p[f++]) && !b.isPropagationStopped()) + (b.type = f > 1 ? i : o.bindType || q), + (m = (L.get(g, "events") || {})[b.type] && L.get(g, "handle")), + m && m.apply(g, c), + (m = k && g[k]), + m && + m.apply && + n.acceptData(g) && + ((b.result = m.apply(g, c)), b.result === !1 && b.preventDefault()) + return ( + (b.type = q), + e || + b.isDefaultPrevented() || + (o._default && o._default.apply(p.pop(), c) !== !1) || + !n.acceptData(d) || + (k && + n.isFunction(d[q]) && + !n.isWindow(d) && + ((h = d[k]), + h && (d[k] = null), + (n.event.triggered = q), + d[q](), + (n.event.triggered = void 0), + h && (d[k] = h))), + b.result + ) + } + }, + dispatch: function(a) { + a = n.event.fix(a) + var b, + c, + e, + f, + g, + h = [], + i = d.call(arguments), + j = (L.get(this, "events") || {})[a.type] || [], + k = n.event.special[a.type] || {} + if ( + ((i[0] = a), + (a.delegateTarget = this), + !k.preDispatch || k.preDispatch.call(this, a) !== !1) + ) { + ;(h = n.event.handlers.call(this, a, j)), (b = 0) + while ((f = h[b++]) && !a.isPropagationStopped()) { + ;(a.currentTarget = f.elem), (c = 0) + while ((g = f.handlers[c++]) && !a.isImmediatePropagationStopped()) + (!a.namespace_re || a.namespace_re.test(g.namespace)) && + ((a.handleObj = g), + (a.data = g.data), + (e = ((n.event.special[g.origType] || {}).handle || g.handler).apply( + f.elem, + i + )), + void 0 !== e && + (a.result = e) === !1 && + (a.preventDefault(), a.stopPropagation())) + } + return k.postDispatch && k.postDispatch.call(this, a), a.result + } + }, + handlers: function(a, b) { + var c, + d, + e, + f, + g = [], + h = b.delegateCount, + i = a.target + if (h && i.nodeType && (!a.button || "click" !== a.type)) + for (; i !== this; i = i.parentNode || this) + if (i.disabled !== !0 || "click" !== a.type) { + for (d = [], c = 0; h > c; c++) + (f = b[c]), + (e = f.selector + " "), + void 0 === d[e] && + (d[e] = f.needsContext + ? n(e, this).index(i) >= 0 + : n.find(e, this, null, [i]).length), + d[e] && d.push(f) + d.length && g.push({ elem: i, handlers: d }) + } + return h < b.length && g.push({ elem: this, handlers: b.slice(h) }), g + }, + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split( + " " + ), + fixHooks: {}, + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function(a, b) { + return null == a.which && (a.which = null != b.charCode ? b.charCode : b.keyCode), a + } + }, + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split( + " " + ), + filter: function(a, b) { + var c, + d, + e, + f = b.button + return ( + null == a.pageX && + null != b.clientX && + ((c = a.target.ownerDocument || l), + (d = c.documentElement), + (e = c.body), + (a.pageX = + b.clientX + + ((d && d.scrollLeft) || (e && e.scrollLeft) || 0) - + ((d && d.clientLeft) || (e && e.clientLeft) || 0)), + (a.pageY = + b.clientY + + ((d && d.scrollTop) || (e && e.scrollTop) || 0) - + ((d && d.clientTop) || (e && e.clientTop) || 0))), + a.which || void 0 === f || (a.which = 1 & f ? 1 : 2 & f ? 3 : 4 & f ? 2 : 0), + a + ) + } + }, + fix: function(a) { + if (a[n.expando]) return a + var b, + c, + d, + e = a.type, + f = a, + g = this.fixHooks[e] + g || + (this.fixHooks[e] = g = W.test(e) + ? this.mouseHooks + : V.test(e) + ? this.keyHooks + : {}), + (d = g.props ? this.props.concat(g.props) : this.props), + (a = new n.Event(f)), + (b = d.length) + while (b--) (c = d[b]), (a[c] = f[c]) + return ( + a.target || (a.target = l), + 3 === a.target.nodeType && (a.target = a.target.parentNode), + g.filter ? g.filter(a, f) : a + ) + }, + special: { + load: { noBubble: !0 }, + focus: { + trigger: function() { + return this !== _() && this.focus ? (this.focus(), !1) : void 0 + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + return this === _() && this.blur ? (this.blur(), !1) : void 0 + }, + delegateType: "focusout" + }, + click: { + trigger: function() { + return "checkbox" === this.type && this.click && n.nodeName(this, "input") + ? (this.click(), !1) + : void 0 + }, + _default: function(a) { + return n.nodeName(a.target, "a") + } + }, + beforeunload: { + postDispatch: function(a) { + void 0 !== a.result && + a.originalEvent && + (a.originalEvent.returnValue = a.result) + } + } + }, + simulate: function(a, b, c, d) { + var e = n.extend(new n.Event(), c, { type: a, isSimulated: !0, originalEvent: {} }) + d ? n.event.trigger(e, null, b) : n.event.dispatch.call(b, e), + e.isDefaultPrevented() && c.preventDefault() + } + }), + (n.removeEvent = function(a, b, c) { + a.removeEventListener && a.removeEventListener(b, c, !1) + }), + (n.Event = function(a, b) { + return this instanceof n.Event + ? (a && a.type + ? ((this.originalEvent = a), + (this.type = a.type), + (this.isDefaultPrevented = + a.defaultPrevented || + (void 0 === a.defaultPrevented && a.returnValue === !1) + ? Z + : $)) + : (this.type = a), + b && n.extend(this, b), + (this.timeStamp = (a && a.timeStamp) || n.now()), + void (this[n.expando] = !0)) + : new n.Event(a, b) + }), + (n.Event.prototype = { + isDefaultPrevented: $, + isPropagationStopped: $, + isImmediatePropagationStopped: $, + preventDefault: function() { + var a = this.originalEvent + ;(this.isDefaultPrevented = Z), a && a.preventDefault && a.preventDefault() + }, + stopPropagation: function() { + var a = this.originalEvent + ;(this.isPropagationStopped = Z), a && a.stopPropagation && a.stopPropagation() + }, + stopImmediatePropagation: function() { + var a = this.originalEvent + ;(this.isImmediatePropagationStopped = Z), + a && a.stopImmediatePropagation && a.stopImmediatePropagation(), + this.stopPropagation() + } + }), + n.each( + { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" + }, + function(a, b) { + n.event.special[a] = { + delegateType: b, + bindType: b, + handle: function(a) { + var c, + d = this, + e = a.relatedTarget, + f = a.handleObj + return ( + (!e || (e !== d && !n.contains(d, e))) && + ((a.type = f.origType), + (c = f.handler.apply(this, arguments)), + (a.type = b)), + c + ) + } + } + } + ), + k.focusinBubbles || + n.each({ focus: "focusin", blur: "focusout" }, function(a, b) { + var c = function(a) { + n.event.simulate(b, a.target, n.event.fix(a), !0) + } + n.event.special[b] = { + setup: function() { + var d = this.ownerDocument || this, + e = L.access(d, b) + e || d.addEventListener(a, c, !0), L.access(d, b, (e || 0) + 1) + }, + teardown: function() { + var d = this.ownerDocument || this, + e = L.access(d, b) - 1 + e ? L.access(d, b, e) : (d.removeEventListener(a, c, !0), L.remove(d, b)) + } + } + }), + n.fn.extend({ + on: function(a, b, c, d, e) { + var f, g + if ("object" == typeof a) { + "string" != typeof b && ((c = c || b), (b = void 0)) + for (g in a) this.on(g, b, c, a[g], e) + return this + } + if ( + (null == c && null == d + ? ((d = b), (c = b = void 0)) + : null == d && + ("string" == typeof b + ? ((d = c), (c = void 0)) + : ((d = c), (c = b), (b = void 0))), + d === !1) + ) + d = $ + else if (!d) return this + return ( + 1 === e && + ((f = d), + (d = function(a) { + return n().off(a), f.apply(this, arguments) + }), + (d.guid = f.guid || (f.guid = n.guid++))), + this.each(function() { + n.event.add(this, a, d, c, b) + }) + ) + }, + one: function(a, b, c, d) { + return this.on(a, b, c, d, 1) + }, + off: function(a, b, c) { + var d, e + if (a && a.preventDefault && a.handleObj) + return ( + (d = a.handleObj), + n(a.delegateTarget).off( + d.namespace ? d.origType + "." + d.namespace : d.origType, + d.selector, + d.handler + ), + this + ) + if ("object" == typeof a) { + for (e in a) this.off(e, b, a[e]) + return this + } + return ( + (b === !1 || "function" == typeof b) && ((c = b), (b = void 0)), + c === !1 && (c = $), + this.each(function() { + n.event.remove(this, a, c, b) + }) + ) + }, + trigger: function(a, b) { + return this.each(function() { + n.event.trigger(a, b, this) + }) + }, + triggerHandler: function(a, b) { + var c = this[0] + return c ? n.event.trigger(a, b, c, !0) : void 0 + } + }) + var aa = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + ba = /<([\w:]+)/, + ca = /<|&#?\w+;/, + da = /<(?:script|style|link)/i, + ea = /checked\s*(?:[^=]|=\s*.checked.)/i, + fa = /^$|\/(?:java|ecma)script/i, + ga = /^true\/(.*)/, + ha = /^\s*\s*$/g, + ia = { + option: [1, ""], + thead: [1, "", "
    "], + col: [2, "", "
    "], + tr: [2, "", "
    "], + td: [3, "", "
    "], + _default: [0, "", ""] + } + ;(ia.optgroup = ia.option), + (ia.tbody = ia.tfoot = ia.colgroup = ia.caption = ia.thead), + (ia.th = ia.td) + function ja(a, b) { + return n.nodeName(a, "table") && n.nodeName(11 !== b.nodeType ? b : b.firstChild, "tr") + ? a.getElementsByTagName("tbody")[0] || + a.appendChild(a.ownerDocument.createElement("tbody")) + : a + } + function ka(a) { + return (a.type = (null !== a.getAttribute("type")) + "/" + a.type), a + } + function la(a) { + var b = ga.exec(a.type) + return b ? (a.type = b[1]) : a.removeAttribute("type"), a + } + function ma(a, b) { + for (var c = 0, d = a.length; d > c; c++) + L.set(a[c], "globalEval", !b || L.get(b[c], "globalEval")) + } + function na(a, b) { + var c, d, e, f, g, h, i, j + if (1 === b.nodeType) { + if (L.hasData(a) && ((f = L.access(a)), (g = L.set(b, f)), (j = f.events))) { + delete g.handle, (g.events = {}) + for (e in j) for (c = 0, d = j[e].length; d > c; c++) n.event.add(b, e, j[e][c]) + } + M.hasData(a) && ((h = M.access(a)), (i = n.extend({}, h)), M.set(b, i)) + } + } + function oa(a, b) { + var c = a.getElementsByTagName + ? a.getElementsByTagName(b || "*") + : a.querySelectorAll + ? a.querySelectorAll(b || "*") + : [] + return void 0 === b || (b && n.nodeName(a, b)) ? n.merge([a], c) : c + } + function pa(a, b) { + var c = b.nodeName.toLowerCase() + "input" === c && T.test(a.type) + ? (b.checked = a.checked) + : ("input" === c || "textarea" === c) && (b.defaultValue = a.defaultValue) + } + n.extend({ + clone: function(a, b, c) { + var d, + e, + f, + g, + h = a.cloneNode(!0), + i = n.contains(a.ownerDocument, a) + if (!(k.noCloneChecked || (1 !== a.nodeType && 11 !== a.nodeType) || n.isXMLDoc(a))) + for (g = oa(h), f = oa(a), d = 0, e = f.length; e > d; d++) pa(f[d], g[d]) + if (b) + if (c) + for (f = f || oa(a), g = g || oa(h), d = 0, e = f.length; e > d; d++) + na(f[d], g[d]) + else na(a, h) + return (g = oa(h, "script")), g.length > 0 && ma(g, !i && oa(a, "script")), h + }, + buildFragment: function(a, b, c, d) { + for ( + var e, f, g, h, i, j, k = b.createDocumentFragment(), l = [], m = 0, o = a.length; + o > m; + m++ + ) + if (((e = a[m]), e || 0 === e)) + if ("object" === n.type(e)) n.merge(l, e.nodeType ? [e] : e) + else if (ca.test(e)) { + ;(f = f || k.appendChild(b.createElement("div"))), + (g = (ba.exec(e) || ["", ""])[1].toLowerCase()), + (h = ia[g] || ia._default), + (f.innerHTML = h[1] + e.replace(aa, "<$1>") + h[2]), + (j = h[0]) + while (j--) f = f.lastChild + n.merge(l, f.childNodes), (f = k.firstChild), (f.textContent = "") + } else l.push(b.createTextNode(e)) + ;(k.textContent = ""), (m = 0) + while ((e = l[m++])) + if ( + (!d || -1 === n.inArray(e, d)) && + ((i = n.contains(e.ownerDocument, e)), + (f = oa(k.appendChild(e), "script")), + i && ma(f), + c) + ) { + j = 0 + while ((e = f[j++])) fa.test(e.type || "") && c.push(e) + } + return k + }, + cleanData: function(a) { + for (var b, c, d, e, f = n.event.special, g = 0; void 0 !== (c = a[g]); g++) { + if (n.acceptData(c) && ((e = c[L.expando]), e && (b = L.cache[e]))) { + if (b.events) + for (d in b.events) + f[d] ? n.event.remove(c, d) : n.removeEvent(c, d, b.handle) + L.cache[e] && delete L.cache[e] + } + delete M.cache[c[M.expando]] + } + } + }), + n.fn.extend({ + text: function(a) { + return J( + this, + function(a) { + return void 0 === a + ? n.text(this) + : this.empty().each(function() { + ;(1 === this.nodeType || + 11 === this.nodeType || + 9 === this.nodeType) && + (this.textContent = a) + }) + }, + null, + a, + arguments.length + ) + }, + append: function() { + return this.domManip(arguments, function(a) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var b = ja(this, a) + b.appendChild(a) + } + }) + }, + prepend: function() { + return this.domManip(arguments, function(a) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var b = ja(this, a) + b.insertBefore(a, b.firstChild) + } + }) + }, + before: function() { + return this.domManip(arguments, function(a) { + this.parentNode && this.parentNode.insertBefore(a, this) + }) + }, + after: function() { + return this.domManip(arguments, function(a) { + this.parentNode && this.parentNode.insertBefore(a, this.nextSibling) + }) + }, + remove: function(a, b) { + for (var c, d = a ? n.filter(a, this) : this, e = 0; null != (c = d[e]); e++) + b || 1 !== c.nodeType || n.cleanData(oa(c)), + c.parentNode && + (b && n.contains(c.ownerDocument, c) && ma(oa(c, "script")), + c.parentNode.removeChild(c)) + return this + }, + empty: function() { + for (var a, b = 0; null != (a = this[b]); b++) + 1 === a.nodeType && (n.cleanData(oa(a, !1)), (a.textContent = "")) + return this + }, + clone: function(a, b) { + return ( + (a = null == a ? !1 : a), + (b = null == b ? a : b), + this.map(function() { + return n.clone(this, a, b) + }) + ) + }, + html: function(a) { + return J( + this, + function(a) { + var b = this[0] || {}, + c = 0, + d = this.length + if (void 0 === a && 1 === b.nodeType) return b.innerHTML + if ( + "string" == typeof a && + !da.test(a) && + !ia[(ba.exec(a) || ["", ""])[1].toLowerCase()] + ) { + a = a.replace(aa, "<$1>") + try { + for (; d > c; c++) + (b = this[c] || {}), + 1 === b.nodeType && + (n.cleanData(oa(b, !1)), (b.innerHTML = a)) + b = 0 + } catch (e) {} + } + b && this.empty().append(a) + }, + null, + a, + arguments.length + ) + }, + replaceWith: function() { + var a = arguments[0] + return ( + this.domManip(arguments, function(b) { + ;(a = this.parentNode), n.cleanData(oa(this)), a && a.replaceChild(b, this) + }), + a && (a.length || a.nodeType) ? this : this.remove() + ) + }, + detach: function(a) { + return this.remove(a, !0) + }, + domManip: function(a, b) { + a = e.apply([], a) + var c, + d, + f, + g, + h, + i, + j = 0, + l = this.length, + m = this, + o = l - 1, + p = a[0], + q = n.isFunction(p) + if (q || (l > 1 && "string" == typeof p && !k.checkClone && ea.test(p))) + return this.each(function(c) { + var d = m.eq(c) + q && (a[0] = p.call(this, c, d.html())), d.domManip(a, b) + }) + if ( + l && + ((c = n.buildFragment(a, this[0].ownerDocument, !1, this)), + (d = c.firstChild), + 1 === c.childNodes.length && (c = d), + d) + ) { + for (f = n.map(oa(c, "script"), ka), g = f.length; l > j; j++) + (h = c), + j !== o && ((h = n.clone(h, !0, !0)), g && n.merge(f, oa(h, "script"))), + b.call(this[j], h, j) + if (g) + for (i = f[f.length - 1].ownerDocument, n.map(f, la), j = 0; g > j; j++) + (h = f[j]), + fa.test(h.type || "") && + !L.access(h, "globalEval") && + n.contains(i, h) && + (h.src + ? n._evalUrl && n._evalUrl(h.src) + : n.globalEval(h.textContent.replace(ha, ""))) + } + return this + } + }), + n.each( + { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, + function(a, b) { + n.fn[a] = function(a) { + for (var c, d = [], e = n(a), g = e.length - 1, h = 0; g >= h; h++) + (c = h === g ? this : this.clone(!0)), n(e[h])[b](c), f.apply(d, c.get()) + return this.pushStack(d) + } + } + ) + var qa, + ra = {} + function sa(b, c) { + var d, + e = n(c.createElement(b)).appendTo(c.body), + f = + a.getDefaultComputedStyle && (d = a.getDefaultComputedStyle(e[0])) + ? d.display + : n.css(e[0], "display") + return e.detach(), f + } + function ta(a) { + var b = l, + c = ra[a] + return ( + c || + ((c = sa(a, b)), + ("none" !== c && c) || + ((qa = (qa || n(" - - Hosted on egghead.io -
    - So far it all might sound a bit fancy, but making an app reactive using MobX boils down to just these three steps: ## 1. Define your state and make it observable @@ -26,16 +15,24 @@ Cyclic data structures, references, it doesn't matter. Just make sure that all properties that you want to change over time are marked by `mobx` to make them observable. ```javascript -import { observable } from "mobx" +import { makeObservable, observable } from "mobx" -var appState = observable({ - timer: 0 -}) +class AppState { + timer = 0 + + constructor() { + makeObservable(this, { + timer: observable + }) + } +} + +const appState = new AppState() ``` ## 2. Create a view that responds to changes in the State -We didn't make our `appState` observable for nothing; +We didn't make our `AppState` observable for nothing; you can now create views that automatically update whenever relevant data in the `appState` changes. MobX will find the minimal way to update your views. This single fact saves you tons of boilerplate and is [wickedly efficient](https://mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/). @@ -46,54 +43,55 @@ But here is an (ES6) example of a view in the form of a React component. ```javascript import { observer } from "mobx-react" -@observer -class TimerView extends React.Component { - render() { - return ( - - ) - } - - onReset() { - this.props.appState.resetTimer() - } -} - +const TimerView = observer(({ appState }) => ( + +)) ReactDOM.render(, document.body) ``` -(For the implementation of `resetTimer` function see the next section) +(For the implementation of `resetTimer` method see the next section) ## 3. Modify the State The third thing to do is to modify the state. That is what your app is all about after all. -Unlike many other frameworks, MobX doesn't dictate how you do this. -There are best practices, but the key thing to remember is: -**_MobX helps you do things in a simple straightforward way_**. -The following code will alter your data every second, and the UI will update automatically when needed. -No explicit relations are defined in either the controller functions that _change_ the state or in the views that should _update_. -Decorating your _state_ and _views_ with `observable` is enough for MobX to detect all relationships. -Here are two examples of changing the state: +Let's alter the timer every second, and see that the UI will update automatically when needed. Let's also implement that `resetTimer` method. + +Here's the new `AppState` model with a few methods added that modify state: ```javascript -appState.resetTimer = action(function reset() { - appState.timer = 0 -}) - -setInterval( - action(function tick() { - appState.timer += 1 - }), - 1000 -) +import { makeObservable, observable, action } from "mobx" + +class AppState { + timer = 0 + + constructor() { + makeObservable(this, { + timer: observable, + resetTimer: action, + increaseTimer: action + }) + } + + increaseTimer() { + this.timer += 1 + } + + resetTimer() { + this.timer = 0 + } +} + +setInterval(() => { + appState.increaseTimer() +}, 1000) + +const appState = new AppState() ``` -The `action` wrapper is only needed when using MobX in strict mode (by default off). -It is recommended to use action though as it will help you to better structure applications and expresses the intention of a function to modify state. -Also it automatically applies transactions for optimal performance. +These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. The only thing you need to do is to mark them as `action` with `makeObservable`. + +**_MobX helps you do things in a simple straightforward way_**. Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/) or by cloning the [MobX boilerplate project](https://github.com/mobxjs/mobx-react-boilerplate) diff --git a/notes-docs.md b/notes-docs.md index 854817b58..1fcf5709b 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -37,9 +37,15 @@ Questions: - There are a lot of references to external documentation resources. They can probably use a pruning. -- In many examples, such as 'Concepts and Principles' and 'Getting Started' 'observable' is used to make a JS object observable. Should we rewrite that to 'makeObservable'? I've opted to do so to be more consistent in examples and to better fit the strict actions are required world of MobX 6. Is that the right way forward? +- In many examples, such as 'Concepts and Principles' and 'Getting Started' 'observable' is used to make a JS object observable. Should we rewrite that to 'makeObservable'? I've opted to do so to be more consistent in examples and to better fit the strict actions are required world of MobX 6. We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? - What to do with the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? + +- A document like 'overview.md' makes much of the fact that you can modify + state in any way you like, but that won't work anymore if 'observable' + is the default. So I've rewritten it with that in mind. + +- The https://github.com/mobxjs/mobx-react-boilerplate project needs updating. From b4a229f8446fabf0bf3a7dfdbf9c76405774b822 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 23 Jun 2020 16:19:30 +0200 Subject: [PATCH 0326/1043] Restore the note concerning transactions. --- docs/intro/overview.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 8014545dc..94b6253e9 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -90,7 +90,8 @@ setInterval(() => { const appState = new AppState() ``` -These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. The only thing you need to do is to mark them as `action` with `makeObservable`. +These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. The only thing you need to do is to mark them as `action` with `makeObservable`. By marking methods this way you make MobX automatically +apply transactions for optimal performance. **_MobX helps you do things in a simple straightforward way_**. From 1e9450d4206df8b9bf8c0256252db9795406849c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 14:38:54 +0200 Subject: [PATCH 0327/1043] As it looks now we will still have decorators in the main mobx codebase. --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 3b935acf5..b41893dda 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,7 +46,7 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo # Installation -- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional): `npm install mobx-decorators --save`. +- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. - CDN: From e21f8dc887b83a893c770f642e0319caca2429c2 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 14:40:12 +0200 Subject: [PATCH 0328/1043] Say 'environment' instead of 'browser'. --- docs/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index b41893dda..22453b7af 100644 --- a/docs/README.md +++ b/docs/README.md @@ -55,8 +55,7 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo # Browser support -- MobX >=6 runs on any ES5 browser. If your browser does not have [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy) you have to configure it - to use compatibile property tracking, which does have some [limitations](#limitations-without-proxy-support). +- MobX >=6 runs in any ES5 environment. If your environment does not have [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy) you have to configure it to use compatibile property tracking, which does have some [limitations](#limitations-without-proxy-support). _Tip: the main entry point of the MobX 6 package ships with ES5 code for backward compatibility. But if you only intend to run MobX 6 on modern browsers, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ From afbb4982957e33ed69532e5fc86035fb170f2e8c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 14:51:26 +0200 Subject: [PATCH 0329/1043] Introduce makeAutoObservable. --- docs/README.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 22453b7af..3b2a22ff8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -132,8 +132,7 @@ But what about `toggle`, which we marked `action`? ### Actions -In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. -MobX requires that you mark any code that changes an `observable` as an [`action`](https://mobxjs.github.io/mobx/refguide/action.html). +In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](https://mobxjs.github.io/mobx/refguide/action.html). MobX enforces this as it helps you structure your code and prevents you from inadvertantly changing state when you don't want to. @@ -161,6 +160,40 @@ class TodoList { MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically, and only when required. +### makeAutoObservable + +The above code can be simplified using `makeAutoObservable`, as MobX can infer automatically that properties are observable, `get` properties are computed, and other methods are actions. + +```javascript +import { makeAutoObservable } from "mobx" + +class Todo { + id = Math.random() + title = "" + finished = false + + constructor() { + makeAutoObservable(this, ["id"]) + } + + toggle() { + this.finished = !finished + } +} + +class TodoList { + todos = [] + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } + constructor() { + makeAutoObservable(this) + } +} +``` + +As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by listing it as an exception in the second argument to `makeAutoObservable`. + ### Reactions Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. From 97a352304d6867843ebf278a16cf9c06e07b06a9 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 14:53:52 +0200 Subject: [PATCH 0330/1043] Tweak the text. --- docs/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 3b2a22ff8..1b357d617 100644 --- a/docs/README.md +++ b/docs/README.md @@ -162,7 +162,8 @@ Computations like these resemble formulas in spreadsheet programs like MS Excel. ### makeAutoObservable -The above code can be simplified using `makeAutoObservable`, as MobX can infer automatically that properties are observable, `get` properties are computed, and other methods are actions. +The above code can be simplified using `makeAutoObservable`. With this, MobX +automatically declares normal properties as `observable`, getter properties (`unfinishedTodoCount`) as `computed`, and other methods (`toggle`) as `action`. ```javascript import { makeAutoObservable } from "mobx" From fea5d78281291ae45b15691ebe3456e5ed743648 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 15:28:26 +0200 Subject: [PATCH 0331/1043] Reshuffle things concerning lack of Proxy support away from homepage. The pitfalls still discuss this, but briefly, and refer to a new document. --- docs/README.md | 9 ------ docs/best/limitations-without-proxies.md | 39 ++++++++++++++++++++++++ docs/best/pitfalls.md | 20 +++--------- website/i18n/en.json | 4 +++ website/sidebars.json | 1 + 5 files changed, 49 insertions(+), 24 deletions(-) create mode 100644 docs/best/limitations-without-proxies.md diff --git a/docs/README.md b/docs/README.md index 1b357d617..b11db8ffa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -338,15 +338,6 @@ And finally kudos for all the people that believed in, tried, validated and even - Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. - Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. -# Limitations without Proxy support - -MobX 6 is works on any ES 5 environment, but if your environment or browser does not have Proxy support, there are some limitations: - -- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. -- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. - -For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). - ## Donating Was MobX key in making your project a success? diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md new file mode 100644 index 000000000..5037cf08e --- /dev/null +++ b/docs/best/limitations-without-proxies.md @@ -0,0 +1,39 @@ +--- +title: Limitations without Proxy support +sidebar_label: Limitations without Proxy support +hide_title: true +--- + +# Limitations without Proxy support + +MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy), there are some limitations: + +- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. +- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. + +Luckily, most environments support Proxies these days. + +See below for more details. + +## `Array.isArray(observable([1,2,3])) === false` + +_This limitation only applies if MobX runs in an environment without Proxy support_ + +In ES5 there is no way to reliably inherit from arrays, and hence observable arrays inherit from objects. +This means that regularly libraries are not able to recognize observable arrays as normal arrays (like lodash, or built-in operations like `Array.concat`). +This can simply be fixed by passing calling `observable.toJS()` or `observable.slice()` before passing the array to another library. +As long as the external library has no intent to modify the array, this will further work completely as expected. +You can use `isObservableArray(observable)` to check whether something is an observable array. + +## `object.someNewProp = value` is not picked up + +_This limitation only applies if MobX run in an environment without Proxy support. +If you are sure you are in an environment that does have Proxy support and it +still does not work, it could be you forgot to mark the object observable._ + +MobX observable _objects_ do not detect or react to property assignments that weren't declared observable before. +So MobX observable objects act as records with predefined keys. +You can use `extendObservable(target, props)` to introduce new observable properties to an object. +However object iterators like `for .. in` or `Object.keys()` won't react to this automatically. +If you need a dynamically keyed object in an environment without Proxy support, for example to store users by id, create observable _maps_ using [`observable.map`](../refguide/map.md) or use the utility methods as exposed by the [Object API](../refguide/object-api.md). +For more info see [what will MobX react to?](https://mobx.js.org/best/react.html#what-does-mobx-react-to). diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index b8f23d948..7e5209077 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -32,26 +32,16 @@ For setup tips and limitations on decorators, check the [decorators](decorators. #### `Array.isArray(observable([1,2,3])) === false` -_This limitation applies to MobX 4 and lower only_ +If your environment does not support Proxies, then MobX cannot make its observable +array be a real JS Array. -In ES5 there is no way to reliably inherit from arrays, and hence observable arrays inherit from objects. -This means that regularly libraries are not able to recognize observable arrays as normal arrays (like lodash, or built-in operations like `Array.concat`). -This can simply be fixed by passing calling `observable.toJS()` or `observable.slice()` before passing the array to another library. -As long as the external library has no intent to modify the array, this will further work completely as expected. -You can use `isObservableArray(observable)` to check whether something is an observable array. +For more information see (../best/limitations-without-proxies.md). #### `object.someNewProp = value` is not picked up -_This limitation applies to MobX 4 and lower_ +If your environment does not support Proxies, then MobX cannot observe detect or react to properties that weren't declared observable before. For more information see (../best/limitations-without-proxies.md). -_In MobX 5 this limitation applies to class instances and other objects that were **not** created using `observable()` / `observable.object()`._ - -MobX observable _objects_ do not detect or react to property assignments that weren't declared observable before. -So MobX observable objects act as records with predefined keys. -You can use `extendObservable(target, props)` to introduce new observable properties to an object. -However object iterators like `for .. in` or `Object.keys()` won't react to this automatically. -If you need a dynamically keyed object in MobX 4 and lower, for example to store users by id, create observable _maps_ using [`observable.map`](../refguide/map.md) or use the utility methods as exposed by the [Object API](../refguide/object-api.md). -For more info see [what will MobX react to?](https://mobx.js.org/best/react.html#what-does-mobx-react-to). +If your environment **does** support Proxies, then MobX can detect this if and only if you create the class instance or object using `observable()` / `observable.object()`. ### Use `@observer` on all components that render `@observable`s. diff --git a/website/i18n/en.json b/website/i18n/en.json index 084e2e477..6bf4514cc 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -17,6 +17,10 @@ "title": "MobX + React DevTools", "sidebar_label": "MobX + React DevTools" }, + "best/limitations-without-proxies": { + "title": "Limitations without Proxy support", + "sidebar_label": "Limitations without Proxy support" + }, "best/pitfalls": { "title": "Common pitfalls & best practices", "sidebar_label": "Common Pitfalls & Best Practices" diff --git a/website/sidebars.json b/website/sidebars.json index 9ce2fc4b9..ea79a71f0 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -41,6 +41,7 @@ "Tips & Tricks": [ "faq/faq", "best/pitfalls", + "best/limitations-without-proxies", "best/decorators", "best/trace", "best/store", From 63e8212ebf8d0e8eae299324705f4cfc4e8200c9 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 15:31:52 +0200 Subject: [PATCH 0332/1043] Improve text per suggestion and make into real questions. --- docs/faq/faq.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/faq/faq.md b/docs/faq/faq.md index f1a9a1555..5646a38e1 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -74,11 +74,11 @@ And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully We've compiled a large list of helpful resources of all types in the [official awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx). If you feel it's missing something, please open an [issue](https://github.com/mobxjs/awesome-mobx/issues/new) or [pull request](https://github.com/mobxjs/awesome-mobx/compare) to describe what you're looking for or share your added links :). -#### TypeScript support +#### What about TypeScript support? -MobX is written with TypeScript and TypeScript support is built-in. +MobX is written with TypeScript and type definitions is built-in. -#### Flow support +#### Does MobX have Flow typing support? MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. From 16948d787bbb535f7aeedc0ceae7c379a39f8bcd Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 15:33:10 +0200 Subject: [PATCH 0333/1043] Oops. --- docs/intro/concepts.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index b52ce56e0..dc634c66b 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -90,7 +90,8 @@ class TodoStore { constructor() { makeObservable(this, { todos: observable, - completedCount: computed + completedCount: computed, + add: action }) } From fbe8529e3851c469abf51792fc11358d215493b1 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 15:37:16 +0200 Subject: [PATCH 0334/1043] Document makeAutoObservable here as well. --- docs/intro/overview.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 94b6253e9..9d1b83294 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -96,3 +96,29 @@ apply transactions for optimal performance. **_MobX helps you do things in a simple straightforward way_**. Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/) or by cloning the [MobX boilerplate project](https://github.com/mobxjs/mobx-react-boilerplate) + +## 4. Automating `makeObservable` with `makeAutoObservable` + +MobX has a function `makeAutoObservable` that automatically marks properties +as `observable` and methods as `action` (and getters as `computed`). We +could have used this instead to simplify the `AppState` class: + +```javascript +import { makeAutoObservable } from "mobx" + +class AppState { + timer = 0 + + constructor() { + makeAutoObservable(this) + } + + increaseTimer() { + this.timer += 1 + } + + resetTimer() { + this.timer = 0 + } +} +``` From 797e3996a47dcccb59d745c1700ece85729f87d9 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 24 Jun 2020 16:02:23 +0200 Subject: [PATCH 0335/1043] Add a section about decorator support. --- docs/README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/docs/README.md b/docs/README.md index b11db8ffa..714e61326 100644 --- a/docs/README.md +++ b/docs/README.md @@ -195,6 +195,56 @@ class TodoList { As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by listing it as an exception in the second argument to `makeAutoObservable`. +### Decorators + +MobX before version 6 encouraged the use of ES.next decorators to mark things as observable, computed and actions. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. + +But many existing code bases that use MobX still use them, and a lot of the documentation material online uses them as well. And you can still use them in MobX 6 and above. The equivalent of the above code using decorators looks like this: + +```javascript +import { makeObservable, observable, computed, action } from "mobx" + +class Todo { + id = Math.random() + @observable title = "" + @observable finished = false + + constructor() { + makeObservable(this) + } + + @action + toggle() { + this.finished = !finished + } +} + +class TodoList { + @observable todos = [] + + @computed + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } + + constructor() { + makeObservable(this) + } +} +``` + +Here is the gist on decorator support in MobX 6: + +- You can still use `observable`, `computed` and `action` as decorators to mark code. + +- But in order to have them be picked up, you now need to use `makeObservable(this)`, + without the second argument as this information is automatically deduced from + the decorators. + +- There are code mods to help you upgrade existing code to be compliant with MobX 6. + +The [decorators guide](best/decorators.md) has more information. + ### Reactions Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. From 540b5986dcbece0782891e3a897f5aaf74bb33ed Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 24 Jun 2020 20:53:30 +0100 Subject: [PATCH 0336/1043] Introduce the concept of `autoAction` --- notes.md | 23 +++++++++++++++++++++++ src/api/action.ts | 12 +++++++++++- src/api/autorun.ts | 4 ++-- src/core/action.ts | 37 +++++++++++++++++++++++++++++-------- src/core/globalstate.ts | 5 +++++ src/mobx.ts | 3 ++- test/v5/base/api.js | 2 +- 7 files changed, 73 insertions(+), 13 deletions(-) diff --git a/notes.md b/notes.md index 0bea799e1..29cb7b933 100644 --- a/notes.md +++ b/notes.md @@ -92,6 +92,29 @@ PHilosophy: one thing to do things - [ ] Migration: document switching from 4 to 5: configure( ) with proxies, requiresReqction, enforceActions - [ ] makeObservable + private members in TypeScript (second call? computed name? tsignore?) - [ ] print deprecation warnings for all old apis in mobx 4/5 +- [ ] Breaking: it is no longer safe to call action from autorun. Use effect or reaction instead. + +## NOTES + +### New state changes model: + +action + +- enter batching, +- state updates allowed, only if not tracking -or- in effect + +effect + +- disable tracking + action + +track + +- enable tracking +- disable updates + +Side effects like state changes are not allowed inside derivations. You can explicitly suppress this message by using 'effect', at your own risk. + +State changes are not allowed outside actions. ## Blog diff --git a/src/api/action.ts b/src/api/action.ts index e077e2c86..8bf7dcc4e 100644 --- a/src/api/action.ts +++ b/src/api/action.ts @@ -53,7 +53,7 @@ action.annotationType_ = ACTION action.bound = createDecorator(ACTION_BOUND) export function runInAction(fn: () => T): T { - return executeAction(fn.name || ACTION_UNNAMED, fn, this, undefined) + return executeAction(fn.name || ACTION_UNNAMED, false, fn, this, undefined) } export function isAction(thing: any) { @@ -63,3 +63,13 @@ export function isAction(thing: any) { export function defineBoundAction(target: any, propertyName: string, fn: Function) { addHiddenProp(target, propertyName, createAction(propertyName, fn.bind(target))) } + +export function autoAction(fn: T): T +export function autoAction(name: string, fn: T): T +export function autoAction(arg1, arg2?): any { + // action(fn() {}) + if (isFunction(arg1)) return createAction(arg1.name || ACTION_UNNAMED, arg1, true) + // action("name", fn() {}) + if (isFunction(arg2)) return createAction(arg1, arg2, true) + if (__DEV__) die("Invalid arguments for `autoAction`") +} diff --git a/src/api/autorun.ts b/src/api/autorun.ts index 06df5197b..46658ddcc 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -10,9 +10,9 @@ import { getNextId, isAction, isFunction, - isPlainObject + isPlainObject, + die } from "../internal" -import { die } from "../errors" export interface IAutorunOptions { delay?: number diff --git a/src/core/action.ts b/src/core/action.ts index 8be50d1b1..97bc7a78a 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -23,14 +23,19 @@ let nextActionId = 1 const functionNameDescriptor = Object.getOwnPropertyDescriptor(() => {}, "name") const isFunctionNameConfigurable = functionNameDescriptor?.configurable ?? false -export function createAction(actionName: string, fn: Function, ref?: Object): Function { +export function createAction( + actionName: string, + fn: Function, + autoAction: boolean = false, + ref?: Object +): Function { if (__DEV__) { if (!isFunction(fn)) die("`action` can only be invoked on functions") if (typeof actionName !== "string" || !actionName) die(`actions should have valid names, got: '${actionName}'`) } function res() { - return executeAction(actionName, fn, ref || this, arguments) + return executeAction(actionName, autoAction, fn, ref || this, arguments) } // TODO: can be optimized by recyclig objects? // TODO: and check if fn.name !== actionName return Object.defineProperties(res, { @@ -39,8 +44,14 @@ export function createAction(actionName: string, fn: Function, ref?: Object): Fu }) } -export function executeAction(actionName: string, fn: Function, scope?: any, args?: IArguments) { - const runInfo = _startAction(actionName, scope, args) +export function executeAction( + actionName: string, + canRunAsDeriviation: boolean, + fn: Function, + scope?: any, + args?: IArguments +) { + const runInfo = _startAction(actionName, canRunAsDeriviation, scope, args) try { return fn.apply(scope, args) } catch (err) { @@ -60,9 +71,15 @@ export interface IActionRunInfo { error_?: any parentActionId_: number actionId_: number + runAsAction_?: boolean } -export function _startAction(actionName: string, scope: any, args?: IArguments): IActionRunInfo { +export function _startAction( + actionName: string, + canRunAsDeriviation: boolean, // true for autoAction + scope: any, + args?: IArguments +): IActionRunInfo { const notifySpy_ = __DEV__ && isSpyEnabled() && !!actionName let startTime_: number = 0 if (__DEV__ && notifySpy_) { @@ -75,11 +92,14 @@ export function _startAction(actionName: string, scope: any, args?: IArguments): arguments: flattendArgs }) } - const prevDerivation_ = untrackedStart() + const prevDerivation_ = globalState.trackingDerivation + const runAsAction = !canRunAsDeriviation || !prevDerivation_ + if (runAsAction) untrackedStart() startBatch() - const prevAllowStateChanges_ = allowStateChangesStart(true) + const prevAllowStateChanges_ = allowStateChangesStart(runAsAction) const prevAllowStateReads_ = allowStateReadsStart(true) const runInfo = { + runAsAction_: runAsAction, prevDerivation_, prevAllowStateChanges_, prevAllowStateReads_, @@ -104,7 +124,7 @@ export function _endAction(runInfo: IActionRunInfo) { allowStateChangesEnd(runInfo.prevAllowStateChanges_) allowStateReadsEnd(runInfo.prevAllowStateReads_) endBatch() - untrackedEnd(runInfo.prevDerivation_) + if (runInfo.runAsAction_) untrackedEnd(runInfo.prevDerivation_) if (__DEV__ && runInfo.notifySpy_) { spyReportEnd({ time: Date.now() - runInfo.startTime_ }) } @@ -132,6 +152,7 @@ export function allowStateChangesEnd(prev: boolean) { globalState.allowStateChanges = prev } +// TODO: kill and make the default export function allowStateChangesInsideComputed(func: () => T): T { const prev = globalState.computationDepth globalState.computationDepth = 0 diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index f5b47d7dc..8cfabb76a 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -44,6 +44,11 @@ export class MobXGlobals { /** * Are we running a computation currently? (not a reaction) + * Note that generally we check trackingDerivation, to see if + * we are in a derivation (and not in an effect for example). + * + * computationDepth can be used to see if we have any computation in the stack + * // TODO: remove? */ computationDepth = 0 diff --git a/src/mobx.ts b/src/mobx.ts index e026b7ac8..483a11340 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -129,7 +129,8 @@ export { allowStateReadsStart as _allowStateReadsStart, allowStateReadsEnd as _allowStateReadsEnd, makeObservable, - makeAutoObservable + makeAutoObservable, + autoAction as _autoAction } from "./internal" // Devtools support diff --git a/test/v5/base/api.js b/test/v5/base/api.js index 6937e4cc4..e6f888dcc 100644 --- a/test/v5/base/api.js +++ b/test/v5/base/api.js @@ -13,6 +13,7 @@ test("correct api should be exposed", function() { "_allowStateChangesInsideComputed", "_allowStateReadsEnd", "_allowStateReadsStart", + "_autoAction", "autorun", "comparer", "computed", @@ -30,7 +31,6 @@ test("correct api should be exposed", function() { "has", "_getGlobalState", "getObserverTree", - "IDerivationState", "intercept", "_interceptReads", "isAction", From a106e47e26b9fa09168262c3c6ca4e75f530d10b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 13:02:59 +0200 Subject: [PATCH 0337/1043] Make links relative Previously they pointed to the actual MobX website, which is not what you want when you're working on the docs. --- docs/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 714e61326..2fad10819 100644 --- a/docs/README.md +++ b/docs/README.md @@ -132,7 +132,7 @@ But what about `toggle`, which we marked `action`? ### Actions -In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](https://mobxjs.github.io/mobx/refguide/action.html). +In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](../refguide/action.html). MobX enforces this as it helps you structure your code and prevents you from inadvertantly changing state when you don't want to. @@ -289,8 +289,8 @@ However, if you would remove the `Tasks left` line (or put it into a separate co #### Custom reactions -Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), -[`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. +Custom reactions can simply be created using the [`autorun`](../refguide/autorun.html), +[`reaction`](../refguide/reaction.html) or [`when`](../refguide/when.html) functions to fit your specific situations. For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: @@ -306,7 +306,7 @@ Why does a new message get printed each time the `unfinishedTodoCount` is change _MobX reacts to any existing observable property that is read during the execution of a tracked function._ -For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](https://mobx.js.org/best/react.html). +For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](../best/react.html). ## MobX: Simple and scalable From ec71fbb409beb65ab835513e0209f58ac7fedc3b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 14:23:20 +0200 Subject: [PATCH 0338/1043] Try to document the new decorator story/codemod. Moved the details from README and rewrite decorators.md. Try to figure out the behavior of the codemod. --- docs/README.md | 43 +-------- docs/best/decorators.md | 182 +++++++++++++----------------------- docs/refguide/observable.md | 8 +- notes-docs.md | 2 +- website/i18n/en.json | 4 +- 5 files changed, 76 insertions(+), 163 deletions(-) diff --git a/docs/README.md b/docs/README.md index 2fad10819..e12460084 100644 --- a/docs/README.md +++ b/docs/README.md @@ -162,8 +162,7 @@ Computations like these resemble formulas in spreadsheet programs like MS Excel. ### makeAutoObservable -The above code can be simplified using `makeAutoObservable`. With this, MobX -automatically declares normal properties as `observable`, getter properties (`unfinishedTodoCount`) as `computed`, and other methods (`toggle`) as `action`. +The above code can be simplified using `makeAutoObservable`. With this, MobX automatically declares normal properties as `observable`, getter properties (`unfinishedTodoCount`) as `computed`, and other methods (`toggle`) as `action`. ```javascript import { makeAutoObservable } from "mobx" @@ -174,7 +173,7 @@ class Todo { finished = false constructor() { - makeAutoObservable(this, ["id"]) + makeAutoObservable(this, { id: false }) } toggle() { @@ -193,45 +192,11 @@ class TodoList { } ``` -As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by listing it as an exception in the second argument to `makeAutoObservable`. +As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by telling `makeAutoObservable` not to do anything with it. ### Decorators -MobX before version 6 encouraged the use of ES.next decorators to mark things as observable, computed and actions. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. - -But many existing code bases that use MobX still use them, and a lot of the documentation material online uses them as well. And you can still use them in MobX 6 and above. The equivalent of the above code using decorators looks like this: - -```javascript -import { makeObservable, observable, computed, action } from "mobx" - -class Todo { - id = Math.random() - @observable title = "" - @observable finished = false - - constructor() { - makeObservable(this) - } - - @action - toggle() { - this.finished = !finished - } -} - -class TodoList { - @observable todos = [] - - @computed - get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } - - constructor() { - makeObservable(this) - } -} -``` +Wait! Didn't MobX use decorators for this? That's true, but in MobX 6 we have chosen to move away from them. Here is the gist on decorator support in MobX 6: diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 87479a557..90e961e13 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,155 +1,92 @@ --- -sidebar_label: How to (not) use decorator syntax -title: How to (not) use decorators +sidebar_label: Decorators in MobX +title: Decorators in MobX hide_title: true --- -# How to (not) use decorators +# Decorators in MobX -
    +MobX before version 6 encouraged the use of ES.next decorators to mark things as observable, computed and action. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 in the interest of compatibility we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. -Using ES.next decorators in MobX is optional. This section explains how to use them, or how to avoid them. - -Advantages of using decorator syntax: - -- Minimizes boilerplate, declarative. -- Easy to use and read. A majority of the MobX users use them. - -Disadvantages of using decorator syntax: - -- Stage-2 ES.next feature -- Requires a little setup and transpilation, only supported with Babel / Typescript transpilation so far - -You can approach using decorators in two ways in MobX - -1. Enable the currently experimental decorator syntax in your compiler (read on) -2. Don't enable decorator syntax, but leverage the MobX built-in utility `decorate` to apply decorators to your classes / objects. - -Using decorator syntax: +But many existing code bases that use MobX still use them, and a lot of the documentation material online uses them as well. You can still use them with MobX 6 too! So let's examine what they look like: ```javascript -import { observable, computed, action } from "mobx" +import { makeObservable, observable, computed, action } from "mobx" -class Timer { - @observable start = Date.now() - @observable current = Date.now() +class Todo { + id = Math.random() + @observable title = "" + @observable finished = false - @computed - get elapsedTime() { - return this.current - this.start + "milliseconds" + constructor() { + makeObservable(this) } @action - tick() { - this.current = Date.now() + toggle() { + this.finished = !finished } } -``` - -Using the `decorate` utility: - -```javascript -import { observable, computed, action, decorate } from "mobx" -class Timer { - start = Date.now() - current = Date.now() +class TodoList { + @observable todos = [] - get elapsedTime() { - return this.current - this.start + "milliseconds" + @computed + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length } - tick() { - this.current = Date.now() + constructor() { + makeObservable(this) } } -decorate(Timer, { - start: observable, - current: observable, - elapsedTime: computed, - tick: action -}) -``` - -For applying multiple decorators on a single property, you can pass an array of decorators. The decorators application order is from right to left. - -```javascript -import { decorate, observable } from "mobx" -import { serializable, primitive } from "serializr" -import persist from "mobx-persist" - -class Todo { - id = Math.random() - title = "" - finished = false -} -decorate(Todo, { - title: [serializable(primitive), persist("object"), observable], - finished: [serializable(primitive), observable] -}) ``` -Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. +MobX before version 6 did not require the `makeObservable(this)` call in the constructor, but because it makes the implementation of decorator simpler and more compatible, MobX now does. This instructs MobX to make the instances observable following the information in the decorators -- the decorators take the place of the second argument to `makeObservable`. ---- +## Upgrading using the `undecorate` codemod -The `observer` function from `mobx-react` is both a decorator and a function, that means that all these syntax variants will work: +If you are a MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. -```javascript -@observer -class Timer extends React.Component { - /* ... */ -} +You can convert your project using [jscodeshift](https://github.com/facebook/jscodeshift), which +is a dev dependency of MobX. -const Timer = observer(class Timer extends React.Component { - /* ... */ -}) +Convert all files in directory `src`. This gets rid of all uses of MobX decorators and +replaces them with the equivalent `makeObservable(this, {...})` invocation: -const Timer = observer((props) => ( - /* rendering */ -)) +```shell +yarn jscodeshift -t mobx/codemod/undecorator.ts --extensions=js,jsx,ts,tsx src ``` -## Enabling decorator syntax - -If you want to use decorators follow the following steps. +If you want to retain decorators and only introduce `makeObservable(this)` where you +required, you can use the `--keepDecorators` option: -**TypeScript** - -Enable the compiler option `"experimentalDecorators": true` in your `tsconfig.json`. - -**Babel 6: using `babel-preset-mobx`** +```shell +yarn jscodeshift -t mobx/codemod/undecorate.ts --extensions=js,jsx,ts,tsx src --keepDecorators=true +``` -A more convenient way to setup Babel for usage with mobx is to use the [`mobx`](https://github.com/zwhitchcox/babel-preset-mobx) preset, that incorporates decorators and several other plugins typically used with mobx: +Convert single file and everything it imports: -``` -npm install --save-dev babel-preset-mobx +```shell +yarn jscodeshift -t mobx/codemod/undecorate.ts myfile.js ``` -.babelrc: +Convert an individual file, leaving any imports unchanged using `--ignoreImports`: -```json -{ - "presets": ["mobx"] -} +```shell +yarn jscodeshift -t mobx/codemod/undecorate.ts myfile.js --ignoreImports=true ``` -**Babel 6: manually enabling decorators** +## How to enable decorator support -To enable support for decorators without using the mobx preset, follow the following steps. -Install support for decorators: `npm i --save-dev babel-plugin-transform-decorators-legacy`. And enable it in your `.babelrc` file: +We do not recommend new codebases that use MobX use decorators until such point as they become +an official part of the language, but you can still use them. It does require setup for transpilation: you have to use Babel or TypeScript. -```json -{ - "presets": ["es2015", "stage-1"], - "plugins": ["transform-decorators-legacy"] -} -``` +### TypeScript -Note that the order of plugins is important: `transform-decorators-legacy` should be listed _first_. -Having issues with the babel setup? Check this [issue](https://github.com/mobxjs/mobx/issues/105) first. +Enable the compiler option `"experimentalDecorators": true` in your `tsconfig.json`. -**Babel 7** +### Babel 7 Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators`. And enable it in your `.babelrc` file: @@ -162,17 +99,30 @@ Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-p } ``` -Note that the `legacy` mode is important (as is putting the decorators proposal first). Non-legacy mode is [WIP](https://github.com/mobxjs/mobx/pull/1732). +Note that the `legacy` mode is important (as is putting the decorators proposal first). -## Decorator syntax and Create React App (v1) +### Decorator syntax and Create React App (v2) -- Decorators are not supported out of the box in `create-react-app@1.*`. To fix this, you can either use the `decorate` utility, eject, or use the [react-app-rewired](https://github.com/timarney/react-app-rewired/tree/master/packages/react-app-rewire-mobx) package. +- Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1` and newer. In older versions or when using vanilla JavaScript use eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. -## Decorator syntax and Create React App (v2) +### Using `observer` from `mobx-react` -- Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1`. In older versions or when using vanilla JavaScript use either the `decorate` utility, eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. +The `observer` function from `mobx-react` is both a decorator and a function, that means that all these syntax variants will work: ---- +```javascript +const Timer = observer((props) => ( + /* rendering */ +)) + +const Timer = observer(class Timer extends React.Component { + /* ... */ +}) + +@observer +class Timer extends React.Component { + /* ... */ +} +``` ## Disclaimer: Limitations of decorator syntax: diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index b91df3829..a86a5a7be 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -6,8 +6,6 @@ hide_title: true # observable -
    -
    egghead.io lesson 1: observable & observer
    @@ -38,14 +36,14 @@ The following conversion rules are applied, but can be fine-tuned by using _modi 1. If _value_ is an ES6 `Set`: a new Observable Set will be returned. 1. If _value_ is an array, a new [Observable Array](array.md) will be returned. 1. If _value_ is an object _without_ prototype, all its current properties will be made observable. See [Observable Object](object.md) -1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `extendObservable` in the constructor, or `@observable` / `decorate` in its class definition instead. +1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `makeObservable` in the constructor instead. These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. Some notes: -- To use the `@observable` decorator, make sure that [decorators are enabled](observable-decorator.md) in your transpiler (babel or typescript). - By default, making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using _modifiers_. -- _[MobX 4 and lower]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. +- To use the `@observable` decorator, make sure that [decorators are enabled](observable-decorator.md) in your transpiler (babel or typescript). +- _[Environments without Proxy support]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. Some examples: diff --git a/notes-docs.md b/notes-docs.md index 1fcf5709b..12440aad6 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -32,7 +32,7 @@ Questions: - When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. -- What's the codemod all about? +- Codemods. The jscodeshift command uses `yarn`. What's the `npm` equivalent (as we use npm elsewhere in examples)? Does `mobx/codemod/undecorate.ts` work? Should we specify -extensions=js,js,ts,tsx as well to include typescript? - There are a lot of references to external documentation resources. They can probably use a pruning. diff --git a/website/i18n/en.json b/website/i18n/en.json index 6bf4514cc..d07f75fb6 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -10,8 +10,8 @@ "sidebar_label": "async actions & flows" }, "best/decorators": { - "title": "How to (not) use decorators", - "sidebar_label": "How to (not) use decorator syntax" + "title": "Decorators in MobX", + "sidebar_label": "Decorators in MobX" }, "best/devtools": { "title": "MobX + React DevTools", From 2ed1ed7906790017a105ae76c890d79a48786442 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 14:25:10 +0200 Subject: [PATCH 0339/1043] Don't mention @observable here. --- docs/refguide/observable.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index a86a5a7be..ba3982ccb 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -27,7 +27,6 @@ hide_title: true Usage: - `observable(value)` -- `@observable classProperty = value` Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. @@ -42,7 +41,6 @@ These rules might seem complicated at first sight, but you will notice that in p Some notes: - By default, making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using _modifiers_. -- To use the `@observable` decorator, make sure that [decorators are enabled](observable-decorator.md) in your transpiler (babel or typescript). - _[Environments without Proxy support]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. Some examples: From 6dad352fa018778e5bf3b7ffb7d7195eb444a9ee Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 14:27:43 +0200 Subject: [PATCH 0340/1043] quote these. --- docs/best/decorators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 90e961e13..ee0ce983d 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -6,7 +6,7 @@ hide_title: true # Decorators in MobX -MobX before version 6 encouraged the use of ES.next decorators to mark things as observable, computed and action. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 in the interest of compatibility we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. +MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 in the interest of compatibility we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. But many existing code bases that use MobX still use them, and a lot of the documentation material online uses them as well. You can still use them with MobX 6 too! So let's examine what they look like: From 4f36ee2434320ba040ad05a98f6c081eab9a4193 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 24 Jun 2020 21:36:00 +0100 Subject: [PATCH 0341/1043] Better model for when state changes are allowed --- notes.md | 2 + src/api/autorun.ts | 3 +- src/api/when.ts | 5 +- src/core/action.ts | 28 ++--- src/core/computedvalue.ts | 6 +- src/core/derivation.ts | 13 +-- src/core/globalstate.ts | 10 -- src/mobx.ts | 2 +- test/v5/base/__snapshots__/action.js.snap | 4 +- test/v5/base/action.js | 119 +++++++++++++++++----- test/v5/base/errorhandling.js | 4 +- test/v5/base/map.js | 6 +- test/v5/base/strict-mode.js | 2 +- 13 files changed, 128 insertions(+), 76 deletions(-) diff --git a/notes.md b/notes.md index 29cb7b933..6d1042487 100644 --- a/notes.md +++ b/notes.md @@ -93,6 +93,8 @@ PHilosophy: one thing to do things - [ ] makeObservable + private members in TypeScript (second call? computed name? tsignore?) - [ ] print deprecation warnings for all old apis in mobx 4/5 - [ ] Breaking: it is no longer safe to call action from autorun. Use effect or reaction instead. +- [ ] \_allowStateChangesINComputation is no longer needed, us `runInAction` instead. +- [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. ## NOTES diff --git a/src/api/autorun.ts b/src/api/autorun.ts index 46658ddcc..2d29845b4 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -13,6 +13,7 @@ import { isPlainObject, die } from "../internal" +import { allowStateChanges } from "../core/action" export interface IAutorunOptions { delay?: number @@ -144,7 +145,7 @@ export function reaction( if (r.isDisposed_) return let changed = false r.track(() => { - const nextValue = expression(r) + const nextValue = allowStateChanges(false, () => expression(r)) changed = firstTime || !equals(value, nextValue) value = nextValue }) diff --git a/src/api/when.ts b/src/api/when.ts index c72c1c7ab..3e6c99bd8 100644 --- a/src/api/when.ts +++ b/src/api/when.ts @@ -7,6 +7,7 @@ import { getNextId, die } from "../internal" +import { allowStateChanges } from "../core/action" export interface IWhenOptions { name?: string @@ -52,7 +53,9 @@ function _when(predicate: () => boolean, effect: Lambda, opts: IWhenOptions): IR const effectAction = createAction(opts.name + "-effect", effect as Function) // eslint-disable-next-line var disposer = autorun(r => { - if (predicate()) { + // predicate should not change state + let cond = allowStateChanges(false, predicate) + if (cond) { r.dispose() if (timeoutHandle) clearTimeout(timeoutHandle) effectAction() diff --git a/src/core/action.ts b/src/core/action.ts index 97bc7a78a..3407e894a 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -12,9 +12,9 @@ import { allowStateReadsStart, allowStateReadsEnd, ACTION, - EMPTY_ARRAY + EMPTY_ARRAY, + die } from "../internal" -import { die } from "../errors" // we don't use globalState for these in order to avoid possible issues with multiple // mobx versions @@ -94,9 +94,12 @@ export function _startAction( } const prevDerivation_ = globalState.trackingDerivation const runAsAction = !canRunAsDeriviation || !prevDerivation_ - if (runAsAction) untrackedStart() startBatch() - const prevAllowStateChanges_ = allowStateChangesStart(runAsAction) + let prevAllowStateChanges_ = globalState.allowStateChanges // by default preserve previous allow + if (runAsAction) { + untrackedStart() + prevAllowStateChanges_ = allowStateChangesStart(true) + } const prevAllowStateReads_ = allowStateReadsStart(true) const runInfo = { runAsAction_: runAsAction, @@ -133,13 +136,11 @@ export function _endAction(runInfo: IActionRunInfo) { export function allowStateChanges(allowStateChanges: boolean, func: () => T): T { const prev = allowStateChangesStart(allowStateChanges) - let res: T try { - res = func() + return func() } finally { allowStateChangesEnd(prev) } - return res } export function allowStateChangesStart(allowStateChanges: boolean) { @@ -151,16 +152,3 @@ export function allowStateChangesStart(allowStateChanges: boolean) { export function allowStateChangesEnd(prev: boolean) { globalState.allowStateChanges = prev } - -// TODO: kill and make the default -export function allowStateChangesInsideComputed(func: () => T): T { - const prev = globalState.computationDepth - globalState.computationDepth = 0 - let res: T - try { - res = func() - } finally { - globalState.computationDepth = prev - } - return res -} diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 4fe7f8e12..575841134 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -30,6 +30,7 @@ import { UPDATE, die } from "../internal" +import { allowStateChangesStart, allowStateChangesEnd } from "./action" export interface IComputedValue { get(): T @@ -211,7 +212,8 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva computeValue_(track: boolean) { this.isComputing_ = true - globalState.computationDepth++ + // don't allow state changes during computation + const prev = allowStateChangesStart(false) let res: T | CaughtException if (track) { res = trackDerivedFunction(this, this.derivation_, this.scope_) @@ -226,7 +228,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } } } - globalState.computationDepth-- + allowStateChangesEnd(prev) this.isComputing_ = false return res } diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 8384f47ac..66098d2b3 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -137,19 +137,14 @@ export function checkIfStateModificationsAreAllowed(atom: IAtom) { return } const hasObservers = atom.observers_.size > 0 - // Should never be possible to change an observed observable from inside computed, see #798 - if (globalState.computationDepth > 0 && hasObservers) - // TODO: prefix with mobx - console.warn( - `Computed values are not allowed to cause side effects by changing observables that are already being observed. Tried to modify: ${atom.name_}` - ) // Should not be possible to change observed state outside strict mode, except during initialization, see #563 if (!globalState.allowStateChanges && (hasObservers || globalState.enforceActions === "always")) // TODO: prefix with mobx console.warn( - (globalState.enforceActions - ? "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: " - : "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, the render function of a React component? Tried to modify: ") + + "[MobX] " + + (globalState.enforceActions + ? "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `runInAction` if this change is intended. Tried to modify: " + : "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ") + atom.name_ ) } diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 8cfabb76a..765216697 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -42,16 +42,6 @@ export class MobXGlobals { */ trackingDerivation: IDerivation | null = null - /** - * Are we running a computation currently? (not a reaction) - * Note that generally we check trackingDerivation, to see if - * we are in a derivation (and not in an effect for example). - * - * computationDepth can be used to see if we have any computation in the stack - * // TODO: remove? - */ - computationDepth = 0 - /** * Each time a derivation is tracked, it is assigned a unique run-id */ diff --git a/src/mobx.ts b/src/mobx.ts index 483a11340..8c36f3469 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -115,7 +115,7 @@ export { getAtom, getAdministration as _getAdministration, allowStateChanges as _allowStateChanges, - allowStateChangesInsideComputed as _allowStateChangesInsideComputed, + runInAction as _allowStateChangesInsideComputed, // This has become the default behavior in Mobx 6 Lambda, isArrayLike, $mobx, diff --git a/test/v5/base/__snapshots__/action.js.snap b/test/v5/base/__snapshots__/action.js.snap index e94836830..fa15a00a4 100644 --- a/test/v5/base/__snapshots__/action.js.snap +++ b/test/v5/base/__snapshots__/action.js.snap @@ -2,13 +2,13 @@ exports[`error logging, #1836 - 1 1`] = ` Array [ - " [mobx] (error in reaction 'Autorun@63' suppressed, fix error of causing action below)", + " [mobx] (error in reaction 'Autorun@68' suppressed, fix error of causing action below)", " Error: Action error", ] `; exports[`error logging, #1836 - 2 1`] = ` Array [ - " [mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@66]'", + " [mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: 'Reaction[Autorun@71]'", ] `; diff --git a/test/v5/base/action.js b/test/v5/base/action.js index d2c071dc1..62692cfed 100644 --- a/test/v5/base/action.js +++ b/test/v5/base/action.js @@ -177,45 +177,37 @@ test("should be possible to change unobserved state in an action called from com mobx._resetGlobalState() }) -test.skip("should be possible to change observed state in an action called from computed if run inside _allowStateChangesInsideComputed", () => { +test("should be possible to change observed state in an action called from computed", () => { const a = mobx.observable.box(2) const d = mobx.autorun(() => { a.get() }) const testAction = mobx.action(() => { - mobx._allowStateChangesInsideComputed(() => { - a.set(3) - // a second level computed should throw - expect(utils.grabConsole(() => c2.get())).toMatch( - /Computed values are not allowed to cause side effects by changing observables that are already being observed/ - ) - }) - expect(a.get()).toBe(3) - expect(() => { - a.set(4) - }).toThrowError( - /Computed values are not allowed to cause side effects by changing observables that are already being observed/ - ) + a.set(5) // this is fine + expect(a.get()).toBe(5) }) const c = mobx.computed(() => { + expect( + utils.grabConsole(() => { + a.set(4) + }) + ).toMatchInlineSnapshot( + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@29"` + ) + expect(a.get()).toBe(4) testAction() return a.get() }) - const c2 = mobx.computed(() => { - a.set(6) - return a.get() - }) - - c.get() + expect(c.get()).toBe(5) mobx._resetGlobalState() d() }) -test("should not be possible to change observed state in an action called from computed", () => { +test("should be possible to change observed state in an action called from computed", () => { const a = mobx.observable.box(2) const d = mobx.autorun(() => { a.get() @@ -234,9 +226,7 @@ test("should not be possible to change observed state in an action called from c utils.grabConsole(() => { c.get() }) - ).toMatch( - /Computed values are not allowed to cause side effects by changing observables that are already being observed/ - ) + ).toBe("") mobx._resetGlobalState() d() @@ -577,3 +567,84 @@ test("given function declaration, the action name should be as the function name const a1 = mobx.action(function testAction() {}) expect(a1.name).toBe("testAction") }) + +test("auto action can be used in a derivation and is tracked", () => { + const a = mobx.observable(1) + const events = [] + + const double = mobx._autoAction(() => { + return a.get() * 2 + }) + + const d = mobx.autorun(() => { + events.push(double()) + }) + + a.set(2) + expect(events).toEqual([2, 4]) + d() +}) + +test("auto action can be used to update and is batched", () => { + const a = mobx.observable(1) + const events = [] + + const d = mobx.autorun(() => { + events.push(a.get() * 2) + }) + + mobx._autoAction(() => { + a.set(2) + a.set(3) + })() + + expect(events).toEqual([2, 6]) // No 4! + d() +}) + +test("auto action should not update state from inside a derivation", async () => { + const a = mobx.observable(1) + + const d = mobx.autorun(() => a.get()) // observe + + const double = mobx._autoAction(() => { + a.set(a.get() * 2) + }) + + await mobx.when(() => { + expect( + utils.grabConsole(() => { + double() + }) + ).toMatchInlineSnapshot( + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@79"` + ) + return a.get() === 2 + }) + d() +}) + +test("auto action should not update state from inside a derivation", async () => { + const a = mobx.observable(1) + + const d = mobx.autorun(() => a.get()) // observe + + const double = mobx._autoAction(() => { + a.set(a.get() * 2) + }) + + await mobx.when(() => { + expect( + utils.grabConsole(() => { + mobx.runInAction(() => { + // extra nesting, just in case + mobx._autoAction(() => { + double() + })() + }) + }) + ).toBe("") + return a.get() === 2 + }) + d() +}) diff --git a/test/v5/base/errorhandling.js b/test/v5/base/errorhandling.js index ee0740885..b982b61f8 100644 --- a/test/v5/base/errorhandling.js +++ b/test/v5/base/errorhandling.js @@ -155,7 +155,7 @@ test("deny state changes in views", function() { y.get() }) ).toMatchInlineSnapshot( - `" Computed values are not allowed to cause side effects by changing observables that are already being observed. Tried to modify: ObservableValue@26"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@26"` ) checkGlobalState() @@ -202,7 +202,7 @@ test("deny array change in view", function(done) { y.get() }) ).toMatchInlineSnapshot( - `" Computed values are not allowed to cause side effects by changing observables that are already being observed. Tried to modify: ObservableArray@36"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableArray@36"` ) expect(z.slice()).toEqual([3, 3]) diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 03962f140..bd05bdf01 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -661,7 +661,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.set("x", 1) }) ).toMatchInlineSnapshot( - `" Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`action\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` ) expect( @@ -669,7 +669,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.set("x", 2) }) ).toMatchInlineSnapshot( - `" Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`action\` if this change is intended. Tried to modify: ObservableMap@69.x"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.x"` ) expect( @@ -677,7 +677,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.delete("x") }) ).toMatchInlineSnapshot( - `" Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`action\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` ) d() diff --git a/test/v5/base/strict-mode.js b/test/v5/base/strict-mode.js index f5deaf73d..a8ed0a6f6 100644 --- a/test/v5/base/strict-mode.js +++ b/test/v5/base/strict-mode.js @@ -5,7 +5,7 @@ const mobx = require("../../../src/mobx.ts") const utils = require("../../v5/utils/test-utils") const { makeObservable } = mobx -const strictError = /Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: / +const strictError = /Since strict-mode is enabled, changing observed observable values outside actions is not allowed./ test("strict mode should not allow changes outside action", () => { const a = mobx.observable.box(2) From 62a7fa7f8e1204f02fba6050286b3c151163406e Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 25 Jun 2020 17:02:42 +0100 Subject: [PATCH 0342/1043] makeAutoObservable uses _autoAction now (and some cleanup) --- src/api/action.ts | 55 +++++++++++++++++---------------- src/api/annotation.ts | 2 ++ src/api/autorun.ts | 4 +-- src/api/computed.ts | 4 +-- src/api/intercept-read.ts | 4 +-- src/api/makeObservable.ts | 29 ++++++++++++----- src/api/observable.ts | 4 +-- src/api/when.ts | 4 +-- src/core/computedvalue.ts | 5 +-- src/core/globalstate.ts | 3 +- src/types/intercept-utils.ts | 3 +- src/types/observableobject.ts | 6 ++-- src/types/observablevalue.ts | 4 +-- test/v5/base/make-observable.ts | 35 ++++++++++++++++++++- 14 files changed, 106 insertions(+), 56 deletions(-) diff --git a/src/api/action.ts b/src/api/action.ts index 8bf7dcc4e..9009c61a9 100644 --- a/src/api/action.ts +++ b/src/api/action.ts @@ -13,6 +13,9 @@ import { export const ACTION = "action" export const ACTION_BOUND = "action.bound" +export const AUTOACTION = "autoAction" +export const AUTOACTION_BOUND = "autoAction.bound" + const ACTION_UNNAMED = "" export interface IActionFactory extends Annotation, PropertyDecorator { @@ -32,25 +35,35 @@ interface IBoundActionFactory extends Annotation, PropertyDecorator { (name: string): Annotation & PropertyDecorator } -export const action: IActionFactory = function action(arg1, arg2?): any { - // action(fn() {}) - if (isFunction(arg1)) return createAction(arg1.name || ACTION_UNNAMED, arg1) - // action("name", fn() {}) - if (isFunction(arg2)) return createAction(arg1, arg2) - // @action - if (isStringish(arg2)) { - return storeDecorator(arg1, arg2, ACTION) - } - // Annation: action("name") & @action("name") - if (isStringish(arg1)) { - return createDecoratorAndAnnotation(ACTION, arg1) - } +function createActionFactory( + autoAction: boolean, + annotation: Annotation["annotationType_"] +): IActionFactory { + const res: IActionFactory = function action(arg1, arg2?): any { + // action(fn() {}) + if (isFunction(arg1)) return createAction(arg1.name || ACTION_UNNAMED, arg1, autoAction) + // action("name", fn() {}) + if (isFunction(arg2)) return createAction(arg1, arg2, autoAction) + // @action + if (isStringish(arg2)) { + return storeDecorator(arg1, arg2, annotation) + } + // Annation: action("name") & @action("name") + if (isStringish(arg1)) { + return createDecoratorAndAnnotation(annotation, arg1) + } + + if (__DEV__) die("Invalid arguments for `action`") + } as any + res.annotationType_ = annotation + return res +} - if (__DEV__) die("Invalid arguments for `action`") -} as any -action.annotationType_ = ACTION +export const action: IActionFactory = createActionFactory(false, ACTION) +export const autoAction: IActionFactory = createActionFactory(true, AUTOACTION) action.bound = createDecorator(ACTION_BOUND) +autoAction.bound = createDecorator(AUTOACTION_BOUND) export function runInAction(fn: () => T): T { return executeAction(fn.name || ACTION_UNNAMED, false, fn, this, undefined) @@ -63,13 +76,3 @@ export function isAction(thing: any) { export function defineBoundAction(target: any, propertyName: string, fn: Function) { addHiddenProp(target, propertyName, createAction(propertyName, fn.bind(target))) } - -export function autoAction(fn: T): T -export function autoAction(name: string, fn: T): T -export function autoAction(arg1, arg2?): any { - // action(fn() {}) - if (isFunction(arg1)) return createAction(arg1.name || ACTION_UNNAMED, arg1, true) - // action("name", fn() {}) - if (isFunction(arg2)) return createAction(arg1, arg2, true) - if (__DEV__) die("Invalid arguments for `autoAction`") -} diff --git a/src/api/annotation.ts b/src/api/annotation.ts index e839e639c..84adde2cb 100644 --- a/src/api/annotation.ts +++ b/src/api/annotation.ts @@ -8,6 +8,8 @@ export type Annotation = { | "computed.struct" | "action" | "action.bound" + | "autoAction" + | "autoAction.bound" arg_?: any } diff --git a/src/api/autorun.ts b/src/api/autorun.ts index 2d29845b4..665f5299f 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -11,9 +11,9 @@ import { isAction, isFunction, isPlainObject, - die + die, + allowStateChanges } from "../internal" -import { allowStateChanges } from "../core/action" export interface IAutorunOptions { delay?: number diff --git a/src/api/computed.ts b/src/api/computed.ts index c5ea74d23..f86f44d6a 100644 --- a/src/api/computed.ts +++ b/src/api/computed.ts @@ -7,9 +7,9 @@ import { isStringish, isPlainObject, isFunction, - assign + assign, + die } from "../internal" -import { die } from "../errors" export const COMPUTED = "computed" export const COMPUTED_STRUCT = "computed.struct" diff --git a/src/api/intercept-read.ts b/src/api/intercept-read.ts index c0ba942ba..d1ef39f32 100644 --- a/src/api/intercept-read.ts +++ b/src/api/intercept-read.ts @@ -9,9 +9,9 @@ import { isObservableObject, isObservableValue, ObservableSet, - die + die, + isStringish } from "../internal" -import { isStringish } from "../utils/utils" export type ReadInterceptor = (value: any) => T diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index 438aadcb6..1011b96b8 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -2,6 +2,7 @@ import { asObservableObject, addHiddenProp, action, + autoAction, isAction, computed, observable, @@ -21,6 +22,8 @@ import { die, ACTION, ACTION_BOUND, + AUTOACTION, + AUTOACTION_BOUND, COMPUTED, COMPUTED_STRUCT, OBSERVABLE, @@ -29,8 +32,8 @@ import { OBSERVABLE_STRUCT } from "../internal" -function makeAction(target, key, name, fn) { - addHiddenProp(target, key, action(name || key, fn)) +function makeAction(target, key, name, fn, asAutoAction) { + addHiddenProp(target, key, asAutoAction ? autoAction(name || key, fn) : action(name || key, fn)) } function getInferredAnnotation( @@ -40,7 +43,7 @@ function getInferredAnnotation( if (desc.get) return computed if (desc.set) return false // ignore pure setters // if already wrapped in action, don't do that another time, but assume it is already set up properly - if (isFunction(desc.value)) return isAction(desc.value) ? false : action.bound + if (isFunction(desc.value)) return isAction(desc.value) ? false : autoAction.bound // if (!desc.configurable || !desc.writable) return false return defaultAnnotation ?? observable.deep } @@ -82,21 +85,31 @@ export function makeProperty( if (!annotation || annotation === true || !annotation.annotationType_) { return die(2, key) } - switch (annotation.annotationType_) { + const type = annotation.annotationType_ + switch (type) { + case AUTOACTION: case ACTION: { const fn = descriptor.value if (!isFunction(fn)) die(3, key) if (owner !== target && !forceCopy) { - if (!isAction(owner[key])) makeAction(owner, key, annotation.arg_, fn) + if (!isAction(owner[key])) + makeAction(owner, key, annotation.arg_, fn, type === AUTOACTION) } else { - makeAction(target, key, annotation.arg_, fn) + makeAction(target, key, annotation.arg_, fn, type === AUTOACTION) } break } + case AUTOACTION_BOUND: case ACTION_BOUND: { const fn = descriptor.value if (!isFunction(fn)) die(3, key) - makeAction(target, key, annotation.arg_, fn.bind(adm.proxy_ || target)) + makeAction( + target, + key, + annotation.arg_, + fn.bind(adm.proxy_ || target), + type === AUTOACTION_BOUND + ) break } case COMPUTED: @@ -218,7 +231,7 @@ function extractAnnotationsFromProto(proto: any, collector: AnnotationsMap { get(): T diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 765216697..b96f10443 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -1,5 +1,4 @@ -import { IDerivation, IObservable, Reaction } from "../internal" -import { die } from "../errors" +import { IDerivation, IObservable, Reaction, die } from "../internal" /** * These values will persist if global state is reset diff --git a/src/types/intercept-utils.ts b/src/types/intercept-utils.ts index 4fc996409..df95fcefc 100644 --- a/src/types/intercept-utils.ts +++ b/src/types/intercept-utils.ts @@ -1,5 +1,4 @@ -import { Lambda, once, untrackedEnd, untrackedStart } from "../internal" -import { die } from "../errors" +import { Lambda, once, untrackedEnd, untrackedStart, die } from "../internal" export type IInterceptor = (change: T) => T | null diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 012b00eb1..ff5f4ad04 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -31,10 +31,10 @@ import { startBatch, stringifyKey, globalState, - ADD + ADD, + UPDATE, + die } from "../internal" -import { UPDATE } from "./observablearray" -import { die } from "../errors" // TODO: kill export interface IObservableObject { diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index ade0b7184..197bbc8df 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -22,9 +22,9 @@ import { spyReportStart, toPrimitive, globalState, - IUNCHANGED + IUNCHANGED, + UPDATE } from "../internal" -import { UPDATE } from "./observablearray" export interface IValueWillChange { object: any diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index e36054f1b..194704697 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -7,7 +7,8 @@ import { isObservableProp, isComputedProp, isAction, - makeAutoObservable + makeAutoObservable, + autorun } from "../../../src/mobx" test("makeObservable picks up decorators", () => { @@ -223,3 +224,35 @@ test("makeAutoObservable cannot be used on observable objects", () => { `"[MobX] makeAutoObservable can only be used on objects not already made observable"` ) }) + +test("makeAutoObservable actions can be used for state updaters and state readers", () => { + class A { + x = 1 + + constructor() { + makeAutoObservable(this) + } + + double() { + return this.x * 2 + } + + addTwo() { + this.x++ + this.x++ + } + } + + const events: number[] = [] + const a = new A() + const d = autorun(() => { + events.push(a.double()) + }) + + a.addTwo() + + // tracked and batched! + expect(events).toEqual([2, 6]) + + d() +}) From df7dc1c7b6ccb373c6572d294715ee32ef8400c6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 20:06:43 +0200 Subject: [PATCH 0343/1043] Consolidate link sections. Make links absolute again. I realized that links can't be relative as README is also in use outside the website itself, like on github. --- docs/README.md | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/docs/README.md b/docs/README.md index e12460084..165439348 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,8 +18,6 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -
    - MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). **🥇Gold sponsors (\$3000+ total contribution):**
    @@ -53,9 +51,9 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo * https://unpkg.com/mobx/lib/mobx.umd.js * https://cdnjs.com/libraries/mobx -# Browser support +# Environment support -- MobX >=6 runs in any ES5 environment. If your environment does not have [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy) you have to configure it to use compatibile property tracking, which does have some [limitations](#limitations-without-proxy-support). +- MobX >=6 runs in any ES5 environment, which includes web browsers and node. If your environment does not have [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy) you have to configure it to use compatibile property tracking, which does have some [limitations](#limitations-without-proxy-support). _Tip: the main entry point of the MobX 6 package ships with ES5 code for backward compatibility. But if you only intend to run MobX 6 on modern browsers, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ @@ -63,22 +61,6 @@ _Tip: the main entry point of the MobX 6 package ships with ES5 code for backwar - [中文](http://cn.mobx.js.org) -## Getting started - -- egghead.io course -- [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -- Videos: - - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) -- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) -- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - ## Introduction MobX is a battle tested library that makes state management simple and scalable by transparently applying functional reactive programming (TFRP). @@ -132,7 +114,7 @@ But what about `toggle`, which we marked `action`? ### Actions -In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](../refguide/action.html). +In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](http://mobxjs.github.io/mobx/refguide/action.html). MobX enforces this as it helps you structure your code and prevents you from inadvertantly changing state when you don't want to. @@ -217,8 +199,7 @@ In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_pro #### React components -If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the `observer` function -from the `mobx-react` package. +If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function from the `mobx-react` package. ```javascript import React from "react" @@ -254,8 +235,8 @@ However, if you would remove the `Tasks left` line (or put it into a separate co #### Custom reactions -Custom reactions can simply be created using the [`autorun`](../refguide/autorun.html), -[`reaction`](../refguide/reaction.html) or [`when`](../refguide/when.html) functions to fit your specific situations. +Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), +[`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: @@ -271,7 +252,7 @@ Why does a new message get printed each time the `unfinishedTodoCount` is change _MobX reacts to any existing observable property that is read during the execution of a tracked function._ -For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](../best/react.html). +For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](http://mobxjs.github.io/mobx/best/react.html). ## MobX: Simple and scalable @@ -325,6 +306,21 @@ And finally kudos for all the people that believed in, tried, validated and even ## Further resources and documentation +## Getting started + +- egghead.io course +- [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) +- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- Videos: + - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) +- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) +- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) - [MobX homepage](http://mobxjs.github.io) - [API overview](http://mobxjs.github.io/mobx/refguide/api.html) From 4998746605c6513bed5967fcc3c7c99776dfb0f9 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 20:32:57 +0200 Subject: [PATCH 0344/1043] Split out installation page. Model it on the page for immer. Move various details surrounding installation onto this page. Rename "introduction" to "basics" following immer, as we will have more pages in this now. --- docs/README.md | 17 ++++-------- docs/best/limitations-without-proxies.md | 2 +- docs/intro/installation.md | 35 ++++++++++++++++++++++++ website/i18n/en.json | 8 ++++-- website/sidebars.json | 3 +- 5 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 docs/intro/installation.md diff --git a/docs/README.md b/docs/README.md index 165439348..7715417ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ --- title: Introduction -sidebar_label: One page summary +sidebar_label: Introduction hide_title: true --- @@ -44,18 +44,11 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo # Installation -- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. +MobX >=6 runs in any ES5 environment, which includes web browsers and NodeJS. -- CDN: +Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. -* https://unpkg.com/mobx/lib/mobx.umd.js -* https://cdnjs.com/libraries/mobx - -# Environment support - -- MobX >=6 runs in any ES5 environment, which includes web browsers and node. If your environment does not have [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy) you have to configure it to use compatibile property tracking, which does have some [limitations](#limitations-without-proxy-support). - -_Tip: the main entry point of the MobX 6 package ships with ES5 code for backward compatibility. But if you only intend to run MobX 6 on modern browsers, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ +[More about installing MobX](http://mobxjs.github.io/mobx/intro/installation.html) ## Translations @@ -190,7 +183,7 @@ Here is the gist on decorator support in MobX 6: - There are code mods to help you upgrade existing code to be compliant with MobX 6. -The [decorators guide](best/decorators.md) has more information. +The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. ### Reactions diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 5037cf08e..78581c6a6 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -6,7 +6,7 @@ hide_title: true # Limitations without Proxy support -MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy), there are some limitations: +MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy), there are some limitations: - Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. - Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. diff --git a/docs/intro/installation.md b/docs/intro/installation.md new file mode 100644 index 000000000..fa1f571e7 --- /dev/null +++ b/docs/intro/installation.md @@ -0,0 +1,35 @@ +--- +title: Installation +sidebar_label: Installation +hide_title: true +--- + +# Installation + +MobX works in any ES5 environment, which includes browsers and NodeJS: + +- Yarn: `yarn add immer`. React bindings: `yarn add mobx-react` + +- NPM: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. + +- CDN: + - cndjs: https://cdnjs.com/libraries/mobx + - Unpkg: ` + - ⚠️ When using a CDN, it is best to check the url in your browser and see what version it resolves to, so that your users aren't accidentally served a newer version in the future when updates are release. So use an url like: https://unpkg.com/mobx@5.15.4/lib/mobx.umd.production.min.js instead. Substitute `production.min` with `development` in the URL for a development build. + +## MobX on older JavaScript environments? + +By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). For example, when running Microsoft Internet Explorer or React Native (if < v0.59 or when using the Hermes engine) on Android. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). + +You have to explicitly enable the fallback implementation by calling `enableES5()`: + +```javascript +import { enableES5 } from "mobx" + +enableES5() +``` + +## MobX on modern JavaScript environments? + +The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it +works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` diff --git a/website/i18n/en.json b/website/i18n/en.json index d07f75fb6..20630da9f 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -53,6 +53,10 @@ "title": "Concepts & Principles", "sidebar_label": "Concepts & Principles" }, + "intro/installation": { + "title": "Installation", + "sidebar_label": "Installation" + }, "intro/overview": { "title": "The gist of MobX", "sidebar_label": "The gist of MobX" @@ -62,7 +66,7 @@ }, "README": { "title": "Introduction", - "sidebar_label": "One page summary" + "sidebar_label": "Introduction" }, "refguide/action": { "title": "action", @@ -166,7 +170,7 @@ "Github": "Github" }, "categories": { - "Introduction": "Introduction", + "Basics": "Basics", "Making things observable": "Making things observable", "Reacting to observables": "Reacting to observables", "Updating observables": "Updating observables", diff --git a/website/sidebars.json b/website/sidebars.json index ea79a71f0..0f69d7bb1 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -1,7 +1,8 @@ { "docs": { - "Introduction": [ + "Basics": [ "README", + "intro/installation", "intro/concepts", "intro/overview" ], From 80da42351e5e553d9488c02632c9fb313a305796 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 25 Jun 2020 20:34:55 +0200 Subject: [PATCH 0345/1043] Remove additional header that was in there for no reason. --- docs/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 7715417ef..6e92388ff 100644 --- a/docs/README.md +++ b/docs/README.md @@ -299,8 +299,6 @@ And finally kudos for all the people that believed in, tried, validated and even ## Further resources and documentation -## Getting started - - egghead.io course - [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) - [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) From 33b2123f7a0270f5af365701d00ef91431ce20ba Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 25 Jun 2020 20:52:03 +0100 Subject: [PATCH 0346/1043] Some more cleanup --- notes.md | 25 ++++++++--------- src/api/decorators.ts | 5 ++-- src/api/extendobservable.ts | 5 ++-- src/api/makeObservable.ts | 21 +++++++-------- src/api/tojs.ts | 9 +++---- src/core/action.ts | 5 ++-- src/core/derivation.ts | 2 +- src/types/legacyobservablearray.ts | 9 +++---- src/types/observableobject.ts | 11 ++++---- src/utils/eq.ts | 5 ++-- src/utils/utils.ts | 43 +++++++++++++++++++++++------- test/v5/base/action.js | 4 +-- test/v5/base/errorhandling.js | 4 +-- 13 files changed, 86 insertions(+), 62 deletions(-) diff --git a/notes.md b/notes.md index 6d1042487..c08c4413c 100644 --- a/notes.md +++ b/notes.md @@ -1,18 +1,18 @@ ## Feature work - [ ] Build process - - [ ] kill v4 / v5 separation - - [ ] TSDX build process + - [x] kill v4 / v5 separation + - [x] TSDX build process - [ ] Smaller build - [x] fixup build, restore asset bundling - - [ ] create prod esm build? - - [ ] minimal dev errors - - [ ] invariant system from immer - - [ ] check all calls to top-level + - ~[ ] create prod esm build?~ + - [x] minimal dev errors + - [x] invariant system from immer + - [x] check all calls to top-level build, tree-shakeable etc? - - [ ] add **PURE** annotations? - - [ ] extract utils for getOwnPropertyDescriptor and defineProperty - - [ ] configure property mangling like in Immer. Will it save anything? + - [x] add **PURE** annotations? + - [x] extract utils for getOwnPropertyDescriptor and defineProperty + - [x] configure property mangling like in Immer. Will it save anything? - [ ] code mod - [x] code mod, run on v4 tests? - [x] codemod TS @@ -37,21 +37,22 @@ - [x] observable / extendObservable use decorators args - [x] observable; support `false` as argument - [ ] misc - - [ ] revisit safety model + - [x] revisit safety model - [ ] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! - - [ ] verify: action called from computed throws? + - [x] verify: action called from computed throws? - [ ] apply deprecation of find and findIndex error - [ ] verify perf / memory changes - [ ] investigate skipped tests - [ ] process TODO's - [ ] weakmap for hasMaps in Map (and Set?) - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - - [ ] update useLocalStore in mobx-react-lite to use makeObservable + - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - [ ] include #2343 - [ ] default observable requires reaction? - [ ] kill globalstate options? - [ ] no auto lifting? https://twitter.com/getify/status/1258137826241241088 - [ ] flow types + - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. ## Docs / migration guide diff --git a/src/api/decorators.ts b/src/api/decorators.ts index a361fc062..16610589b 100644 --- a/src/api/decorators.ts +++ b/src/api/decorators.ts @@ -5,7 +5,8 @@ import { makeObservable, assign, getDescriptor, - hasProp + hasProp, + objectPrototype } from "../internal" export const mobxDecoratorsSymbol = Symbol("mobx-decoratorators") @@ -66,7 +67,7 @@ export function applyDecorators(target: Object): boolean { // TODO optimization: this can be cached per prototype! // (then we can remove the weird short circuiting as well..) let annotations: AnnotationsMap[] = [] - while (current && current !== Object.prototype) { + while (current && current !== objectPrototype) { const desc = getDescriptor(current, mobxDecoratorsSymbol) if (desc) { if (!annotations.length) { diff --git a/src/api/extendobservable.ts b/src/api/extendobservable.ts index e650209a1..332216d5b 100644 --- a/src/api/extendobservable.ts +++ b/src/api/extendobservable.ts @@ -11,7 +11,8 @@ import { getEnhancerFromOption, isObservable, getPlainObjectKeys, - die + die, + getOwnPropertyDescriptors } from "../internal" export function extendObservable( @@ -35,7 +36,7 @@ export function extendObservable( const adm = asObservableObject(target, o.name, getEnhancerFromOption(o)) startBatch() try { - const descs = Object.getOwnPropertyDescriptors(properties) + const descs = getOwnPropertyDescriptors(properties) getPlainObjectKeys(descs).forEach(key => { makeProperty( adm, diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index 1011b96b8..b5c3b7c7c 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -29,8 +29,11 @@ import { OBSERVABLE, OBSERVABLE_REF, OBSERVABLE_SHALLOW, - OBSERVABLE_STRUCT + OBSERVABLE_STRUCT, + getOwnPropertyDescriptors, + defineProperty } from "../internal" +import { ownKeys, objectPrototype } from "../utils/utils" function makeAction(target, key, name, fn, asAutoAction) { addHiddenProp(target, key, asAutoAction ? autoAction(name || key, fn) : action(name || key, fn)) @@ -50,7 +53,7 @@ function getInferredAnnotation( function getDescriptorInChain(target: Object, prop: PropertyKey): [PropertyDescriptor, Object] { let current = target - while (current && current !== Object.prototype) { + while (current && current !== objectPrototype) { // TODO: cache meta data, especially for members from prototypes? const desc = getDescriptor(current, prop) if (desc) { @@ -77,8 +80,7 @@ export function makeProperty( } if (annotation === false) { if (forceCopy) { - // TODO: create util? - Object.defineProperty(target, key, descriptor) + defineProperty(target, key, descriptor) } return } @@ -178,8 +180,7 @@ export function makeObservable { + Object.entries(getOwnPropertyDescriptors(target)).forEach(([key, descriptor]) => { if (key in collector || key === "constructor") return collector[key] = getInferredAnnotation(descriptor, defaultAnnotation) }) } function extractAnnotationsFromProto(proto: any, collector: AnnotationsMap) { - // TODO: for this combo, craeate a utility, looks same as above - Object.entries(Object.getOwnPropertyDescriptors(proto)).forEach(([key, prop]) => { + Object.entries(getOwnPropertyDescriptors(proto)).forEach(([key, prop]) => { if (key in collector || key === "constructor") return if (prop.get) { collector[key as any] = computed diff --git a/src/api/tojs.ts b/src/api/tojs.ts index 2436669f1..010aa661a 100644 --- a/src/api/tojs.ts +++ b/src/api/tojs.ts @@ -44,16 +44,14 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) if (detectCycles && __alreadySeen.has(source)) { return __alreadySeen.get(source) } - // TODO: remove second cond - if (isObservableArray(source) || Array.isArray(source)) { + if (isObservableArray(source)) { const res = cache(__alreadySeen, source, new Array(source.length), options) source.forEach((value, idx) => { res[idx] = toJSHelper(value, options!, __alreadySeen) }) return res } - // TODO: remove second cond - if (isObservableSet(source) || Object.getPrototypeOf(source) === Set.prototype) { + if (isObservableSet(source)) { if (options.exportMapsAsObjects === false) { const res = cache(__alreadySeen, source, new Set(), options) source.forEach(value => { @@ -69,8 +67,7 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) return res } } - // TODO: reuse Object.getPrototypeOf? alsoe remove second cond - if (isObservableMap(source) || Object.getPrototypeOf(source) === Map.prototype) { + if (isObservableMap(source)) { if (options.exportMapsAsObjects === false) { const res = cache(__alreadySeen, source, new Map(), options) source.forEach((value, key) => { diff --git a/src/core/action.ts b/src/core/action.ts index 3407e894a..5cfef07a4 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -13,14 +13,15 @@ import { allowStateReadsEnd, ACTION, EMPTY_ARRAY, - die + die, + getDescriptor } from "../internal" // we don't use globalState for these in order to avoid possible issues with multiple // mobx versions let currentActionId = 0 let nextActionId = 1 -const functionNameDescriptor = Object.getOwnPropertyDescriptor(() => {}, "name") +const functionNameDescriptor = getDescriptor(() => {}, "name") const isFunctionNameConfigurable = functionNameDescriptor?.configurable ?? false export function createAction( diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 66098d2b3..67fbf6e39 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -144,7 +144,7 @@ export function checkIfStateModificationsAreAllowed(atom: IAtom) { "[MobX] " + (globalState.enforceActions ? "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `runInAction` if this change is intended. Tried to modify: " - : "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ") + + : "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ") + atom.name_ ) } diff --git a/src/types/legacyobservablearray.ts b/src/types/legacyobservablearray.ts index 40b454d81..13a703553 100644 --- a/src/types/legacyobservablearray.ts +++ b/src/types/legacyobservablearray.ts @@ -10,7 +10,8 @@ import { arrayExtensions, IEnhancer, isObservableArray, - IObservableArray + IObservableArray, + defineProperty } from "../internal" /** @@ -112,11 +113,7 @@ function createArrayEntryDescriptor(index: number) { } function createArrayBufferItem(index: number) { - Object.defineProperty( - LegacyObservableArray.prototype, - "" + index, - createArrayEntryDescriptor(index) - ) + defineProperty(LegacyObservableArray.prototype, "" + index, createArrayEntryDescriptor(index)) } export function reserveArrayBuffer(max: number) { diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index ff5f4ad04..d89abd538 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -33,7 +33,9 @@ import { globalState, ADD, UPDATE, - die + die, + defineProperty, + hasProp } from "../internal" // TODO: kill @@ -187,7 +189,7 @@ export class ObservableObjectAdministration this.values_.set(propName, observable) newValue = (observable as any).value_ // observableValue might have changed it - Object.defineProperty(target, propName, generateObservablePropConfig(propName)) + defineProperty(target, propName, generateObservablePropConfig(propName)) this.notifyPropertyAddition_(propName, newValue) } @@ -201,8 +203,7 @@ export class ObservableObjectAdministration options.context = this.proxy_ || target this.values_.set(propName, new ComputedValue(options)) if (propertyOwner === target || isPropertyConfigurable(propertyOwner, propName)) - // TODO: extract util? - Object.defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)) + defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)) } remove_(key: PropertyKey) { @@ -332,7 +333,7 @@ export function asObservableObject( name: PropertyKey = "", defaultEnhancer: IEnhancer = deepEnhancer ): ObservableObjectAdministration { - if (Object.prototype.hasOwnProperty.call(target, $mobx)) return target[$mobx] + if (hasProp(target, $mobx)) return target[$mobx] if (__DEV__ && !Object.isExtensible(target)) die("Cannot make the designated object observable; it is not extensible") diff --git a/src/utils/eq.ts b/src/utils/eq.ts index 9884f0598..0debd1eae 100644 --- a/src/utils/eq.ts +++ b/src/utils/eq.ts @@ -5,11 +5,12 @@ import { isES6Set, isObservableSet, hasProp, - isFunction + isFunction, + objectPrototype } from "../internal" declare const Symbol -const toString = Object.prototype.toString +const toString = objectPrototype.toString export function deepEqual(a: any, b: any, depth: number = -1): boolean { return eq(a, b, depth) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 00eb7fedb..cd8b7bf6c 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,5 +1,11 @@ import { IObservableArray, globalState, isObservableArray, die } from "../internal" +// We shorten anything used > 5 times +export const assign = Object.assign +export const getDescriptor = Object.getOwnPropertyDescriptor +export const defineProperty = Object.defineProperty +export const objectPrototype = Object.prototype + export const EMPTY_ARRAY = [] Object.freeze(EMPTY_ARRAY) @@ -76,14 +82,11 @@ export function isObject(value: any): value is Object { export function isPlainObject(value) { if (!isObject(value)) return false const proto = Object.getPrototypeOf(value) - return proto === Object.prototype || proto === null + return proto === objectPrototype || proto === null } -export const assign = Object.assign -export const getDescriptor = Object.getOwnPropertyDescriptor - export function addHiddenProp(object: any, propName: PropertyKey, value: any) { - Object.defineProperty(object, propName, { + defineProperty(object, propName, { enumerable: false, writable: true, configurable: true, @@ -92,7 +95,7 @@ export function addHiddenProp(object: any, propName: PropertyKey, value: any) { } export function addHiddenFinalProp(object: any, propName: PropertyKey, value: any) { - Object.defineProperty(object, propName, { + defineProperty(object, propName, { enumerable: false, writable: false, configurable: true, @@ -152,9 +155,18 @@ export function getPlainObjectKeys(object) { if (!hasGetOwnPropertySymbols) return keys const symbols = Object.getOwnPropertySymbols(object) if (!symbols.length) return keys - return [...keys, ...symbols.filter(s => Object.prototype.propertyIsEnumerable.call(object, s))] + return [...keys, ...symbols.filter(s => objectPrototype.propertyIsEnumerable.call(object, s))] } +// From Immer utils +// Returns all own keys, including non-enumerable and symbolic +export const ownKeys: (target: any) => PropertyKey[] = + typeof Reflect !== "undefined" && Reflect.ownKeys + ? Reflect.ownKeys + : hasGetOwnPropertySymbols + ? obj => Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj) as any) + : /* istanbul ignore next */ Object.getOwnPropertyNames + export function stringifyKey(key: any): string { if (typeof key === "string") return key if (typeof key === "symbol") return key.toString() @@ -166,5 +178,18 @@ export function toPrimitive(value) { } export function hasProp(target: Object, prop: PropertyKey): boolean { - return Object.prototype.hasOwnProperty.call(target, prop) -} + return objectPrototype.hasOwnProperty.call(target, prop) +} + +// From Immer utils +export const getOwnPropertyDescriptors = + Object.getOwnPropertyDescriptors || + function getOwnPropertyDescriptors(target: any) { + // Polyfill needed for Hermes and IE, see https://github.com/facebook/hermes/issues/274 + const res: any = {} + // Note: without polyfill for ownKeys, symbols won't be picked up + ownKeys(target).forEach(key => { + res[key] = getDescriptor(target, key) + }) + return res + } diff --git a/test/v5/base/action.js b/test/v5/base/action.js index 62692cfed..351bf9c14 100644 --- a/test/v5/base/action.js +++ b/test/v5/base/action.js @@ -194,7 +194,7 @@ test("should be possible to change observed state in an action called from compu a.set(4) }) ).toMatchInlineSnapshot( - `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@29"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ObservableValue@29"` ) expect(a.get()).toBe(4) testAction() @@ -617,7 +617,7 @@ test("auto action should not update state from inside a derivation", async () => double() }) ).toMatchInlineSnapshot( - `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@79"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ObservableValue@79"` ) return a.get() === 2 }) diff --git a/test/v5/base/errorhandling.js b/test/v5/base/errorhandling.js index b982b61f8..878d241c1 100644 --- a/test/v5/base/errorhandling.js +++ b/test/v5/base/errorhandling.js @@ -155,7 +155,7 @@ test("deny state changes in views", function() { y.get() }) ).toMatchInlineSnapshot( - `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableValue@26"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ObservableValue@26"` ) checkGlobalState() @@ -202,7 +202,7 @@ test("deny array change in view", function(done) { y.get() }) ).toMatchInlineSnapshot( - `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' if needed but we recommend to investigate if the value you are trying to update can be derived instead. Tried to modify: ObservableArray@36"` + `" [MobX] Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ObservableArray@36"` ) expect(z.slice()).toEqual([3, 3]) From 10ec425c27c09c822f5edae87f87f135d679b894 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 25 Jun 2020 21:11:45 +0100 Subject: [PATCH 0347/1043] Fixed some 'skips' --- test/v5/base/babel-decorators.js | 2 +- test/v5/base/babel-tests.js | 11 ++++++----- test/v5/base/decorate.js | 11 +++++------ test/v5/base/makereactive.js | 7 ------- test/v5/base/map.js | 1 - test/v5/base/typescript-decorators.ts | 2 +- test/v5/base/typescript-tests.ts | 2 +- 7 files changed, 14 insertions(+), 22 deletions(-) diff --git a/test/v5/base/babel-decorators.js b/test/v5/base/babel-decorators.js index 48002d2f2..40d7d1064 100644 --- a/test/v5/base/babel-decorators.js +++ b/test/v5/base/babel-decorators.js @@ -457,7 +457,7 @@ test("288 atom not detected for object property", () => { expect(changed).toBe(true) }) -test.skip("observable performance", () => { +test.skip("observable performance - babel - decorators", () => { const AMOUNT = 100000 class A { diff --git a/test/v5/base/babel-tests.js b/test/v5/base/babel-tests.js index f6dd62a35..3052d91fb 100644 --- a/test/v5/base/babel-tests.js +++ b/test/v5/base/babel-tests.js @@ -71,8 +71,7 @@ test("babel", function() { expect(s).toEqual([40, 20, 60, 210, 420, 700]) }) -// TODO: -test.skip("should not be possible to use @action with getters", () => { +test("should not be possible to use @action with getters", () => { expect(() => { class A { constructor() { @@ -83,8 +82,10 @@ test.skip("should not be possible to use @action with getters", () => { get Test() {} } - A // just to avoid the linter warning - }).toThrowError(/@action cannot be used with getters/) + return new A() + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] Cannot decorate 'Test': action can only be used on properties with a function value."` + ) mobx._resetGlobalState() }) @@ -519,7 +520,7 @@ test("288 atom not detected for object property", () => { expect(changed).toBe(true) }) -test.skip("observable performance", () => { +test.skip("observable performance - babel", () => { const AMOUNT = 100000 class A { diff --git a/test/v5/base/decorate.js b/test/v5/base/decorate.js index a52263cdd..b84506a90 100644 --- a/test/v5/base/decorate.js +++ b/test/v5/base/decorate.js @@ -323,8 +323,7 @@ test("decorate should work with constructor function", function() { expect(box2.width).toBe(40) // no shared state! }) -// TODO: find decent behavior here, for example die because the `this` on the observable setter is not the owning instance? -test.skip("decorate should work with inheritance through Object.create", () => { +test("decorate should work with inheritance through Object.create", () => { const P = { x: 3 } @@ -333,14 +332,14 @@ test.skip("decorate should work with inheritance through Object.create", () => { }) const child1 = Object.create(P) - expect(child1.x).toBe(3) // now an own property - child1.x = 4 + expect(child1.x).toBe(3) + child1.x = 4 // this modifies the prop on P, since that is what was made observable expect(child1.x).toBe(4) const child2 = Object.create(P) - expect(child2.x).toBe(3) + expect(child2.x).toBe(4) child2.x = 5 expect(child2.x).toBe(5) - expect(child1.x).toBe(4) + expect(child1.x).toBe(5) }) test("decorate should not allow @observable on getter", function() { diff --git a/test/v5/base/makereactive.js b/test/v5/base/makereactive.js index 87fad3802..853b0a120 100644 --- a/test/v5/base/makereactive.js +++ b/test/v5/base/makereactive.js @@ -508,13 +508,6 @@ test("ES5 non reactive props - 2", function() { }).toThrow(/Cannot make property 'nonConfigurable' observable/) }) -// TODO: re-enable once decorators are implemented -test.skip("exceptions", function() { - expect(function() { - m.observable.ref(m.observable.shallow(3)) - }).toThrow(/@observable decorator doesn't expect any arguments/) -}) - test("540 - extendobservable should not report cycles", function() { expect(() => m.extendObservable(Object.freeze({}), {})).toThrowError( /Cannot make the designated object observable/ diff --git a/test/v5/base/map.js b/test/v5/base/map.js index bd05bdf01..d07f05137 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -598,7 +598,6 @@ test("using deep map", () => { expect(observed).toBe(1) }) -// TODO: restore test.skip("using deep map - toJS", () => { const store = { map_deep: mobx.observable(new Map()) diff --git a/test/v5/base/typescript-decorators.ts b/test/v5/base/typescript-decorators.ts index 61b719d74..0c357fbb8 100644 --- a/test/v5/base/typescript-decorators.ts +++ b/test/v5/base/typescript-decorators.ts @@ -547,7 +547,7 @@ test("288 atom not detected for object property", () => { ) }) -test.skip("observable performance", () => { +test.skip("observable performance - ts - decorators", () => { const AMOUNT = 100000 class A { diff --git a/test/v5/base/typescript-tests.ts b/test/v5/base/typescript-tests.ts index cbab83e8e..1a824c7e1 100644 --- a/test/v5/base/typescript-tests.ts +++ b/test/v5/base/typescript-tests.ts @@ -737,7 +737,7 @@ test("288 atom not detected for object property", () => { ) }) -test.skip("observable performance", () => { +test.skip("observable performance - ts", () => { const AMOUNT = 100000 class A { From bb44cf9b4dbc4c550375a9da79f46d7841f77d07 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 25 Jun 2020 21:54:17 +0100 Subject: [PATCH 0348/1043] cleaned up `toJS` --- notes.md | 7 +-- src/api/tojs.ts | 104 ++++++++++++------------------------------- test/v4/base/tojs.js | 14 +++--- test/v5/base/map.js | 26 ++++++----- test/v5/base/set.js | 2 +- test/v5/base/tojs.js | 16 +++---- 6 files changed, 63 insertions(+), 106 deletions(-) diff --git a/notes.md b/notes.md index c08c4413c..7d15d41ef 100644 --- a/notes.md +++ b/notes.md @@ -5,7 +5,7 @@ - [x] TSDX build process - [ ] Smaller build - [x] fixup build, restore asset bundling - - ~[ ] create prod esm build?~ + - [x] ~create prod esm build?~ - [x] minimal dev errors - [x] invariant system from immer - [x] check all calls to top-level @@ -26,7 +26,7 @@ - [x] combine with ES5? - [x] backport tests and code to v4(6) - [x] make sure legacy array implementation is opt in - - [ ] map / set as opt-in as well? + - [x] ~map / set as opt-in as well?~ - [x] compare mobx.configure options between v4 and v5 - [ ] two or 3 modes for configure useProxies? If two, kill `deep` option to observable? - [ ] annotations instead of decorators @@ -56,7 +56,7 @@ ## Docs / migration guide -PHilosophy: one thing to do things +PHilosophy: one way to do things - [ ] Host old docs somewhere? Figure out how docusaurus can support a second version - [ ] Using the codemod @@ -96,6 +96,7 @@ PHilosophy: one thing to do things - [ ] Breaking: it is no longer safe to call action from autorun. Use effect or reaction instead. - [ ] \_allowStateChangesINComputation is no longer needed, us `runInAction` instead. - [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. +- [ ] Breaking: `toJS` no longer takes action, and no longer converts Maps and Sets to plain data structures. Serializing data structures is out of scope for the MobX project, and write custom serialization methods are much more sustainable. You might even leverage @computed to serialize state. ## NOTES diff --git a/src/api/tojs.ts b/src/api/tojs.ts index 010aa661a..71021529a 100644 --- a/src/api/tojs.ts +++ b/src/api/tojs.ts @@ -9,23 +9,12 @@ import { die } from "../internal" -export type ToJSOptions = { - detectCycles?: boolean - exportMapsAsObjects?: boolean -} - -// TODO: kill all optoins? -const defaultOptions: ToJSOptions = { - detectCycles: true, - exportMapsAsObjects: true // TODO: kill this option and make default false -} - -function cache(map: Map, key: K, value: V, options: ToJSOptions): V { - if (options.detectCycles) map.set(key, value) +function cache(map: Map, key: K, value: V): V { + map.set(key, value) return value } -function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) { +function toJSHelper(source, __alreadySeen: Map) { if ( source == null || typeof source !== "object" || @@ -34,82 +23,45 @@ function toJSHelper(source, options: ToJSOptions, __alreadySeen: Map) ) return source - if (isObservableValue(source)) return toJSHelper(source.get(), options!, __alreadySeen) - - // make sure we track the keys of the object - if (isObservable(source)) keys(source) - - const detectCycles = options.detectCycles === true - - if (detectCycles && __alreadySeen.has(source)) { + if (isObservableValue(source)) return toJSHelper(source.get(), __alreadySeen) + if (__alreadySeen.has(source)) { return __alreadySeen.get(source) } if (isObservableArray(source)) { - const res = cache(__alreadySeen, source, new Array(source.length), options) + const res = cache(__alreadySeen, source, new Array(source.length)) source.forEach((value, idx) => { - res[idx] = toJSHelper(value, options!, __alreadySeen) + res[idx] = toJSHelper(value, __alreadySeen) }) return res } if (isObservableSet(source)) { - if (options.exportMapsAsObjects === false) { - const res = cache(__alreadySeen, source, new Set(), options) - source.forEach(value => { - res.add(toJSHelper(value, options!, __alreadySeen)) - }) - return res - } else { - // TODO: remove else branch - const res = cache(__alreadySeen, source, [] as any[], options) - source.forEach(value => { - res.push(toJSHelper(value, options!, __alreadySeen)) - }) - return res - } + const res = cache(__alreadySeen, source, new Set()) + source.forEach(value => { + res.add(toJSHelper(value, __alreadySeen)) + }) + return res } if (isObservableMap(source)) { - if (options.exportMapsAsObjects === false) { - const res = cache(__alreadySeen, source, new Map(), options) - source.forEach((value, key) => { - res.set(key, toJSHelper(value, options!, __alreadySeen)) - }) - return res - } else { - // TODO: remove else branch - const res = cache(__alreadySeen, source, {}, options) - source.forEach((value, key) => { - res[key] = toJSHelper(value, options!, __alreadySeen) - }) - return res - } + const res = cache(__alreadySeen, source, new Map()) + source.forEach((value, key) => { + res.set(key, toJSHelper(value, __alreadySeen)) + }) + return res + } else { + // must be observable object + keys(source) // make sure keys are observed + const res = cache(__alreadySeen, source, {}) + getPlainObjectKeys(source).forEach((key: any) => { + res[key] = toJSHelper(source[key], __alreadySeen) + }) + return res } - - // Fallback to the situation that source is an ObservableObject or a plain object - const res = cache(__alreadySeen, source, {}, options) - getPlainObjectKeys(source).forEach((key: any) => { - res[key] = toJSHelper(source[key], options!, __alreadySeen) - }) - - return res } /** * Basically, a deep clone, so that no reactive property will exist anymore. */ -export function toJS(source: T, options?: ToJSOptions): T -export function toJS(source: any, options?: ToJSOptions): any -export function toJS(source, options: ToJSOptions) // internal overload -export function toJS(source, options: ToJSOptions = defaultOptions) { - // backward compatibility - - if (__DEV__ && options && (options as any).recurseEverything) - die("The recurseEverything option is no longer supported") - if (__DEV__ && typeof options === "boolean") - die("passing a boolean as second argument to toJS is no longer supported") - options.detectCycles = !!options.detectCycles - - let __alreadySeen - if (options.detectCycles) __alreadySeen = new Map() - - return toJSHelper(source, options, __alreadySeen) +export function toJS(source: T, options?: any): T { + if (__DEV__ && options) die("toJS no longer supports options") + return toJSHelper(source, new Map()) } diff --git a/test/v4/base/tojs.js b/test/v4/base/tojs.js index b068b739a..648804090 100644 --- a/test/v4/base/tojs.js +++ b/test/v4/base/tojs.js @@ -209,7 +209,7 @@ test("json2", function() { } ] }) - expect(mobx.toJS(o, { detectCycles: true })).toEqual(mobx.toJS(o)) + expect(mobx.toJS(o)).toEqual(mobx.toJS(o)) expect(ab).toEqual([[3, "google"]]) expect(tb).toEqual(["reactjs,frp,foo,bar,x"]) }) @@ -238,7 +238,7 @@ test("json cycles", function() { a.d.set("d", a.d) a.d.set("c", a.c) - const cloneA = mobx.toJS(a, { detectCycles: true }) + const cloneA = mobx.toJS(a) const cloneC = cloneA.c const cloneD = cloneA.d @@ -246,9 +246,9 @@ test("json cycles", function() { expect(cloneA.c[0]).toBe(2) expect(cloneA.c[1]).toBe(cloneA) expect(cloneA.c[2]).toBe(cloneD) - expect(cloneD.f).toBe(cloneA) - expect(cloneD.d).toBe(cloneD) - expect(cloneD.c).toBe(cloneC) + expect(cloneD.get("f")).toBe(cloneA) + expect(cloneD.get("d")).toBe(cloneD) + expect(cloneD.get("c")).toBe(cloneC) expect(cloneA.e).toBe(cloneA) }) @@ -330,7 +330,7 @@ test("json cycles when exporting maps as maps", function() { a.d.set("d", a.d) a.d.set("c", a.c) - const cloneA = mobx.toJS(a, { exportMapsAsObjects: false, detectCycles: true }) + const cloneA = mobx.toJS(a) const cloneC = cloneA.c const cloneD = cloneA.d @@ -353,7 +353,7 @@ test("map to JS", () => { makeObservable(this) this.meta.set("test", { abc: "def", ghi: "jkl" }) - expect(mobx.toJS(this.meta).constructor.name).toBe("Object") + expect(mobx.toJS(this.meta).constructor.name).toBe("Map") } } new MyClass() diff --git a/test/v5/base/map.js b/test/v5/base/map.js index d07f05137..0547394b9 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -598,7 +598,7 @@ test("using deep map", () => { expect(observed).toBe(1) }) -test.skip("using deep map - toJS", () => { +test("using deep map - toJS", () => { const store = { map_deep: mobx.observable(new Map()) } @@ -615,20 +615,24 @@ test.skip("using deep map - toJS", () => { store.map_deep.set("shoes", []) expect(observed).toBe(1) - expect(seen).toEqual([[], [["shoes", []]]]) + expect(seen).toEqual([new Map(), new Map([["shoes", []]])]) + debugger store.map_deep.get("shoes").push({ color: "black" }) - expect(seen).toEqual([[], [["shoes", []]], [["shoes", [{ color: "black" }]]]]) + expect(seen).toEqual([ + new Map([]), + new Map([["shoes", []]]), + new Map([["shoes", [{ color: "black" }]]]) + ]) expect(observed).toBe(2) - store.map_deep.get("shoes")[0].color = "red" // see above comment expect(seen).toEqual([ - [], - [["shoes", []]], - [["shoes", [{ color: "black" }]]], - [["shoes", [{ color: "red" }]]] + new Map([]), + new Map([["shoes", []]]), + new Map([["shoes", [{ color: "black" }]]]), + new Map([["shoes", [{ color: "red" }]]]) ]) expect(observed).toBe(3) }) @@ -660,7 +664,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.set("x", 1) }) ).toMatchInlineSnapshot( - `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@72.keys()"` ) expect( @@ -668,7 +672,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.set("x", 2) }) ).toMatchInlineSnapshot( - `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.x"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@72.x"` ) expect( @@ -676,7 +680,7 @@ test("issue 940, should not be possible to change maps outside strict mode", () m.delete("x") }) ).toMatchInlineSnapshot( - `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@69.keys()"` + `" [MobX] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an \`runInAction\` if this change is intended. Tried to modify: ObservableMap@72.keys()"` ) d() diff --git a/test/v5/base/set.js b/test/v5/base/set.js index 65184d8b8..4188982b7 100644 --- a/test/v5/base/set.js +++ b/test/v5/base/set.js @@ -267,7 +267,7 @@ test("toJS", () => { const y = set([x, 1]) const z = mobx.toJS(y) - expect(z).toEqual([{ x: 1 }, 1]) + expect(z).toEqual(new Set([{ x: 1 }, 1])) expect(z.x).not.toBe(x) expect(mobx.isObservable(z.x)).toBeFalsy() }) diff --git a/test/v5/base/tojs.js b/test/v5/base/tojs.js index 5402f9352..a8e5c2abe 100644 --- a/test/v5/base/tojs.js +++ b/test/v5/base/tojs.js @@ -208,7 +208,7 @@ test("json2", function() { } ] }) - expect(mobx.toJS(o, { detectCycles: true })).toEqual(mobx.toJS(o)) + expect(mobx.toJS(o)).toEqual(mobx.toJS(o)) expect(ab).toEqual([[3, "google"]]) expect(tb).toEqual(["reactjs,frp,foo,bar,x"]) }) @@ -238,7 +238,7 @@ test("toJS handles symbol keys in objects and maps", () => { }) const y = mobx.toJS(x) - expect(y[key]).toBe(43) + expect(y.get(key)).toBe(43) }) test("json cycles", function() { @@ -255,7 +255,7 @@ test("json cycles", function() { a.d.set("d", a.d) a.d.set("c", a.c) - const cloneA = mobx.toJS(a, { detectCycles: true }) + const cloneA = mobx.toJS(a) const cloneC = cloneA.c const cloneD = cloneA.d @@ -263,9 +263,9 @@ test("json cycles", function() { expect(cloneA.c[0]).toBe(2) expect(cloneA.c[1]).toBe(cloneA) expect(cloneA.c[2]).toBe(cloneD) - expect(cloneD.f).toBe(cloneA) - expect(cloneD.d).toBe(cloneD) - expect(cloneD.c).toBe(cloneC) + expect(cloneD.get("f")).toBe(cloneA) + expect(cloneD.get("d")).toBe(cloneD) + expect(cloneD.get("c")).toBe(cloneC) expect(cloneA.e).toBe(cloneA) }) @@ -347,7 +347,7 @@ test("json cycles when exporting maps as maps", function() { a.d.set("d", a.d) a.d.set("c", a.c) - const cloneA = mobx.toJS(a, { exportMapsAsObjects: false, detectCycles: true }) + const cloneA = mobx.toJS(a) const cloneC = cloneA.c const cloneD = cloneA.d @@ -365,7 +365,7 @@ test("json cycles when exporting maps as maps", function() { describe("recurseEverything set to true", function() { test("recurseEverything is no longer supported", () => { expect(() => mobx.toJS({}, { recurseEverything: true })).toThrowErrorMatchingInlineSnapshot( - `"[MobX] The recurseEverything option is no longer supported"` + `"[MobX] toJS no longer supports options"` ) }) }) From 0d4c10c821136234a827f5c02b876fdebeb2f942 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 26 Jun 2020 11:24:52 +0200 Subject: [PATCH 0349/1043] First stab at a reference. This isn't done at all yet but wanted to preserve some text I cut from README --- docs/refguide/make-auto-observable.md | 36 +++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/refguide/make-auto-observable.md diff --git a/docs/refguide/make-auto-observable.md b/docs/refguide/make-auto-observable.md new file mode 100644 index 000000000..f6d344fa7 --- /dev/null +++ b/docs/refguide/make-auto-observable.md @@ -0,0 +1,36 @@ +--- +sidebar_label: makeAutoObservable +hide_title: true +--- + +# makeAutoObservable + +```javascript +import { makeAutoObservable } from "mobx" + +class Todo { + id = Math.random() + title = "" + finished = false + + constructor() { + makeAutoObservable(this, { id: false }) + } + + toggle() { + this.finished = !finished + } +} + +class TodoList { + todos = [] + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } + constructor() { + makeAutoObservable(this) + } +} +``` + +As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by telling `makeAutoObservable` not to do anything with it. From b022534057dd3df5e43b07a68b46fa800334565b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 26 Jun 2020 11:25:30 +0200 Subject: [PATCH 0350/1043] Rework example & concepts. I've done the following: * moved the concepts + example code away from the home page in favor of a much simpler example taken from "The gist of MobX". Use makeAutoObservable in this short example as there is no conceptual introduction anymore to block that. * Simplify "the gist of MobX" to use makeAutoObservable. Make this the first thing newcomers see in the order. * Integrate the Todo example code that was in README, which included a conceptual introduction, "Concepts & Principles". There was quite a bit of duplication here before. To show off the concepts use makeObservable here. --- docs/README.md | 178 ++++++-------------------------------- docs/intro/concepts.md | 188 +++++++++++++++++++++++++++-------------- docs/intro/overview.md | 45 ++-------- website/i18n/en.json | 3 + website/sidebars.json | 4 +- 5 files changed, 159 insertions(+), 259 deletions(-) diff --git a/docs/README.md b/docs/README.md index 6e92388ff..b8febba32 100644 --- a/docs/README.md +++ b/docs/README.md @@ -69,183 +69,55 @@ React and MobX together are a powerful combination. React renders the applicatio Both React and MobX provide an optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with your React components by using a reactive virtual dependency state graph that is only updated when strictly needed and is never stale. -## Core concepts +## Example -MobX has only a few core concepts. The following snippets can be tried online using [codesandbox example](https://codesandbox.io/s/v3v0my2370). - -### Observable state - -MobX adds observable capabilities to existing data structures like objects, arrays and class instances. -This can simply be done by using `makeObservable` in its constructor to annotate your class properties as `observable`. - -```javascript -import { makeObservable, observable, action } from "mobx" - -class Todo { - id = Math.random() - title = "" - finished = false - - constructor() { - makeObservable(this, { - title: observable, - finished: observable, - toggle: action - }) - } - - toggle() { - this.finished = !finished - } -} -``` - -Using `observable` is like turning a property of an object into a spreadsheet cell. -But unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. - -But what about `toggle`, which we marked `action`? - -### Actions - -In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](http://mobxjs.github.io/mobx/refguide/action.html). - -MobX enforces this as it helps you structure your code and prevents you from inadvertantly changing state when you don't want to. - -### Computed values - -With MobX you can define values that will be derived automatically when relevant data is modified. You do this by defining a property using a JS getter function (`get`) and then marking it with `computed` with `makeObservable`. - -```javascript -import { makeObservable, observable, computed } from "mobx" - -class TodoList { - todos = [] - get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } - constructor() { - makeObservable(this, { - todos: observable, - unfinishedTodoCount: computed - }) - } -} -``` - -MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. -Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically, and only when required. - -### makeAutoObservable - -The above code can be simplified using `makeAutoObservable`. With this, MobX automatically declares normal properties as `observable`, getter properties (`unfinishedTodoCount`) as `computed`, and other methods (`toggle`) as `action`. +So what does code that uses MobX look like? ```javascript +import React from "react" +import ReactDOM from "react-dom" import { makeAutoObservable } from "mobx" +import { observer } from "mobx-react" -class Todo { - id = Math.random() - title = "" - finished = false +class AppState { + timer = 0 constructor() { - makeAutoObservable(this, { id: false }) + makeAutoObservable(this) } - toggle() { - this.finished = !finished + increaseTimer() { + this.timer += 1 } -} -class TodoList { - todos = [] - get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } - constructor() { - makeAutoObservable(this) + resetTimer() { + this.timer = 0 } } -``` - -As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by telling `makeAutoObservable` not to do anything with it. - -### Decorators - -Wait! Didn't MobX use decorators for this? That's true, but in MobX 6 we have chosen to move away from them. - -Here is the gist on decorator support in MobX 6: - -- You can still use `observable`, `computed` and `action` as decorators to mark code. - -- But in order to have them be picked up, you now need to use `makeObservable(this)`, - without the second argument as this information is automatically deduced from - the decorators. - -- There are code mods to help you upgrade existing code to be compliant with MobX 6. - -The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. -### Reactions +setInterval(() => { + appState.increaseTimer() +}, 1000) -Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. -In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. +const appState = new AppState() -#### React components - -If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function from the `mobx-react` package. - -```javascript -import React from "react" -import ReactDOM from "react-dom" -import { observer } from "mobx-react" - -const TodoListView = observer(({ todoList }) => ( -
    -
      - {todoList.todos.map(todo => ( - - ))} -
    - Tasks left: {todoList.unfinishedTodoCount} -
    -)) - -const TodoView = observer(({ todo }) => ( -
  • - todo.toggle()} /> - {todo.title} -
  • +const TimerView = observer(({ appState }) => ( + )) - -const store = new TodoList() -ReactDOM.render(, document.getElementById("mount")) +ReactDOM.render(, document.body) ``` -`observer` turns React (function) components into derivations of the data they render. -When using MobX there are no smart or dumb components. -All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. -However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). - -#### Custom reactions - -Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), -[`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. +To get more detail about this example, see [the gist of MobX](http://mobxjs.github.io/mobx/intro/overview.html). -For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: +To learn about the underlying concepts together with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html) -```javascript -autorun(() => { - console.log("Tasks left: " + todos.unfinishedTodoCount) -}) -``` +### MobX and Decorators -### What will MobX react to? +Wait! This example doesn't use decorators. Haven't you seen MobX code before that uses them? In MobX 6 we have chosen to move away from them for maximum compatibility with standard JavaScript. -Why does a new message get printed each time the `unfinishedTodoCount` is changed? The answer is this rule of thumb: +There is a codemod available to help you upgrade existing code to be compliant with MobX 6. -_MobX reacts to any existing observable property that is read during the execution of a tracked function._ - -For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](http://mobxjs.github.io/mobx/best/react.html). +The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. ## MobX: Simple and scalable diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index dc634c66b..506d0bbd3 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -8,15 +8,58 @@ hide_title: true ## Concepts -MobX distinguishes the following concepts in your application. You saw them in the one page summary, but let's dive into them in a bit more detail. +MobX distinguishes the following concepts in your application. + +We show example code to illustrate these concepts. For clarity of explanation we don't use the convenience function `makeAutoObservable` yet in this code. In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. ### 1. State _State_ is the data that drives your application. Usually there is _domain specific state_ like a list of todo items and there is _view state_ such as the currently selected element. -Remember, state is like spreadsheets cells that hold a value. +State is like spreadsheets cells that hold a value. + +MobX adds observable capabilities to existing data structures like objects, arrays and class instances. +This can simply be done by using `makeObservable` in its constructor to annotate your class properties as `observable`. + +```javascript +import { makeObservable, observable, action } from "mobx" -### 2. Derivations +class Todo { + id = Math.random() + title = "" + finished = false + + constructor() { + makeObservable(this, { + title: observable, + finished: observable, + toggle: action + }) + } + + toggle() { + this.finished = !finished + } +} +``` + +Using `observable` is like turning a property of an object into a spreadsheet cell. +But unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. + +But what about `toggle`, which we marked `action`? + +### 2. Actions + +An _action_ is any piece of code that changes the _state_. User events, backend data pushes, scheduled events, etc. +An action is like a user that enters a new value in a spreadsheet cell. + +In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](../refguide/action.md). +By marking methods this way you make MobX automatically apply transactions for optimal performance. + +This helps you structure your code and prevents you from inadvertantly changing state when you don't want to. This is the default behavior and is recommended. +You can however loosen [_strict mode_](../refguide/api##-enforceactions-) to allow you to modify state outside actions as well. + +### 3. Derivations _Anything_ that can be derived from the _state_ without any further interaction is a derivation. Derivations exist in many forms: @@ -33,89 +76,104 @@ MobX distinguishes two kind of derivations: People starting with MobX tend to use reactions too often. The golden rule is: if you want to create a value based on the current state, use `computed`. -Back to the spreadsheet analogy, formulas are derivations that _compute_ a value. But for you as a user to be able to see it on the screen a _reaction_ is needed that repaints part of the GUI. +#### Computed -### 3. Actions +You created a computed value by defining a property using a JS getter function (`get`) and then marking it with `computed` with `makeObservable`. -An _action_ is any piece of code that changes the _state_. User events, backend data pushes, scheduled events, etc. -An action is like a user that enters a new value in a spreadsheet cell. +```javascript +import { makeObservable, observable, computed } from "mobx" -Actions are defined explicitly in MobX to help you to structure code more clearly. This is the default behavior and is recommended. -You can however loosen [_strict mode_](../refguide/api##-enforceactions-) to allow you to modify state outside actions as well. +class TodoList { + todos = [] + get unfinishedTodoCount() { + return this.todos.filter(todo => !todo.finished).length + } + constructor() { + makeObservable(this, { + todos: observable, + unfinishedTodoCount: computed + }) + } +} +``` -## Principles +MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. -MobX supports a uni-directional data flow where _actions_ change the _state_, which in turn updates all affected _views_. +Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically, and only when required. -![Action, State, View](../assets/action-state-view.png) +#### Reactions -All _Derivations_ are updated **automatically** and **atomically** when the _state_ changes. As a result it is never possible to observe intermediate values. +For you as a user to be able to see a change in state or computed values on the screen a _reaction_ is needed that repaints part of the GUI. -All _Derivations_ are updated **synchronously** by default. This means that, for example, _actions_ can safely inspect a computed value directly after altering the _state_. +Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. +In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. -_Computed values_ are updated **lazily**. Any computed value that is not actively in use will not be updated until it is needed for a side effect (I/O). -If a view is no longer in use it will be garbage collected automatically. +##### React components -All _Computed values_ should be **pure**. They are not supposed to change _state_. +If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function from the `mobx-react` package. + +```javascript +import React from "react" +import ReactDOM from "react-dom" +import { observer } from "mobx-react" + +const TodoListView = observer(({ todoList }) => ( +
    +
      + {todoList.todos.map(todo => ( + + ))} +
    + Tasks left: {todoList.unfinishedTodoCount} +
    +)) + +const TodoView = observer(({ todo }) => ( +
  • + todo.toggle()} /> + {todo.title} +
  • +)) + +const store = new TodoList() +ReactDOM.render(, document.getElementById("mount")) +``` + +`observer` turns React (function) components into derivations of the data they render. +When using MobX there are no smart or dumb components. +All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. +However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). -## Illustration +##### Custom reactions -The following listing illustrates the above concepts and principles: +Custom reactions can simply be created using the [`autorun`](../refguide/autorun.md), +[`reaction`](../refguide/reaction.md) or [`when`](../refguide/when.md) functions to fit your specific situations. + +For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: ```javascript -import { makeObservable, autorun, action, computed, observable } from "mobx" +autorun(() => { + console.log("Tasks left: " + todos.unfinishedTodoCount) +}) +``` -class Todo { - title = "" - completed = false +Why does a new message get printed each time the `unfinishedTodoCount` is changed? The answer is this rule of thumb: - constructor(title, completed) { - this.title = title - this.completed = completed - makeObservable(this, { - title: observable, - completed: observable, - complete: action - }) - } - complete() { - this.completed = true - } -} +_MobX reacts to any existing observable property that is read during the execution of a tracked function._ -class TodoStore { - /* some observable state */ - todos = [] +For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](../best/react.md). - constructor() { - makeObservable(this, { - todos: observable, - completedCount: computed, - add: action - }) - } +## Principles - add(title, completed) { - this.todos.push(new Todo(title, completed)) - } +MobX supports a uni-directional data flow where _actions_ change the _state_, which in turn updates all affected _views_. - /* a derived value */ - get completedCount() { - return this.todos.filter(todo => todo.completed).length - } -} +![Action, State, View](../assets/action-state-view.png) -/* a function that observes the state */ -autorun(function () { - console.log("Completed %d of %d items", todoStore.completedCount, todoStore.todos.length) -}) +All _Derivations_ are updated **automatically** and **atomically** when the _state_ changes. As a result it is never possible to observe intermediate values. -/* ..and some actions that modify the state */ -todoStore.add("Take a walk", false) -// -> synchronously prints 'Completed 0 of 1 items' +All _Derivations_ are updated **synchronously** by default. This means that, for example, _actions_ can safely inspect a computed value directly after altering the _state_. -todoStore.todos[0].complete() -// -> synchronously prints 'Completed 1 of 1 items' -``` +_Computed values_ are updated **lazily**. Any computed value that is not actively in use will not be updated until it is needed for a side effect (I/O). +If a view is no longer in use it will be garbage collected automatically. -In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. +All _Computed values_ should be **pure**. They are not supposed to change _state_. diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 9d1b83294..30dac7c01 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -12,18 +12,16 @@ So far it all might sound a bit fancy, but making an app reactive using MobX boi Store state in any data structure you like; objects, array, classes. Cyclic data structures, references, it doesn't matter. -Just make sure that all properties that you want to change over time are marked by `mobx` to make them observable. +Just make sure that all properties that you want to change over time are marked by MobX to make them observable. ```javascript -import { makeObservable, observable } from "mobx" +import { makeAutoObservable } from "mobx" class AppState { timer = 0 constructor() { - makeObservable(this, { - timer: observable - }) + makeAutoObservable(this) } } @@ -61,17 +59,13 @@ Let's alter the timer every second, and see that the UI will update automaticall Here's the new `AppState` model with a few methods added that modify state: ```javascript -import { makeObservable, observable, action } from "mobx" +import { makeAutoObservable } from "mobx" class AppState { timer = 0 constructor() { - makeObservable(this, { - timer: observable, - resetTimer: action, - increaseTimer: action - }) + makeAutoObservable(this) } increaseTimer() { @@ -90,35 +84,8 @@ setInterval(() => { const appState = new AppState() ``` -These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. The only thing you need to do is to mark them as `action` with `makeObservable`. By marking methods this way you make MobX automatically -apply transactions for optimal performance. +These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. **_MobX helps you do things in a simple straightforward way_**. Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/) or by cloning the [MobX boilerplate project](https://github.com/mobxjs/mobx-react-boilerplate) - -## 4. Automating `makeObservable` with `makeAutoObservable` - -MobX has a function `makeAutoObservable` that automatically marks properties -as `observable` and methods as `action` (and getters as `computed`). We -could have used this instead to simplify the `AppState` class: - -```javascript -import { makeAutoObservable } from "mobx" - -class AppState { - timer = 0 - - constructor() { - makeAutoObservable(this) - } - - increaseTimer() { - this.timer += 1 - } - - resetTimer() { - this.timer = 0 - } -} -``` diff --git a/website/i18n/en.json b/website/i18n/en.json index 20630da9f..ff223fcd5 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -112,6 +112,9 @@ "title": "provider_inject", "sidebar_label": "Provider / inject" }, + "refguide/make-auto-observable": { + "title": "refguide/make-auto-observable" + }, "refguide/map": { "title": "Observable Maps", "sidebar_label": "maps" diff --git a/website/sidebars.json b/website/sidebars.json index 0f69d7bb1..68b85f520 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -3,8 +3,8 @@ "Basics": [ "README", "intro/installation", - "intro/concepts", - "intro/overview" + "intro/overview", + "intro/concepts" ], "Making things observable": [ "refguide/observable", From 93dc7739d0f136dae6d53086c609e089d261b184 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 26 Jun 2020 11:43:57 +0200 Subject: [PATCH 0351/1043] Remove the starter project link, as per Michel's suggestion. --- docs/intro/overview.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 30dac7c01..b733d840e 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -88,4 +88,6 @@ These methods, `increaseTimer` and `resetTimer` are just like you would write th **_MobX helps you do things in a simple straightforward way_**. -Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/) or by cloning the [MobX boilerplate project](https://github.com/mobxjs/mobx-react-boilerplate) +Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). + +To learn more about the concepts and principles underlying MobX, together with a more worked out example, read [Concepts & Principles](concepts.md). From 683a01d57ec8b8cc36a105c280c64fc08a00e8dd Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 26 Jun 2020 11:44:19 +0200 Subject: [PATCH 0352/1043] Start a list of todos. --- notes-docs.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/notes-docs.md b/notes-docs.md index 12440aad6..7fb2ac79b 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -49,3 +49,7 @@ Questions: is the default. So I've rewritten it with that in mind. - The https://github.com/mobxjs/mobx-react-boilerplate project needs updating. + +Todo + +- [ ] Netlify preview for docs PR. From de6b2916a1154d0a8cf2526f6d2b623a3d473612 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 26 Jun 2020 11:45:17 +0200 Subject: [PATCH 0353/1043] Shorter titles. --- docs/intro/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/intro/installation.md b/docs/intro/installation.md index fa1f571e7..f7ce67708 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -17,7 +17,7 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: - Unpkg: ` - ⚠️ When using a CDN, it is best to check the url in your browser and see what version it resolves to, so that your users aren't accidentally served a newer version in the future when updates are release. So use an url like: https://unpkg.com/mobx@5.15.4/lib/mobx.umd.production.min.js instead. Substitute `production.min` with `development` in the URL for a development build. -## MobX on older JavaScript environments? +## Older JavaScript environments By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). For example, when running Microsoft Internet Explorer or React Native (if < v0.59 or when using the Hermes engine) on Android. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). @@ -29,7 +29,7 @@ import { enableES5 } from "mobx" enableES5() ``` -## MobX on modern JavaScript environments? +## Modern JavaScript environments The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` From 6eb1ffccd018c634928e7b1302ecf106303922bc Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jun 2020 19:39:16 +0100 Subject: [PATCH 0354/1043] Some more cleanup --- notes.md | 3 ++- src/api/become-observed.ts | 1 - src/api/decorators.ts | 1 - src/api/makeObservable.ts | 3 +-- src/api/observable.ts | 2 +- src/api/when.ts | 1 - src/core/atom.ts | 1 - src/core/computedvalue.ts | 9 --------- src/mobx.ts | 3 +-- test/v5/base/object-api.js | 2 +- 10 files changed, 6 insertions(+), 20 deletions(-) diff --git a/notes.md b/notes.md index 7d15d41ef..a34bd3ea7 100644 --- a/notes.md +++ b/notes.md @@ -20,6 +20,7 @@ - [x] codemod leave decorators - [x] migrate decorate calls as well - [ ] migrate privates correctly + - [ ] migrate `@observer` calls - [ ] unit tests for `ignoreImports` - [ ] unit tests for `keepDecorators` - [ ] ES5 support @@ -38,7 +39,7 @@ - [x] observable; support `false` as argument - [ ] misc - [x] revisit safety model - - [ ] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! + - [x] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! - [x] verify: action called from computed throws? - [ ] apply deprecation of find and findIndex error - [ ] verify perf / memory changes diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index b235f7139..fd2aa3f6b 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -9,7 +9,6 @@ import { isFunction } from "../internal" -// TODO: can we minify those? const ON_BECOME_OBSERVED = "onBecomeObserved" const ON_BECOME_UNOBSERVED = "onBecomeUnobserved" diff --git a/src/api/decorators.ts b/src/api/decorators.ts index 16610589b..8deb0c424 100644 --- a/src/api/decorators.ts +++ b/src/api/decorators.ts @@ -72,7 +72,6 @@ export function applyDecorators(target: Object): boolean { if (desc) { if (!annotations.length) { for (let key in desc.value) { - // Todo: make 'hasOwnProp' utility // second conditions is to recognize actions if (!hasProp(target, key) && !hasProp(current, key)) { // not all fields are defined yet, so we are in the makeObservable call of some super class, diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index b5c3b7c7c..c008c6d87 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -73,7 +73,7 @@ export function makeProperty( forceCopy: boolean // extend observable will copy even unannotated properties ): void { const { target_: target } = adm - const defaultAnnotation: Annotation | undefined = observable // TODO: grap this from adm instead! + const defaultAnnotation: Annotation | undefined = observable // ideally grap this from adm's defaultEnahncer instead! const origAnnotation = annotation if (annotation === true) { annotation = getInferredAnnotation(descriptor, defaultAnnotation) @@ -117,7 +117,6 @@ export function makeProperty( case COMPUTED: case COMPUTED_STRUCT: { if (!descriptor.get) die(4, key) - // TODO: add to target or proto? adm.addComputedProp_(target, key, { get: descriptor.get, set: descriptor.set, diff --git a/src/api/observable.ts b/src/api/observable.ts index c93449b38..1f6f0be58 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -95,7 +95,7 @@ export function getEnhancerFromAnnotation(annotation?: Annotation): IEnhancer | undefined public onBecomeUnobservedListeners: Set | undefined diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index c26a97cf2..9977d445c 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -127,7 +127,6 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva propagateMaybeChanged(this) } - // TODO: rename? public onBecomeObservedListeners: Set | undefined public onBecomeUnobservedListeners: Set | undefined @@ -166,13 +165,6 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva return result } - // TODO: kill? - public peek(): T { - const res = this.computeValue_(false) - if (isCaughtException(res)) throw res.cause - return res - } - public set(value: T) { if (this.setter_) { if (this.isRunningSetter_) die(33, this.name_) @@ -241,7 +233,6 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } } - // TODO: rename observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda { let firstTime = true let prevValue: T | undefined = undefined diff --git a/src/mobx.ts b/src/mobx.ts index 8c36f3469..217d31948 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -16,8 +16,7 @@ * */ import { dieHard } from "./errors" -;["Symbol", "Map", "Set"].forEach(m => { - // TODO: add more, support `.` notation +;["Symbol", "Map", "Set", "Symbol"].forEach(m => { if (typeof global[m] === "undefined") { dieHard(`MobX requires global '${m}' to be available or polyfilled`) } diff --git a/test/v5/base/object-api.js b/test/v5/base/object-api.js index 9bd6658db..7e998ddad 100644 --- a/test/v5/base/object-api.js +++ b/test/v5/base/object-api.js @@ -182,7 +182,7 @@ test("object - set, remove, keys are reactive", () => { expect(snapshots).toEqual([["a", "x"], ["a", "x", "z"], ["a", "x"], ["x"]]) }) -test.only("object with symbol keys - set, remove, keys are reactive", () => { +test("object with symbol keys - set, remove, keys are reactive", () => { const snapshots = [] const x = Symbol() const y = Symbol() From ced08f55b3649b11771304c9091bd8638c414b02 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jun 2020 19:48:33 +0100 Subject: [PATCH 0355/1043] Some more internal renames --- notes.md | 2 ++ src/api/intercept.ts | 4 ++-- src/api/observe.ts | 4 ++-- src/core/computedvalue.ts | 4 ++-- src/types/intercept-utils.ts | 10 +++++----- src/types/listen-utils.ts | 10 +++++----- src/types/observablearray.ts | 14 ++++---------- src/types/observablemap.ts | 8 ++++---- src/types/observableobject.ts | 8 ++++---- src/types/observableset.ts | 8 ++++---- src/types/observablevalue.ts | 12 ++++++------ test/v5/base/errorhandling.js | 2 +- test/v5/base/map.js | 18 +----------------- test/v5/base/observables.js | 2 +- test/v5/base/observe.ts | 2 +- test/v5/base/set.js | 2 +- 16 files changed, 45 insertions(+), 65 deletions(-) diff --git a/notes.md b/notes.md index a34bd3ea7..6cd6d3692 100644 --- a/notes.md +++ b/notes.md @@ -88,6 +88,8 @@ PHilosophy: one way to do things - [ ] Breaking: Map.toJSON now returns the entries array - [ ] Breaking dropped Set.toJS, use new Set(observableSet) instead - [ ] Breaking Set.toJSON returns an array now +- [ ] Breaking: dropped Array.toJS, use .toJSON instead +- [ ] Breaking: dropped .observe and .intercept on types, use the {observe, intercept} from 'mobx' instead - [ ] Running codemod: yarn jscodeshift -t codemod/undecorate.ts test/v5/base/typescript-tests.ts --ignoreImports=true - [ ] killed: IGNORE_MOBX_MINIFY_WARNING - [ ] Document: recommended settings for prod versus experimentation diff --git a/src/api/intercept.ts b/src/api/intercept.ts index d550d48a2..852f52a2b 100644 --- a/src/api/intercept.ts +++ b/src/api/intercept.ts @@ -48,9 +48,9 @@ export function intercept(thing, propOrHandler?, handler?): Lambda { } function interceptInterceptable(thing, handler) { - return getAdministration(thing).intercept(handler) + return getAdministration(thing).intercept_(handler) } function interceptProperty(thing, property, handler) { - return getAdministration(thing, property).intercept(handler) + return getAdministration(thing, property).intercept_(handler) } diff --git a/src/api/observe.ts b/src/api/observe.ts index 0c18f4bea..23af45d73 100644 --- a/src/api/observe.ts +++ b/src/api/observe.ts @@ -59,9 +59,9 @@ export function observe(thing, propOrCb?, cbOrFire?, fireImmediately?): Lambda { } function observeObservable(thing, listener, fireImmediately: boolean) { - return getAdministration(thing).observe(listener, fireImmediately) + return getAdministration(thing).observe_(listener, fireImmediately) } function observeObservableProperty(thing, property, listener, fireImmediately: boolean) { - return getAdministration(thing, property).observe(listener, fireImmediately) + return getAdministration(thing, property).observe_(listener, fireImmediately) } diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 9977d445c..456a71cb3 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -36,7 +36,7 @@ import { export interface IComputedValue { get(): T set(value: T): void - observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda + observe_(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda } export interface IComputedValueOptions { @@ -233,7 +233,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } } - observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda { + observe_(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda { let firstTime = true let prevValue: T | undefined = undefined return autorun(() => { diff --git a/src/types/intercept-utils.ts b/src/types/intercept-utils.ts index df95fcefc..d663cfe76 100644 --- a/src/types/intercept-utils.ts +++ b/src/types/intercept-utils.ts @@ -3,19 +3,19 @@ import { Lambda, once, untrackedEnd, untrackedStart, die } from "../internal" export type IInterceptor = (change: T) => T | null export interface IInterceptable { - interceptors: IInterceptor[] | undefined - intercept(handler: IInterceptor): Lambda + interceptors_: IInterceptor[] | undefined + intercept_(handler: IInterceptor): Lambda } export function hasInterceptors(interceptable: IInterceptable) { - return interceptable.interceptors !== undefined && interceptable.interceptors.length > 0 + return interceptable.interceptors_ !== undefined && interceptable.interceptors_.length > 0 } export function registerInterceptor( interceptable: IInterceptable, handler: IInterceptor ): Lambda { - const interceptors = interceptable.interceptors || (interceptable.interceptors = []) + const interceptors = interceptable.interceptors_ || (interceptable.interceptors_ = []) interceptors.push(handler) return once(() => { const idx = interceptors.indexOf(handler) @@ -30,7 +30,7 @@ export function interceptChange( const prevU = untrackedStart() try { // Interceptor can modify the array, copy it to avoid concurrent modification, see #1950 - const interceptors = [...(interceptable.interceptors || [])] + const interceptors = [...(interceptable.interceptors_ || [])] for (let i = 0, l = interceptors.length; i < l; i++) { change = interceptors[i](change) if (change && !(change as any).type) die(14) diff --git a/src/types/listen-utils.ts b/src/types/listen-utils.ts index 9a88b7ecc..563cf2c74 100644 --- a/src/types/listen-utils.ts +++ b/src/types/listen-utils.ts @@ -1,16 +1,16 @@ import { Lambda, once, untrackedEnd, untrackedStart } from "../internal" export interface IListenable { - changeListeners: Function[] | undefined - observe(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda + changeListeners_: Function[] | undefined + observe_(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda } export function hasListeners(listenable: IListenable) { - return listenable.changeListeners !== undefined && listenable.changeListeners.length > 0 + return listenable.changeListeners_ !== undefined && listenable.changeListeners_.length > 0 } export function registerListener(listenable: IListenable, handler: Function): Lambda { - const listeners = listenable.changeListeners || (listenable.changeListeners = []) + const listeners = listenable.changeListeners_ || (listenable.changeListeners_ = []) listeners.push(handler) return once(() => { const idx = listeners.indexOf(handler) @@ -20,7 +20,7 @@ export function registerListener(listenable: IListenable, handler: Function): La export function notifyListeners(listenable: IListenable, change: T) { const prevU = untrackedStart() - let listeners = listenable.changeListeners + let listeners = listenable.changeListeners_ if (!listeners) return listeners = listeners.slice() for (let i = 0, l = listeners.length; i < l; i++) { diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 7bc1dce02..206db4b15 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -36,15 +36,9 @@ export const MAX_SPLICE_SIZE = 10000 // See e.g. https://github.com/mobxjs/mobx/ export interface IObservableArray extends Array { spliceWithArray(index: number, deleteCount?: number, newItems?: T[]): T[] - observe( - listener: (changeData: IArrayChange | IArraySplice) => void, - fireImmediately?: boolean - ): Lambda - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda clear(): T[] replace(newItems: T[]): T[] remove(value: T): boolean - toJS(): T[] toJSON(): T[] } @@ -120,8 +114,8 @@ export class ObservableArrayAdministration implements IInterceptable | IArrayWillSplice>, IListenable { atom_: IAtom values_: any[] = [] - interceptors - changeListeners + interceptors_ + changeListeners_ enhancer_: (newV: any, oldV: any | undefined) => any dehancer: any proxy_: any[] = undefined as any @@ -149,11 +143,11 @@ export class ObservableArrayAdministration } // TODO: rename - intercept(handler: IInterceptor | IArrayWillSplice>): Lambda { + intercept_(handler: IInterceptor | IArrayWillSplice>): Lambda { return registerInterceptor | IArrayWillSplice>(this, handler) } - observe( + observe_( listener: (changeData: IArrayChange | IArraySplice) => void, fireImmediately = false ): Lambda { diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 4e2e99108..82c4f66e9 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -90,8 +90,8 @@ export class ObservableMap data_: Map> hasMap_: Map> // hasMap, not hashMap >-). keysAtom_: IAtom - interceptors - changeListeners + interceptors_ + changeListeners_ dehancer: any constructor( @@ -430,14 +430,14 @@ export class ObservableMap * for callback details */ // TODO: kill - observe(listener: (changes: IMapDidChange) => void, fireImmediately?: boolean): Lambda { + observe_(listener: (changes: IMapDidChange) => void, fireImmediately?: boolean): Lambda { if (__DEV__ && fireImmediately === true) die("`observe` doesn't support fireImmediately=true in combination with maps.") return registerListener(this, listener) } // TODO: kill - intercept(handler: IInterceptor>): Lambda { + intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } } diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index d89abd538..7f17996e0 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -82,8 +82,8 @@ const REMOVE = "remove" export class ObservableObjectAdministration implements IInterceptable, IListenable { keysAtom_: IAtom - changeListeners - interceptors + changeListeners_ + interceptors_ proxy_: any private pendingKeys_: undefined | Map> @@ -282,13 +282,13 @@ export class ObservableObjectAdministration * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe * for callback details */ - observe(callback: (changes: IObjectDidChange) => void, fireImmediately?: boolean): Lambda { + observe_(callback: (changes: IObjectDidChange) => void, fireImmediately?: boolean): Lambda { if (__DEV__ && fireImmediately === true) die("`observe` doesn't support the fire immediately property for observable objects.") return registerListener(this, callback) } - intercept(handler): Lambda { + intercept_(handler): Lambda { return registerInterceptor(this, handler) } diff --git a/src/types/observableset.ts b/src/types/observableset.ts index 207084494..e425bea14 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -63,8 +63,8 @@ export class ObservableSet implements Set, IInterceptable = new Set() private atom_: IAtom - changeListeners - interceptors + changeListeners_ + interceptors_ dehancer: any enhancer_: (newV: any, oldV: any | undefined) => any @@ -236,7 +236,7 @@ export class ObservableSet implements Set, IInterceptable) => void, fireImmediately?: boolean): Lambda { + observe_(listener: (changes: ISetDidChange) => void, fireImmediately?: boolean): Lambda { // TODO 'fireImmediately' can be true? if (__DEV__ && fireImmediately === true) die("`observe` doesn't support fireImmediately=true in combination with sets.") @@ -244,7 +244,7 @@ export class ObservableSet implements Set, IInterceptable>): Lambda { + intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 197bbc8df..6a3aece27 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -39,8 +39,8 @@ export interface IValueDidChange extends IValueWillChange { export interface IObservableValue { get(): T set(value: T): void - intercept(handler: IInterceptor>): Lambda - observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda + intercept_(handler: IInterceptor>): Lambda + observe_(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda } const CREATE = "create" @@ -48,8 +48,8 @@ const CREATE = "create" export class ObservableValue extends Atom implements IObservableValue, IInterceptable>, IListenable { hasUnreportedChange_ = false - interceptors - changeListeners + interceptors_ + changeListeners_ value_ dehancer: any @@ -127,12 +127,12 @@ export class ObservableValue extends Atom } // TODO: kill? - public intercept(handler: IInterceptor>): Lambda { + public intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } // TODO: kill? - public observe( + public observe_( listener: (change: IValueDidChange) => void, fireImmediately?: boolean ): Lambda { diff --git a/test/v5/base/errorhandling.js b/test/v5/base/errorhandling.js index 878d241c1..3c3756a73 100644 --- a/test/v5/base/errorhandling.js +++ b/test/v5/base/errorhandling.js @@ -245,7 +245,7 @@ test("cycle1", function() { return p.get() * 2 }) // thats a cycle! utils.consoleError(() => { - p.observe(voidObserver, true) + mobx.observe(p, voidObserver, true) }, /Cycle detected/) checkGlobalState() }) diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 0547394b9..0cbdb32a9 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -12,7 +12,7 @@ test("map crud", function() { const events = [] const m = map({ "1": "a" }) - m.observe(function(changes) { + mobx.observe(m, function(changes) { events.push(changes) }) @@ -295,7 +295,6 @@ test("issue 100", function() { myMap: map() }) expect(mobx.isObservableMap(that.myMap)).toBe(true) - expect(typeof that.myMap.observe).toBe("function") }) test("issue 119 - unobserve before delete", function() { @@ -910,21 +909,6 @@ test("toStringTag", () => { expect(Object.prototype.toString.call(x)).toBe("[object Map]") }) -test("verify #1524", () => { - class Store { - articles = new Map() - - constructor() { - makeObservable(this, { - articles: mobx.observable - }) - } - } - - const store = new Store() - expect(typeof store.articles.observe === "function").toBe(true) -}) - test("#1583 map.size not reactive", () => { const map = mobx.observable(new Map()) const sizes = [] diff --git a/test/v5/base/observables.js b/test/v5/base/observables.js index 617191a43..8cd3d63f6 100644 --- a/test/v5/base/observables.js +++ b/test/v5/base/observables.js @@ -1071,7 +1071,7 @@ test("computed values believe deep NaN === deep NaN when using compareStructural ) const buf = new buffer() - c.observe(newValue => { + c.observe_(newValue => { buf(newValue) }) diff --git a/test/v5/base/observe.ts b/test/v5/base/observe.ts index b61ee352a..d149763c5 100644 --- a/test/v5/base/observe.ts +++ b/test/v5/base/observe.ts @@ -42,7 +42,7 @@ test("observe computed values", () => { const f = observable.box(0) const c = computed(() => v.get()) - c.observe(e => { + c.observe_(e => { v.get() f.get() events.push([e.newValue, e.oldValue]) diff --git a/test/v5/base/set.js b/test/v5/base/set.js index 4188982b7..f999048e6 100644 --- a/test/v5/base/set.js +++ b/test/v5/base/set.js @@ -9,7 +9,7 @@ test("set crud", function() { const events = [] const s = set([1]) - s.observe(changes => { + mobx.observe(s, changes => { events.push(changes) }) From f0c1d1692b96fef10286f0533684824b26e49509 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jun 2020 19:56:16 +0100 Subject: [PATCH 0356/1043] ..and more of that --- src/api/become-observed.ts | 10 ++++------ src/core/atom.ts | 18 ++++++++++-------- src/core/computedvalue.ts | 16 ++++++++-------- src/core/observable.ts | 12 ++++++------ 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index fd2aa3f6b..0a77a063c 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -9,8 +9,8 @@ import { isFunction } from "../internal" -const ON_BECOME_OBSERVED = "onBecomeObserved" -const ON_BECOME_UNOBSERVED = "onBecomeUnobserved" +const ON_BECOME_OBSERVED = "onBO" +const ON_BECOME_UNOBSERVED = "onBUO" export function onBecomeObserved( value: @@ -48,13 +48,11 @@ export function onBecomeUnobserved(thing, arg2, arg3?): Lambda { return interceptHook(ON_BECOME_UNOBSERVED, thing, arg2, arg3) } -function interceptHook(hook: "onBecomeObserved" | "onBecomeUnobserved", thing, arg2, arg3) { +function interceptHook(hook: "onBO" | "onBUO", thing, arg2, arg3) { const atom: IObservable = typeof arg3 === "function" ? getAtom(thing, arg2) : (getAtom(thing) as any) const cb = isFunction(arg3) ? arg3 : arg2 - const listenersKey = `${hook}Listeners` as - | "onBecomeObservedListeners" - | "onBecomeUnobservedListeners" + const listenersKey = `${hook}L` as "onBOL" | "onBUOL" if (atom[listenersKey]) { atom[listenersKey]!.add(cb) diff --git a/src/core/atom.ts b/src/core/atom.ts index 92390c1b4..b3458e97e 100644 --- a/src/core/atom.ts +++ b/src/core/atom.ts @@ -35,18 +35,20 @@ export class Atom implements IAtom { */ constructor(public name_ = "Atom@" + getNextId()) {} - public onBecomeObservedListeners: Set | undefined - public onBecomeUnobservedListeners: Set | undefined + // onBecomeObservedListeners + public onBOL: Set | undefined + // onBecomeUnobservedListeners + public onBUOL: Set | undefined - public onBecomeObserved() { - if (this.onBecomeObservedListeners) { - this.onBecomeObservedListeners.forEach(listener => listener()) + public onBO() { + if (this.onBOL) { + this.onBOL.forEach(listener => listener()) } } - public onBecomeUnobserved() { - if (this.onBecomeUnobservedListeners) { - this.onBecomeUnobservedListeners.forEach(listener => listener()) + public onBUO() { + if (this.onBUOL) { + this.onBUOL.forEach(listener => listener()) } } diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 456a71cb3..19fecdfc5 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -127,18 +127,18 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva propagateMaybeChanged(this) } - public onBecomeObservedListeners: Set | undefined - public onBecomeUnobservedListeners: Set | undefined + public onBOL: Set | undefined + public onBUOL: Set | undefined - public onBecomeObserved() { - if (this.onBecomeObservedListeners) { - this.onBecomeObservedListeners.forEach(listener => listener()) + public onBO() { + if (this.onBOL) { + this.onBOL.forEach(listener => listener()) } } - public onBecomeUnobserved() { - if (this.onBecomeUnobservedListeners) { - this.onBecomeUnobservedListeners.forEach(listener => listener()) + public onBUO() { + if (this.onBUOL) { + this.onBUOL.forEach(listener => listener()) } } diff --git a/src/core/observable.ts b/src/core/observable.ts index 5080fe5a6..5e19df18c 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -31,11 +31,11 @@ export interface IObservable extends IDepTreeNode { observers_: Set - onBecomeUnobserved(): void - onBecomeObserved(): void + onBUO(): void + onBO(): void - onBecomeUnobservedListeners: Set | undefined - onBecomeObservedListeners: Set | undefined + onBUOL: Set | undefined + onBOL: Set | undefined } export function hasObservers(observable: IObservable): boolean { @@ -118,7 +118,7 @@ export function endBatch() { if (observable.isBeingObserved_) { // if this observable had reactive observers, trigger the hooks observable.isBeingObserved_ = false - observable.onBecomeUnobserved() + observable.onBUO() } if (observable instanceof ComputedValue) { // computed values are automatically teared down when the last observer leaves @@ -147,7 +147,7 @@ export function reportObserved(observable: IObservable): boolean { derivation.newObserving_![derivation.unboundDepsCount_++] = observable if (!observable.isBeingObserved_) { observable.isBeingObserved_ = true - observable.onBecomeObserved() + observable.onBO() } } return true From 08cebddbd438f5f62874710b91a01f50792c9378 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 26 Jun 2020 20:19:42 +0100 Subject: [PATCH 0357/1043] Removed array .get / .set --- notes.md | 1 + src/core/derivation.ts | 1 - src/core/globalstate.ts | 1 - src/core/spy.ts | 1 - src/types/dynamicobject.ts | 3 +- src/types/legacyobservablearray.ts | 5 +- src/types/observablearray.ts | 109 ++++++++++++++--------------- test/v4/base/array.js | 6 +- test/v5/base/array.js | 6 +- 9 files changed, 62 insertions(+), 71 deletions(-) diff --git a/notes.md b/notes.md index 6cd6d3692..92a65914e 100644 --- a/notes.md +++ b/notes.md @@ -100,6 +100,7 @@ PHilosophy: one way to do things - [ ] \_allowStateChangesINComputation is no longer needed, us `runInAction` instead. - [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. - [ ] Breaking: `toJS` no longer takes action, and no longer converts Maps and Sets to plain data structures. Serializing data structures is out of scope for the MobX project, and write custom serialization methods are much more sustainable. You might even leverage @computed to serialize state. +- [ ] Breaking: directly calling .get() / .set() on an observable array is no longer supported ## NOTES diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 67fbf6e39..1bedcc585 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -139,7 +139,6 @@ export function checkIfStateModificationsAreAllowed(atom: IAtom) { const hasObservers = atom.observers_.size > 0 // Should not be possible to change observed state outside strict mode, except during initialization, see #563 if (!globalState.allowStateChanges && (hasObservers || globalState.enforceActions === "always")) - // TODO: prefix with mobx console.warn( "[MobX] " + (globalState.enforceActions diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index b96f10443..2a0125c22 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -19,7 +19,6 @@ const persistentKeys: (keyof MobXGlobals)[] = [ export type IUNCHANGED = {} -// TODO: can we minify certain members? export class MobXGlobals { /** * MobXGlobals version. diff --git a/src/core/spy.ts b/src/core/spy.ts index 41602fb8f..0a3f5b816 100644 --- a/src/core/spy.ts +++ b/src/core/spy.ts @@ -1,6 +1,5 @@ import { Lambda, globalState, once } from "../internal" -// TODO: check if all calls are prefixed with __DEV__ in this file export function isSpyEnabled() { return __DEV__ && !!globalState.spyListeners.length } diff --git a/src/types/dynamicobject.ts b/src/types/dynamicobject.ts index dda208a6e..f6451af54 100644 --- a/src/types/dynamicobject.ts +++ b/src/types/dynamicobject.ts @@ -18,12 +18,11 @@ function getAdm(target): ObservableObjectAdministration { // and skip either the internal values map, or the base object with its property descriptors! const objectProxyTraps: ProxyHandler = { has(target: IIsObservableObject, name: PropertyKey) { - // TODO: introduce isConstructor if (name === $mobx || name === "constructor") return true if (__DEV__) warnAboutProxyRequirement() // TODO: is this correct? const adm = getAdm(target) // MWE: should `in` operator be reactive? If not, below code path will be faster / more memory efficient - // TODO: check performance stats! + // check performance stats! // if (adm.values.get(name as string)) return true if (isStringish(name)) return adm.has_(name) return (name as any) in target diff --git a/src/types/legacyobservablearray.ts b/src/types/legacyobservablearray.ts index 13a703553..0e0e3700c 100644 --- a/src/types/legacyobservablearray.ts +++ b/src/types/legacyobservablearray.ts @@ -103,11 +103,10 @@ function createArrayEntryDescriptor(index: number) { enumerable: false, configurable: true, get: function() { - // TODO: redirect to the administraiton - return this.get(index) + return this[$mobx].get_(index) }, set: function(value) { - this.set(index, value) + this[$mobx].set_(index, value) } } } diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 206db4b15..64984c812 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -77,13 +77,14 @@ export interface IArrayWillSplice { const arrayTraps = { get(target, name) { - if (name === $mobx) return target[$mobx] - if (name === "length") return target[$mobx].getArrayLength_() + const adm: ObservableArrayAdministration = target[$mobx] + if (name === $mobx) return adm + if (name === "length") return adm.getArrayLength_() if (typeof name === "number") { - return arrayExtensions.get.call(target, name) + adm.get_(name) } if (typeof name === "string" && !isNaN(name as any)) { - return arrayExtensions.get.call(target, parseInt(name)) + adm.get_(parseInt(name)) } if (hasProp(arrayExtensions, name)) { return arrayExtensions[name] @@ -91,17 +92,18 @@ const arrayTraps = { return target[name] }, set(target, name, value): boolean { + const adm: ObservableArrayAdministration = target[$mobx] if (name === "length") { - target[$mobx].setArrayLength_(value) + adm.setArrayLength_(value) } if (typeof name === "number") { - arrayExtensions.set.call(target, name, value) + adm.set_(name, value) } if (typeof name === "symbol" || isNaN(name)) { target[name] = value } else { // numeric string - arrayExtensions.set.call(target, parseInt(name), value) + adm.set_(parseInt(name), value) } return true }, @@ -283,6 +285,49 @@ export class ObservableArrayAdministration if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() } + + get_(index: number): any | undefined { + if (index < this.values_.length) { + this.atom_.reportObserved() + return this.dehanceValue_(this.values_[index]) + } + console.warn( + __DEV__ + ? `[mobx] Out of bounds read: ${index}` + : `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${this.values_.length}). Please check length first. Out of bound indices will not be tracked by MobX` + ) + } + + set_(index: number, newValue: any) { + const values = this.values_ + if (index < values.length) { + // update at index in range + checkIfStateModificationsAreAllowed(this.atom_) + const oldValue = values[index] + if (hasInterceptors(this)) { + const change = interceptChange>(this as any, { + type: UPDATE, + object: this.proxy_ as any, // since "this" is the real array we need to pass its proxy + index, + newValue + }) + if (!change) return + newValue = change.newValue + } + newValue = this.enhancer_(newValue, oldValue) + const changed = newValue !== oldValue + if (changed) { + values[index] = newValue + this.notifyArrayChildUpdate_(index, newValue, oldValue) + } + } else if (index === values.length) { + // add a new item + this.spliceWithArray_(index, 0, [newValue]) + } else { + // out of bounds + die(17, index, values.length) + } + } } export function createObservableArray( @@ -400,56 +445,6 @@ export var arrayExtensions = { return true } return false - }, - - // TODO: move to array administration - get(index: number): any | undefined { - const adm: ObservableArrayAdministration = this[$mobx] - if (adm) { - if (index < adm.values_.length) { - adm.atom_.reportObserved() - return adm.dehanceValue_(adm.values_[index]) - } - console.warn( - __DEV__ - ? `[mobx] Out of bounds read: ${index}` - : `[mobx.array] Attempt to read an array index (${index}) that is out of bounds (${adm.values_.length}). Please check length first. Out of bound indices will not be tracked by MobX` - ) - } - return undefined - }, - - // TODO: move to array administration - set(index: number, newValue: any) { - const adm: ObservableArrayAdministration = this[$mobx] - const values = adm.values_ - if (index < values.length) { - // update at index in range - checkIfStateModificationsAreAllowed(adm.atom_) - const oldValue = values[index] - if (hasInterceptors(adm)) { - const change = interceptChange>(adm as any, { - type: UPDATE, - object: adm.proxy_ as any, // since "this" is the real array we need to pass its proxy - index, - newValue - }) - if (!change) return - newValue = change.newValue - } - newValue = adm.enhancer_(newValue, oldValue) - const changed = newValue !== oldValue - if (changed) { - values[index] = newValue - adm.notifyArrayChildUpdate_(index, newValue, oldValue) - } - } else if (index === values.length) { - // add a new item - adm.spliceWithArray_(index, 0, [newValue]) - } else { - // out of bounds - die(17, index, values.length) - } } } diff --git a/test/v4/base/array.js b/test/v4/base/array.js index 3f97a6fd1..3511c786d 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -78,9 +78,9 @@ test("test1", function() { expect(JSON.stringify(a)).toBe("[3,1,2]") - expect(a.get(1)).toBe(1) - a.set(2, 4) - expect(a.get(2)).toBe(4) + expect(a[1]).toBe(1) + a[2] = 4 + expect(a[2]).toBe(4) // t.deepEqual(Object.keys(a), ['0', '1', '2']); // ideally.... expect(Object.keys(a)).toEqual([]) diff --git a/test/v5/base/array.js b/test/v5/base/array.js index 81e546d23..6fb21e5cb 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -78,9 +78,9 @@ test("test1", function() { expect(JSON.stringify(a)).toBe("[3,1,2]") - expect(a.get(1)).toBe(1) - a.set(2, 4) - expect(a.get(2)).toBe(4) + expect(a[1]).toBe(1) + a[2] = 4 + expect(a[2]).toBe(4) expect(Object.keys(a)).toEqual(["0", "1", "2"]) // ideally.... }) From fcd15e012b36b65213cdf04720484fb0a8693e8d Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 29 Jun 2020 20:37:09 +0100 Subject: [PATCH 0358/1043] Some cleanup and better handling of sort() and reverse() --- notes.md | 3 ++ src/core/action.ts | 23 ++++++++++----- src/errors.ts | 5 +++- src/types/dynamicobject.ts | 2 +- src/types/intercept-utils.ts | 1 - src/types/listen-utils.ts | 1 - src/types/modifiers.ts | 1 - src/types/observablearray.ts | 25 +++++++--------- src/types/observablemap.ts | 5 +--- src/types/observableobject.ts | 48 ++---------------------------- src/types/observableset.ts | 8 ++--- src/types/observablevalue.ts | 9 ++---- src/utils/utils.ts | 1 - test/v4/base/array.js | 9 +++--- test/v5/base/array.js | 55 ++++++++++++++++++++++++++++++----- 15 files changed, 95 insertions(+), 101 deletions(-) diff --git a/notes.md b/notes.md index 92a65914e..377664e2b 100644 --- a/notes.md +++ b/notes.md @@ -101,6 +101,9 @@ PHilosophy: one way to do things - [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. - [ ] Breaking: `toJS` no longer takes action, and no longer converts Maps and Sets to plain data structures. Serializing data structures is out of scope for the MobX project, and write custom serialization methods are much more sustainable. You might even leverage @computed to serialize state. - [ ] Breaking: directly calling .get() / .set() on an observable array is no longer supported +- [ ] Breaking: killed IObservableObject interface. +- [ ] Breaking: sorting or reversing an array in an derivation will now throw rather than warn. +- [ ] Breaking: sorting or reversing an array in an actino will no sort or reverse the source array rather than shallow copy. ## NOTES diff --git a/src/core/action.ts b/src/core/action.ts index 5cfef07a4..36cf65e53 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -16,13 +16,21 @@ import { die, getDescriptor } from "../internal" +import { addHiddenProp } from "../utils/utils" // we don't use globalState for these in order to avoid possible issues with multiple // mobx versions let currentActionId = 0 let nextActionId = 1 -const functionNameDescriptor = getDescriptor(() => {}, "name") -const isFunctionNameConfigurable = functionNameDescriptor?.configurable ?? false +const isFunctionNameConfigurable = getDescriptor(() => {}, "name")?.configurable ?? false + +// we can safely recycle this object +const tmpNameDescriptor: PropertyDescriptor = { + value: "action", + configurable: true, + writable: false, + enumerable: false +} export function createAction( actionName: string, @@ -38,11 +46,12 @@ export function createAction( function res() { return executeAction(actionName, autoAction, fn, ref || this, arguments) } - // TODO: can be optimized by recyclig objects? // TODO: and check if fn.name !== actionName - return Object.defineProperties(res, { - ...(isFunctionNameConfigurable && { name: { value: actionName } }), - isMobxAction: { value: true } - }) + res.isMobxAction = true + if (isFunctionNameConfigurable) { + tmpNameDescriptor.value = actionName + Object.defineProperty(res, "name", tmpNameDescriptor) + } + return res } export function executeAction( diff --git a/src/errors.ts b/src/errors.ts index 615d7ee92..395a23ca2 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -65,7 +65,10 @@ const niceErrors = { return `[ComputedValue '${name}'] It is not possible to assign a new value to a computed value.` }, 35: "There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`", - 36: "isolateGlobalState should be called before MobX is running any reactions" + 36: "isolateGlobalState should be called before MobX is running any reactions", + 37(method) { + return `[mobx] \`observableArray.${method}()\` mutates the array in-place, which is not allowed inside a derivation. Use \`array.slice().${method}()\` instead` + } } as const const errors: typeof niceErrors = __DEV__ ? niceErrors : ({} as any) diff --git a/src/types/dynamicobject.ts b/src/types/dynamicobject.ts index f6451af54..2f7d7d95e 100644 --- a/src/types/dynamicobject.ts +++ b/src/types/dynamicobject.ts @@ -27,7 +27,7 @@ const objectProxyTraps: ProxyHandler = { if (isStringish(name)) return adm.has_(name) return (name as any) in target }, - // TODO: in has / get support a `toJSON for better representation in console / debugger? + // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html get(target: IIsObservableObject, name: PropertyKey) { if (name === $mobx || name === "constructor") return target[name] const adm = getAdm(target) diff --git a/src/types/intercept-utils.ts b/src/types/intercept-utils.ts index d663cfe76..daf0fde85 100644 --- a/src/types/intercept-utils.ts +++ b/src/types/intercept-utils.ts @@ -4,7 +4,6 @@ export type IInterceptor = (change: T) => T | null export interface IInterceptable { interceptors_: IInterceptor[] | undefined - intercept_(handler: IInterceptor): Lambda } export function hasInterceptors(interceptable: IInterceptable) { diff --git a/src/types/listen-utils.ts b/src/types/listen-utils.ts index 563cf2c74..241311616 100644 --- a/src/types/listen-utils.ts +++ b/src/types/listen-utils.ts @@ -2,7 +2,6 @@ import { Lambda, once, untrackedEnd, untrackedStart } from "../internal" export interface IListenable { changeListeners_: Function[] | undefined - observe_(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda } export function hasListeners(listenable: IListenable) { diff --git a/src/types/modifiers.ts b/src/types/modifiers.ts index 41140b5da..2e64b5a05 100644 --- a/src/types/modifiers.ts +++ b/src/types/modifiers.ts @@ -31,7 +31,6 @@ export function deepEnhancer(v, _, name) { export function shallowEnhancer(v, _, name): any { if (v === undefined || v === null) return v - // TODO: lets make sure isObservableObject become a bit smarter by setting some flag or something... if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v) || isObservableSet(v)) return v if (Array.isArray(v)) return observable.array(v, { name, deep: false }) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 64984c812..f24ccfa1a 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -29,6 +29,7 @@ import { hasProp, die } from "../internal" +import { globalState } from "../core/globalstate" const SPLICE = "splice" export const UPDATE = "update" @@ -144,7 +145,6 @@ export class ObservableArrayAdministration return values } - // TODO: rename intercept_(handler: IInterceptor | IArrayWillSplice>): Lambda { return registerInterceptor | IArrayWillSplice>(this, handler) } @@ -415,26 +415,23 @@ export var arrayExtensions = { reverse(): any[] { // reverse by default mutates in place before returning the result // which makes it both a 'derivation' and a 'mutation'. - // so we deviate from the default and just make it an dervitation - if (__DEV__) { - console.warn( - "[mobx] `observableArray.reverse()` will not update the array in place. Use `observableArray.slice().reverse()` to suppress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().reverse())` to reverse & update in place" - ) + if (globalState.trackingDerivation) { + die(37, "reverse") } - const clone = (this).slice() - return clone.reverse.apply(clone, arguments) + this.replace(this.slice().reverse()) + return this }, sort(): any[] { // sort by default mutates in place before returning the result // which goes against all good practices. Let's not change the array in place! - if (__DEV__) { - console.warn( - "[mobx] `observableArray.sort()` will not update the array in place. Use `observableArray.slice().sort()` to suppress this warning and perform the operation on a copy, or `observableArray.replace(observableArray.slice().sort())` to sort & update in place" - ) + if (globalState.trackingDerivation) { + die(37, "sort") } - const clone = (this).slice() - return this.slice().sort.apply(clone, arguments) + const copy = this.slice() + copy.sort.apply(copy, arguments) + this.replace(copy) + return this }, remove(value: any): boolean { diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 82c4f66e9..ea8f62827 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -83,7 +83,6 @@ export type IObservableMapInitialValues = // just extend Map? See also https://gist.github.com/nestharus/13b4d74f2ef4a2f4357dbd3fc23c1e54 // But: https://github.com/mobxjs/mobx/issues/1556 -// TODO: introduce IObservableMap, and make ObservableMap constructor non public export class ObservableMap implements Map, IInterceptable>, IListenable { [$mobx] = ObservableMapMarker @@ -117,7 +116,7 @@ export class ObservableMap let entry = this.hasMap_.get(key) if (!entry) { - // todo: replace with atom (breaking change) + // TODO: replace with atom (breaking change) const newEntry = (entry = new ObservableValue( this.has_(key), referenceEnhancer, @@ -429,14 +428,12 @@ export class ObservableMap * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe * for callback details */ - // TODO: kill observe_(listener: (changes: IMapDidChange) => void, fireImmediately?: boolean): Lambda { if (__DEV__ && fireImmediately === true) die("`observe` doesn't support fireImmediately=true in combination with maps.") return registerListener(this, listener) } - // TODO: kill intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index 7f17996e0..d690323b6 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -38,11 +38,6 @@ import { hasProp } from "../internal" -// TODO: kill -export interface IObservableObject { - "observable-object": IObservableObject -} - export type IObjectDidChange = | { name: PropertyKey @@ -250,33 +245,6 @@ export class ObservableObjectAdministration } } - // TODO: is this still needed? - illegalAccess_(owner, propName) { - /** - * This happens if a property is accessed through the prototype chain, but the property was - * declared directly as own property on the prototype. - * - * E.g.: - * class A { - * } - * extendObservable(A.prototype, { x: 1 }) - * - * classB extens A { - * } - * console.log(new B().x) - * - * It is unclear whether the property should be considered 'static' or inherited. - * Either use `console.log(A.x)` - * or: decorate(A, { x: observable }) - * - * When using decorate, the property will always be redeclared as own property on the actual instance - */ - __DEV__ && - console.warn( - `Property '${propName}' of '${owner}' was accessed through the prototype chain. Use 'decorate' instead to declare the prop or access it statically through it's owner` - ) - } - /** * Observes this object. Triggers for the events 'add', 'update' and 'delete'. * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe @@ -370,15 +338,6 @@ export function generateObservablePropConfig(propName) { ) } -function getAdministrationForComputedPropOwner(owner: any): ObservableObjectAdministration { - // TODO: what again does this function? - const adm = owner[$mobx] - if (!adm) { - return owner[$mobx] - } - return adm -} - export function generateComputedPropConfig(propName) { return ( computedPropertyConfigs[propName] || @@ -386,22 +345,21 @@ export function generateComputedPropConfig(propName) { configurable: true, enumerable: false, get() { - return getAdministrationForComputedPropOwner(this).read_(propName) + return this[$mobx].read_(propName) }, set(v) { - getAdministrationForComputedPropOwner(this).write_(propName, v) + this[$mobx].write_(propName, v) } }) ) } -// TODO: extract constant for "ObservableObject ? const isObservableObjectAdministration = createInstanceofPredicate( "ObservableObjectAdministration", ObservableObjectAdministration ) -export function isObservableObject(thing: any): thing is IObservableObject { +export function isObservableObject(thing: any): boolean { if (isObject(thing)) { return isObservableObjectAdministration((thing as any)[$mobx]) } diff --git a/src/types/observableset.ts b/src/types/observableset.ts index e425bea14..f50bfc720 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -58,7 +58,6 @@ export type ISetWillChange = newValue: T } -// TODO: introduce IObservableSet, and make ObservableSet constructor non public export class ObservableSet implements Set, IInterceptable, IListenable { [$mobx] = ObservableSetMarker private data_: Set = new Set() @@ -118,7 +117,7 @@ export class ObservableSet implements Set, IInterceptable implements Set, IInterceptable) => void, fireImmediately?: boolean): Lambda { - // TODO 'fireImmediately' can be true? + // ... 'fireImmediately' could also be true? if (__DEV__ && fireImmediately === true) die("`observe` doesn't support fireImmediately=true in combination with sets.") return registerListener(this, listener) } - // TODO: kill intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 6a3aece27..73adc4be7 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -126,16 +126,11 @@ export class ObservableValue extends Atom return this.dehanceValue(this.value_) } - // TODO: kill? - public intercept_(handler: IInterceptor>): Lambda { + intercept_(handler: IInterceptor>): Lambda { return registerInterceptor(this, handler) } - // TODO: kill? - public observe_( - listener: (change: IValueDidChange) => void, - fireImmediately?: boolean - ): Lambda { + observe_(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda { if (fireImmediately) listener({ object: this, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index cd8b7bf6c..83ccd5bc3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -149,7 +149,6 @@ const hasGetOwnPropertySymbols = typeof Object.getOwnPropertySymbols !== "undefi * Returns the following: own keys, prototype keys & own symbol keys, if they are enumerable. */ export function getPlainObjectKeys(object) { - // TODO: use Reflect.ownKeys! const keys = Object.keys(object) // Not supported in IE, so there are not going to be symbol props anyway... if (!hasGetOwnPropertySymbols) return keys diff --git a/test/v4/base/array.js b/test/v4/base/array.js index 3511c786d..c83b6d6d3 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -70,15 +70,16 @@ test("test1", function() { expect(a.slice()).toEqual([1, 2]) expect(a.reverse()).toEqual([2, 1]) - expect(a.slice()).toEqual([1, 2]) + expect(a).toEqual([2, 1]) + expect(a.slice()).toEqual([2, 1]) a.unshift(3) expect(a.sort()).toEqual([1, 2, 3]) - expect(a.slice()).toEqual([3, 1, 2]) + expect(a.slice()).toEqual([1, 2, 3]) - expect(JSON.stringify(a)).toBe("[3,1,2]") + expect(JSON.stringify(a)).toBe("[1,2,3]") - expect(a[1]).toBe(1) + expect(a[1]).toBe(2) a[2] = 4 expect(a[2]).toBe(4) diff --git a/test/v5/base/array.js b/test/v5/base/array.js index 6fb21e5cb..83cbf4642 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -1,7 +1,7 @@ "use strict" const mobx = require("../../../src/mobx.ts") -const { observable, when, _getAdministration, reaction, makeObservable } = mobx +const { observable, when, _getAdministration, reaction, computed, makeObservable, autorun } = mobx const iterall = require("iterall") test("test1", function() { @@ -69,20 +69,59 @@ test("test1", function() { expect(sum.get()).toBe(3) expect(a.slice()).toEqual([1, 2]) - expect(a.slice().reverse()).toEqual([2, 1]) - expect(a.slice()).toEqual([1, 2]) + expect(a.reverse()).toEqual([2, 1]) + expect(a).toEqual([2, 1]) + expect(a.slice()).toEqual([2, 1]) a.unshift(3) - expect(a.slice().sort()).toEqual([1, 2, 3]) - expect(a.slice()).toEqual([3, 1, 2]) + expect(a.sort()).toEqual([1, 2, 3]) + expect(a).toEqual([1, 2, 3]) + expect(a.slice()).toEqual([1, 2, 3]) - expect(JSON.stringify(a)).toBe("[3,1,2]") + expect(JSON.stringify(a)).toBe("[1,2,3]") - expect(a[1]).toBe(1) + expect(a[1]).toBe(2) a[2] = 4 expect(a[2]).toBe(4) - expect(Object.keys(a)).toEqual(["0", "1", "2"]) // ideally.... + expect(Object.keys(a)).toEqual(["0", "1", "2"]) +}) + +test("cannot reverse or sort an array in a derivation", () => { + const ar = observable([3, 2, 1]) + reaction( + () => { + expect(() => { + ar.sort() + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] [mobx] \`observableArray.sort()\` mutates the array in-place, which is not allowed inside a derivation. Use \`array.slice().sort()\` instead"` + ) + }, + () => {} + )() + reaction( + () => { + expect(() => { + ar.reverse() + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] [mobx] \`observableArray.reverse()\` mutates the array in-place, which is not allowed inside a derivation. Use \`array.slice().reverse()\` instead"` + ) + }, + () => {} + )() + + const c = computed(() => { + ar.sort() + }) + autorun(() => { + expect(() => { + c.get() + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] [mobx] \`observableArray.sort()\` mutates the array in-place, which is not allowed inside a derivation. Use \`array.slice().sort()\` instead"` + ) + })() + + expect(ar).toEqual([3, 2, 1]) }) test("array should support iterall / iterable ", () => { From b7a152a2928b9e045c78fbbbf48082460abf76a6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 15:53:44 +0200 Subject: [PATCH 0359/1043] Move observer-component into docs/react/react-integration Create a new section for React to make this documentation more easy to find. Rewrite the basic Overview example to be consistent with the examples in the React integration docs. Introduce a separate doc for class components. --- docs/README.md | 21 +-- docs/intro/concepts.md | 6 +- docs/intro/overview.md | 37 +++-- docs/react/react-class-components.md | 107 +++++++++++++ docs/react/react-integration.md | 213 +++++++++++++++++++++++++ docs/refguide/observer-component.md | 226 --------------------------- notes-docs.md | 52 +++--- website/i18n/en.json | 16 +- website/sidebars.json | 5 +- 9 files changed, 393 insertions(+), 290 deletions(-) create mode 100644 docs/react/react-class-components.md create mode 100644 docs/react/react-integration.md delete mode 100644 docs/refguide/observer-component.md diff --git a/docs/README.md b/docs/README.md index b8febba32..e0b676151 100644 --- a/docs/README.md +++ b/docs/README.md @@ -79,32 +79,33 @@ import ReactDOM from "react-dom" import { makeAutoObservable } from "mobx" import { observer } from "mobx-react" -class AppState { - timer = 0 +// define application state +class Timer { + secondsPassed = 0 constructor() { makeAutoObservable(this) } increaseTimer() { - this.timer += 1 + this.secondsPassed += 1 } resetTimer() { - this.timer = 0 + this.secondsPassed = 0 } } +const myTimer = new Timer() + setInterval(() => { - appState.increaseTimer() + myTimer.increaseTimer() }, 1000) -const appState = new AppState() - -const TimerView = observer(({ appState }) => ( - +const TimerView = observer(({ timer }) => ( + )) -ReactDOM.render(, document.body) +ReactDOM.render(, document.body) ``` To get more detail about this example, see [the gist of MobX](http://mobxjs.github.io/mobx/intro/overview.html). diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 506d0bbd3..f3196e1d8 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -10,7 +10,9 @@ hide_title: true MobX distinguishes the following concepts in your application. -We show example code to illustrate these concepts. For clarity of explanation we don't use the convenience function `makeAutoObservable` yet in this code. In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. +We show example code to illustrate these concepts. For clarity we don't use the convenience function `makeAutoObservable` yet in this code. + +In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. ### 1. State @@ -144,6 +146,8 @@ When using MobX there are no smart or dumb components. All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). +To learn more about how React works with MobX, read [React integration](../react/react-integration.md). + ##### Custom reactions Custom reactions can simply be created using the [`autorun`](../refguide/autorun.md), diff --git a/docs/intro/overview.md b/docs/intro/overview.md index b733d840e..c5eb9f76b 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -17,21 +17,21 @@ Just make sure that all properties that you want to change over time are marked ```javascript import { makeAutoObservable } from "mobx" -class AppState { - timer = 0 +class Timer { + secondsPassed = 0 constructor() { makeAutoObservable(this) } } -const appState = new AppState() +const myTimer = new Timer() ``` ## 2. Create a view that responds to changes in the State -We didn't make our `AppState` observable for nothing; -you can now create views that automatically update whenever relevant data in the `appState` changes. +We didn't make our `Timer` observable for nothing; +you can now create views that automatically update whenever relevant data in a `Timer` instance changes. MobX will find the minimal way to update your views. This single fact saves you tons of boilerplate and is [wickedly efficient](https://mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/). @@ -39,12 +39,14 @@ Generally speaking any function can become a reactive view that observes its dat But here is an (ES6) example of a view in the form of a React component. ```javascript +import React from "react" +import ReactDOM from "react-dom" import { observer } from "mobx-react" -const TimerView = observer(({ appState }) => ( - +const TimerView = observer(({ timer }) => ( + )) -ReactDOM.render(, document.body) +ReactDOM.render(, document.body) ``` (For the implementation of `resetTimer` method see the next section) @@ -56,32 +58,32 @@ That is what your app is all about after all. Let's alter the timer every second, and see that the UI will update automatically when needed. Let's also implement that `resetTimer` method. -Here's the new `AppState` model with a few methods added that modify state: +Here's the new `Timer` model with a few methods added that modify state: ```javascript import { makeAutoObservable } from "mobx" -class AppState { - timer = 0 +class Timer { + secondsPassed = 0 constructor() { makeAutoObservable(this) } increaseTimer() { - this.timer += 1 + this.secondsPassed += 1 } resetTimer() { - this.timer = 0 + this.secondsPassed = 0 } } +const myTimer = new Timer() + setInterval(() => { - appState.increaseTimer() + myTimer.increaseTimer() }, 1000) - -const appState = new AppState() ``` These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. @@ -90,4 +92,5 @@ These methods, `increaseTimer` and `resetTimer` are just like you would write th Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). -To learn more about the concepts and principles underlying MobX, together with a more worked out example, read [Concepts & Principles](concepts.md). +To learn more about the concepts and principles underlying MobX, together with a more worked out example, read [Concepts & Principles](concepts.md). To learn more +about how to use MobX with React, read [React integration](../react/react-integration.md). diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md new file mode 100644 index 000000000..b2d25b095 --- /dev/null +++ b/docs/react/react-class-components.md @@ -0,0 +1,107 @@ +--- +title: React class components +sidebar_label: React based components +hide_title: true +--- + +# React class components + +[react-integration](React integration) discusses the basic patterns for +using MobX with React function components. But MobX also works with React class components. + +## Using `observer` with a class component + +You can use `observer` with a class component just like you do with a function +component: + +```javascript +import React from "React" +import { observer } from "mobx-react" + +const TimerView = observer( + class TimerView extends React.Component { + render() { + const { timer } = this.props + return Seconds passed: {timer.secondsPassed} + } + } +) +``` + +## Local observable state in class based components + +Just like normal classes, you can introduce observable properties on a component by using `makeObservable`. For example: + +```javascript +import React from "React" +import { makeObservable, observable, action } from "mobx" +import { observer } from "mobx-react" + +const TimerView = observer( + class TimerView extends React.Component { + secondsPassed = 0 + + constructor(props) { + super(props) + makeObservable(this, { secondsPassed: observable }) + } + + componentWillMount() { + setInterval( + action(() => { + this.secondsPassed++ + }), + 1000 + ) + } + + render() { + return Seconds passed: {this.secondsPassed} + } + } +) +``` + +For more advantages of using observable local component state, for class based components see [3 reasons why I stopped using `setState`](https://medium.com/@mweststrate/3-reasons-why-i-stopped-using-react-setstate-ab73fc67a42e). + +The props object and the state object of an observer class component are automatically made observable to make it easier to create `computed` properties that derive from props inside such a component. + +## Using decorators + +The previous example looks a bit cumbersome. We recommended switching class +components to function components if you can, and to use `useState` for maintaining +simple state. But decorators are still supported -- here is the same example with +decorators: + +```javascript +import React from "React" +import { makeObservable, observable, action } from "mobx" +import { observer } from "mobx-react" + +@observer +class TimerView extends React.Component { + @observable secondsPassed = 0 + + constructor(props) { + super(props) + makeObservable(this) + } + + @action + increaseTimer() { + this.secondsPassed += 1 + } + + componentWillMount() { + setInterval(() => this.increaseTimer(), 1000) + } + + render() { + const { timer } = this.props + return Seconds passed: {timer.secondsPassed} + } +} +``` + +You can read more about [decorator support in MobX][../best/decorators.md], +including how to enable them. diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md new file mode 100644 index 000000000..bb68ed903 --- /dev/null +++ b/docs/react/react-integration.md @@ -0,0 +1,213 @@ +--- +title: React integration +sidebar_label: React integration +hide_title: true +--- + +# React integration + +While MobX is dependent from React they are most commonly used together. In [the gist of Mobx](../intro/overview.md) as well as the [conceptual introduction](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. + +The `observer` HoC subscribes React components automatically to _any observables_ that are used _during render_. +As a result, components will automatically re-render when relevant observables change. +But it also makes sure that components don't re-render when there are _no relevant_ changes. +As a result MobX applications are in practice much better optimized than Redux or vanilla React applications are out of the box. + +- `observer` is provided through the separate [`mobx-react` package](https://github.com/mobxjs/mobx-react). +- If your code base doesn't have any class based components but only uses function components, you can also the [`mobx-react-lite` package](https://github.com/mobxjs/mobx-react-lite), which is smaller. + +## `observer` automatically tracks observables used during render + +Using `observer` is pretty straight forward: + +```javascript +import React from "react" +import ReactDOM from "react-dom" +import { makeAutoObservable } from "mobx" +import { observer } from "mobx-react" + +class Timer { + secondsPassed = 0 + + constructor() { + makeAutoObservable(this) + } + + increaseTimer() { + this.secondsPassed += 1 + } +} + +const myTimer = new Timer() + +setInterval(() => { + myTimer.increaseTimer() +}, 1000) + +// A function component wrapped with `observer` reacts to changes to anything observable that it uses automatically +const TimerView = observer(({ timer }) => Seconds passed: {timer.secondsPassed}) + +ReactDOM.render(, document.body) +``` + +Because `observer` automatically tracks any observables that are used (and none more), the `Timer` component above will automatically re-render whenever `myTimer.secondsPassed` is updated, since it is declared as an observable. + +Note that `observer` _only_ subscribes to observables used during the _own_ render of the component. So if observables are passed to child components, those have to be marked as `observer` as well. This also holds for any callback based components. + +## `observer` listens to _any_ observables used + +In above components the app state is received as prop, but in principle that is irrelevant for the working for `observer`. +Rewriting the `TimerView` component above to the following results in semantically the same application: + +```javascript +const TimerView = observer(() => Seconds passed: {myTimer.secondsPassed} ) +``` + +Note that `TimerView` does not take any props now, but directly refers to the `myTimer` instance from the closure. + +We recommend you pass observable components as props instead of directly using a global, because it makes your code more loosely coupled and testable, though this pattern can be useful at times at the root of your application or if you have globally shared state. In any case this demonstrates that `observer` tracks any observables used, regardless where they are coming from. + +## Using context to pass observables around + +This means that it also possible to store observables in context and use them, and `observer` still does its job: + +```javascript +import { useContext } from "react" + +const TimerContext = React.createContext() + +const TimerView = observer(() => { + const timer = useContext(TimerContext) + return Seconds passed: {timer.secondsPassed} +}) + +const App = () => ( + + + +) +``` + +## Storing observables in local component state + +Similarly, we can store observables in local component state using `useState`. Although in practice local component state is often simple enough to not really need observables. Note that we don't need the state _setter_ since we will mutate the observable, rather than replacing it entirely: + +```javascript +import { action, observable } from "mobx" + +const TimerView = observer(() => { + const [timer] = useState(() => + observable({ + secondsPassed: 0 + }) + ) + + useEffect(() => { + const handle = setInterval( + action(() => { + timer.secondsPassed++ + }), + 1000 + ) + return () => { + clearTimeout(handle) + } + }, []) + + return Seconds passed: {timer.secondsPassed} +}) +``` + +- Tip: the [`useLocalStore`](https://github.com/mobxjs/mobx-react#uselocalstore-hook) hook further simplifies this pattern. +- Tip: if for some reason `props` or non-observable local state needs to be synced with the observable state, the [`useObservableSource`](https://github.com/mobxjs/mobx-react#useasobservablesource-hook) hook can be used. + +In general we recommend not to resort to using MobX observables for local component state too quickly; as this can theoretically lock you out of some features of React's Suspense mechanism. You can instead use the [`useState` hook](https://reactjs.org/docs/hooks-state.html) directly, without the use of `observable`. Using MobX observables as local state can add real value when there are complex computations involved (which MobX will optimize) or when there are complex view models. + +## When to apply `observer`? + +The simple rule of thumb is: _all components that render observable data_. If +you are in doubt, apply `observer` as using it is cheap. + +If you don't want to mark a component as observer, for example to reduce the dependencies of a generic component package, make sure you only pass it plain data, for example by converting it to plain data in a parent component, that is an `observer`, using `toJS`. + +## Characteristics of observer components + +- Observer enables your components to interact with state that is not managed by React, and still update as efficiently as possible. This is great for decoupling. +- Observer only subscribe to the data structures that were actively used during the last render. This means that you cannot under-subscribe or over-subscribe. You can even use data in your rendering that will only be available at a later moment in time. This is ideal for asynchronously loading data. +- You are not required to declare what data a component uses. Instead, dependencies are determined at runtime and tracked in a very fine-grained manner. +- `observer` implements `memo` / `shouldComponentUpdate` automatically so that children are not re-rendered unnecessary. +- `observer` based components sideways load data; parent components won't re-render unnecessarily even when child components will. + +## React class based components + +Briefly, you can wrap class-based components in `observer` just like +you can wrap function components: + +```javascript +import React from "React" + +const TimerView = observer( + class TimerView extends React.Component { + render() { + const { timer } = this.props + return Seconds passed: {timer.secondsPassed} + } + } +) +``` + +See [React class components](react-class-components.md) for more information. + +## Tips + +#### Use the `` component in cases where you can't use observer + +Sometimes it is hard to apply `observer` to a part of the rendering, for example because you are rendering inside a callback, and you don't want to extract a new component to be able to mark it as `observer`. +In those cases [``](https://github.com/mobxjs/mobx-react#observer) comes in handy. It takes a callback render function, that is automatically rendered again every time an observable used is changed: + +```javascript +import { Observer } from "mobx-react" + +const TimerView = ({ timer }) => ( +
    + Seconds passed: + {() => {timer.secondsPassed} } +
    +) +``` + +#### How can I further optimize my React components? + +See the relevant [React performance section](../best/react-performance.md). + +#### When combining `observer` with other higher-order-components, apply `observer` first + +When `observer` needs to be combined with other decorators or higher-order-components, make sure that `observer` is the innermost (first applied) decorator; +otherwise it might do nothing at all. + +#### Gotcha: dereference values _inside_ your components + +MobX can do a lot, but it cannot make primitive values observable (although it can wrap them in an object; see [boxed observables](../refguide/boxed.md)). +So it is not the _values_ that are observable, but the _properties_ of an object. This means that `observer` actually reacts to the fact that you dereference a value. + +So in this example, the `TimerView` component would **not** react if it was defined +as follows: + +```javascript +const TimerView = observer(({ secondsPassed }) => Seconds passed: {secondsPassed}) + +React.render(, document.body) +``` + +In this snippet only the current value of `myTimer.secondsPassed` is passed to `TimerView`, which is the immutable value `0` (all primitives are immutable in JS). +That number value won't change anymore in the future, so `TimerView` will never update. It is the property `secondsPassed` that will change in the future, +so we need to access it _inside_ the component. One could also say: values need to be passed _by reference_ and not by value. + +If the problem is not entirely clear, make sure to study [what does MobX react to?](../best/react.md) first! + +## Troubleshooting + +1. Make sure you didn't forget `observer` (yes, this is the most common mistake) +2. Make sure you grok how tracking works in general: [what will MobX react to](../best/react.md) +3. Read the [common mistakes](../best/pitfalls.md) section +4. Use [trace](../best/trace.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](../refguide/spy.md) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. diff --git a/docs/refguide/observer-component.md b/docs/refguide/observer-component.md deleted file mode 100644 index c2ec139b5..000000000 --- a/docs/refguide/observer-component.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: (@)observer components -sidebar_label: (@)observer components -hide_title: true ---- - -# @observer - -
    - -
    - egghead.io lesson 1: observable & observer -
    -
    - -
    - Hosted on egghead.io -
    - -The `observer` HoC / decorator subscribes React components automatically to _any observables_ that are used _during render_. -As a result, components will automatically re-render when relevant observables change. -But it also makes sure that components don't re-render when there are _no relevant_ changes. -As a result MobX applications are in practice much better optimized than Redux or vanilla React applications are out of the box. - -- `observer` is provided through the separate [`mobx-react` package](https://github.com/mobxjs/mobx-react). -- If your code base doesn't have any class based components, you can also the [`mobx-react-lite` package](https://github.com/mobxjs/mobx-react-lite), which is smaller. - -## `observer` automatically tracks observables used during render - -Using `observer` is pretty straight forward: - -```javascript -import { observer } from "mobx-react" - -var timerData = observable({ - secondsPassed: 0 -}) - -setInterval(() => { - timerData.secondsPassed++ -}, 1000) - -// A hooks based component wrapped with `timerData` will react to changes automatically -const Timer = observer(({ timerData }) => Seconds passed: {timerData.secondsPassed} ) - -// Alternatively, a class based component: -@observer -class Timer extends React.Component { - render() { - return Seconds passed: {this.props.timerData.secondsPassed} - } -} - -ReactDOM.render(, document.body) -``` - -Because `observer` automatically tracks any observables that are used (and none more), the `Timer` component above will automatically re-render whenever `timerData.secondsPassed` is updated, since it is declared as an observable. - -Note that `observer` _only_ subscribes to observables used during the _own_ render of the component. So if observables are passed to child components, those have to be marked as `observer` as well. This also holds for any callback based components. - -## `observer` listens to _any_ observables used - -In above components the timer data is received as prop, but in principle that is irrelevant for the working for `observer`. -Rewriting the `Timer` component above to the following results in semantically the same application: - -```javascript -const timerData = observable(/* ... */) - -const Timer = observer(() => Seconds passed: {timerData.secondsPassed} ) -``` - -Note that the `timerData` is now read directly from the closure. -This is a practice we don't recommend, but is shown to demonstrate that `observer` tracks any observables used, regardless where they are coming from. - -## Using context to pass observables around - -This means that it also possible to store observables in context and use them, and `observer` will still do its job: - -```javascript -const TimerContext = React.createContext() - -const Timer = observer(() => { - const timerData = useContext(TimerContext) - return Seconds passed: {timerData.secondsPassed} -}) - -const timerData = observable(/* ... */) - -const App = () => ( - - - -) -``` - -## Storing observables in local component state - -Similarly, we can store observables in local component state using `useState`. Although in practice local component state is often simple enough to not really need observables. Note that we don't need the state _setter_ since we will mutate the observable, rather than replacing it entirely: - -```javascript -const Timer = observer(() => { - const [timerData] = useState(() => - observable({ - secondsPassed: 0 - }) - ) - - useEffect(() => { - const handle = setInterval(() => { - timerData.secondsPassed++ - }, 1000) - return () => { - clearTimeout(handle) - } - }, []) - - return Seconds passed: {timerData.secondsPassed} -}) -``` - -- Tip: the [`useLocalStore`](https://github.com/mobxjs/mobx-react#uselocalstore-hook) hook further simplifies this pattern. -- Tip: if for some reason `props` or non-observable local state needs to be synced with the observable state, the [`useObservableSource`](https://github.com/mobxjs/mobx-react#useasobservablesource-hook) hook can be used. - -In general we recommend to not resort to using MobX observables for local component state too quickly; as this can theoretically lock you out of some features of React's Suspense mechanism. Generally speaking it only adds real value when there are complex computations involved (which MobX will optimize) or when there are complex view models. - -## Local observable state in class based components - -Just like normal classes, you can introduce observable properties on a component by using the `@observable` decorator. -Hence the example above could also have been written as: - -```javascript -@observer -class Timer extends React.Component { - @observable secondsPassed = 0 - - componentWillMount() { - setInterval(() => { - this.secondsPassed++ - }, 1000) - } - - render() { - return Seconds passed: {this.secondsPassed} - } -} -``` - -For more advantages of using observable local component state, for class based components see [3 reasons why I stopped using `setState`](https://medium.com/@mweststrate/3-reasons-why-i-stopped-using-react-setstate-ab73fc67a42e). - -## When to apply `observer`? - -The simple rule of thumb is: _all components that render observable data_. -If you don't want to mark a component as observer, for example to reduce the dependencies of a generic component package, make sure you only pass it plain data, for example by converting it to plain data in a parent component, that is an `observer`, using `toJS`. - -## Characteristics of observer components - -- Observer enables your components to interact with state that is not managed by React, and still update as efficiently as possible. This is great for decoupling. -- Observer only subscribe to the data structures that were actively used during the last render. This means that you cannot under-subscribe or over-subscribe. You can even use data in your rendering that will only be available at later moment in time. This is ideal for asynchronously loading data. -- You are not required to declare what data a component will use. Instead, dependencies are determined at runtime and tracked in a very fine-grained manner. -- `@observer` implements `memo` / `shouldComponentUpdate` automatically so that children are not re-rendered unnecessary. -- `observer` based components sideways load data; parent components won't re-render unnecessarily even when child components will. -- The props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component. - -## Tips - -#### Use the `` component in cases where you can't use observer - -Sometimes it is hard to apply `observer` to a part of the rendering, for example because you are rendering inside a callback, and you don't want to extract a new component to be able to mark it as `observer`. -In those cases [``](https://github.com/mobxjs/mobx-react#observer) comes in handy. It takes a callback render function, that is automatically rendered again every time an observable used is changed: - -```javascript -const Timer = ({ timerData }) => ( -
    - Seconds passed: - {() => {timerData.secondsPassed} } -
    -) -``` - -#### How can I further optimize my React components? - -See the relevant [React performance section](../best/react-performance.md). - -#### Using `observer` with classes without decorators - -Using `@observer` as a decorator is optional, `const Timer = observer(class Timer ... { })` achieves exactly the same. - -#### How to enable decorators? - -See also the [syntax guide](../best/decorators.md) - -#### When combining `observer` with other higher-order-components, apply `observer` first - -When `observer` needs to be combined with other decorators or higher-order-components, make sure that `observer` is the innermost (first applied) decorator; -otherwise it might do nothing at all. - -#### Gotcha: dereference values _inside_ your components - -MobX can do a lot, but it cannot make primitive values observable (although it can wrap them in an object see [boxed observables](boxed.md)). -So not the _values_ that are observable, but the _properties_ of an object. This means that `@observer` actually reacts to the fact that you dereference a value. -So in our above example, the `Timer` component would **not** react if it was initialized as follows: - -```javascript -React.render(, document.body) -``` - -In this snippet just the current value of `secondsPassed` is passed to the `Timer`, which is the immutable value `0` (all primitives are immutable in JS). -That number won't change anymore in the future, so `Timer` will never update. It is the property `secondsPassed` that will change in the future, -so we need to access it _inside_ the component. One could also say: values need to be passed _by reference_ and not by value. - -If the problem is not entirely clear, make sure to study [what does MobX react to?](best/react.md) first! - -#### Advanced interaction patterns with reactions, observables, props, etc - -In general we recommend to keep UI state and domain state clearly separated, -and manage side effects etc either outside the components using the tools that MobX provides for them (`when`, `flow`, `reaction` etc), -or, if side effects operate on local component state, use the React primitives like `useEffect`. -Generally it is the clearest to keep those things separated, however, in case you need to cross the boundaries, -you might want to check [mobx-react.js.org](https://mobx-react.js.org/) for pattern on how to connect the two frameworks in more complicated scenario's. - -## Troubleshooting - -1. Make sure you didn't forget `observer` (yes, this is the most common mistake) -2. Make sure you grok how tracking works in general: [what will MobX react to](best/react.md) -3. Read the [common mistakes](best/pitfalls.md) section -4. Use [trace](best/trace.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](refguide/spy.md) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. diff --git a/notes-docs.md b/notes-docs.md index 7fb2ac79b..31601b2fb 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -2,8 +2,13 @@ Philosophy: one thing to do things Questions: +- "The props object and the state object of an observer component are automatically + made observable to make it easier to create @computed properties that derive from props inside such a component." - Does the props bit still apply to function + component. Though computed doesn't apply anyhow, unless `useLocalStore` is in + use. + - What to do about the egghead lessons? They have a reference the decorator - syntax. + syntax. -> consolidate into a single page and explain the decorator story on it. - The README is rather long. Credits, testimonials, and sponsors in multiple places. @@ -16,40 +21,27 @@ Questions: - Is there a way to regenerate assets? flow.png for instance uses decorators and needs to be updated. -- Any code sandbox links need to be updated. jsfiddle as well. - -- If 'observable' (and 'computed' and 'action') get another meaning, - does this mean that code that uses the old semantics has to import - these from mobx-decorators? - -- Need to re-establish various links to the getting started sections in the - README.html. - -- The example for React components in README.md won't work with the new strict default. - We need to either turn it off explicitly or introduce an action right away. I think - we should offer an action right away. - - When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. -- Codemods. The jscodeshift command uses `yarn`. What's the `npm` equivalent (as we use npm elsewhere in examples)? Does `mobx/codemod/undecorate.ts` work? Should we specify -extensions=js,js,ts,tsx as well to include typescript? - -- There are a lot of references to external documentation resources. They can probably use - a pruning. +Todo -- In many examples, such as 'Concepts and Principles' and 'Getting Started' 'observable' is used to make a JS object observable. Should we rewrite that to 'makeObservable'? I've opted to do so to be more consistent in examples and to better fit the strict actions are required world of MobX 6. We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? +- [ ] Netlify preview for docs PR. +- [ ] Any code sandbox links need to be updated. jsfiddle as well. +- [ ] Codemod might change to a new package to reduce size. Documentation needs to be updated. +- [ ] There are a lot of references to external documentation resources. They can probably use a pruning. +- [ ] We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? +- [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? +- [ ] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. -- What to do with the 'Getting started tutorial'? It's maintained separately from - the documentation - should we attempt to integrate it? The problem with - that it is has live code. Docusaurus can run React snippets but the HTML - page has very fancy animations. Update it as is? +Fragments -- A document like 'overview.md' makes much of the fact that you can modify - state in any way you like, but that won't work anymore if 'observable' - is the default. So I've rewritten it with that in mind. +This fragment is from react-integration. I want to see about creating +a new section on advanced interaction patterns. -- The https://github.com/mobxjs/mobx-react-boilerplate project needs updating. +#### Advanced interaction patterns with reactions, observables, props, etc -Todo - -- [ ] Netlify preview for docs PR. +In general we recommend to keep UI state and domain state clearly separated, +and manage side effects etc either outside the components using the tools that MobX provides for them (`when`, `flow`, `reaction` etc), +or, if side effects operate on local component state, use the React primitives like [`useEffect`](https://reactjs.org/docs/hooks-effect.html). +Generally it is the clearest to keep those things separated, however, in case you need to cross the boundaries, you might want to check [mobx-react.js.org](https://mobx-react.js.org/) for pattern on how to connect the two frameworks in more complicated scenario's. diff --git a/website/i18n/en.json b/website/i18n/en.json index ff223fcd5..affba1851 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -64,6 +64,14 @@ "LINKS": { "title": "LINKS" }, + "react/react-class-components": { + "title": "React class components", + "sidebar_label": "React based components" + }, + "react/react-integration": { + "title": "React integration", + "sidebar_label": "React integration" + }, "README": { "title": "Introduction", "sidebar_label": "Introduction" @@ -113,7 +121,8 @@ "sidebar_label": "Provider / inject" }, "refguide/make-auto-observable": { - "title": "refguide/make-auto-observable" + "title": "refguide/make-auto-observable", + "sidebar_label": "makeAutoObservable" }, "refguide/map": { "title": "Observable Maps", @@ -147,10 +156,6 @@ "title": "Intercept & Observe", "sidebar_label": "intercept & observe" }, - "refguide/observer-component": { - "title": "(@)observer components", - "sidebar_label": "(@)observer components" - }, "refguide/reaction": { "title": "reaction", "sidebar_label": "reaction" @@ -174,6 +179,7 @@ }, "categories": { "Basics": "Basics", + "MobX and React": "MobX and React", "Making things observable": "Making things observable", "Reacting to observables": "Reacting to observables", "Updating observables": "Updating observables", diff --git a/website/sidebars.json b/website/sidebars.json index 68b85f520..50cd3563d 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -6,6 +6,10 @@ "intro/overview", "intro/concepts" ], + "MobX and React": [ + "react/react-integration", + "react/react-class-components" + ], "Making things observable": [ "refguide/observable", "refguide/observable-decorator", @@ -14,7 +18,6 @@ "refguide/map" ], "Reacting to observables": [ - "refguide/observer-component", "refguide/computed-decorator", "refguide/autorun", "refguide/when", From d4e2afb7a9ead18e9f7d4eedfceeccc5971a6d04 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 16:27:55 +0200 Subject: [PATCH 0360/1043] Update the react performance document. Make the reader aware that performance will likely be okay even without applying these patterns. Use function components throughout. Clean up some overly complicated explanation on function props. Get rid of an optimization that makes no sense for function components. --- docs/best/react-performance.md | 157 --------------------------- docs/react/react-class-components.md | 4 +- docs/react/react-integration.md | 2 +- docs/react/react-performance.md | 120 ++++++++++++++++++++ website/i18n/en.json | 10 +- website/sidebars.json | 2 +- 6 files changed, 129 insertions(+), 166 deletions(-) delete mode 100644 docs/best/react-performance.md create mode 100644 docs/react/react-performance.md diff --git a/docs/best/react-performance.md b/docs/best/react-performance.md deleted file mode 100644 index dcba4a31f..000000000 --- a/docs/best/react-performance.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -sidebar_label: Optimizing React components -title: Optimizing rendering React components -hide_title: true ---- - -# Optimizing rendering React components - -
    - -MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). But here are some tips to get most out of React and MobX. Note that most tips apply to React in general and are not specific for MobX. - -## Use many small components - -`@observer` components will track all values they use and re-render if any of them changes. -So the smaller your components are, the smaller the change they have to re-render; it means that more parts of your user interface have the possibility to render independently of each other. - -## Render lists in dedicated components - -This is especially true when rendering big collections. -React is notoriously bad at rendering large collections as the reconciler has to evaluate the components produced by a collection on each collection change. -It is therefore recommended to have components that just map over a collection and render it, and render nothing else: - -Bad: - -```javascript -@observer -class MyComponent extends Component { - render() { - const { todos, user } = this.props - return ( -
    - {user.name} -
      - {todos.map(todo => ( - - ))} -
    -
    - ) - } -} -``` - -In the above listing React will unnecessarily need to reconcile all TodoView components when the `user.name` changes. They won't re-render, but the reconcile process is expensive in itself. - -Good: - -```javascript -@observer class MyComponent extends Component { - render() { - const {todos, user} = this.props; - return (
    - {user.name} - -
    ) - } -} - -@observer class TodosView extends Component { - render() { - const {todos} = this.props; - return
      - {todos.map(todo => )} -
    ) - } -} -``` - -## Don't use array indexes as keys - -Don't use array indexes or any value that might change in the future as key. Generate ids for your objects if needed. -See also this [blog](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318). - -## Dereference values late - -When using `mobx-react` it is recommended to dereference values as late as possible. -This is because MobX will re-render components that dereference observable values automatically. -If this happens deeper in your component tree, less components have to re-render. - -Fast: - -`` - -Slower: - -``. - -There is nothing wrong to the latter, but a change in the `name` property will, in the first case, trigger only the `DisplayName` to re-render, while in the latter, the owner of the component has to re-render. If rendering the owning component is fast enough, that approach will work well. - -You may notice that in order to gain the best possible performance, you'd have to create lots of small observer components where each would be customized to render some different part of data, for example: - -`const PersonNameDisplayer = observer((props) => )` - -`const CarNameDisplayer = observer((props) => )` - -`const ManufacturerNameDisplayer = observer((props) => )` - -This is a valid option, but may become tedious if you have lots of data of different shape. An alternative is using a function that returns the data that you want your `*Displayer` to render: - -`const GenericNameDisplayer = observer((props) => )` - -Then, you may use the component like this: - -```javascript -render() { - const { person, car } = this.props; - return ( - <> - person.name} /> - - - - ); -} - -getManufacturerNameTracked = () => this.props.car.manufacturer.name; - -... -class Car { - @observable model - getModelTracked = () => this.model -} -``` - -This approach will allow `GenericNameDisplayer` to be reused throughout your application to render any name. Now, what remains to be solved is the placement of those functions: the sample shows three possibilities - you may create the function directly in the render method (which is not considered a good practice), you may place the function in the component (as with `getManufacturerNameTracked`), or you may place the function directly on the object that contains the data (as with `getModelTracked`). - -## Bind functions early - -This tip applies to React in general and libraries using `PureRenderMixin` especially, try to avoid creating new closures in render methods. - -See also these resources: - -- [Autobinding with property initializers](https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding) -- [ESLint rule for no-bind](https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md) - -Bad: - -```javascript -render() { - return { alert('hi') }} /> -} -``` - -Good: - -```javascript -render() { - return -} - -handleClick = () => { - alert('hi') -} -``` - -The bad example will always yield the `shouldComponent` of `PureRenderMixin` used in `MyWidget` to always yield false as you pass a new function each time the parent is re-rendered. diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index b2d25b095..d2a1988c4 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -1,12 +1,12 @@ --- title: React class components -sidebar_label: React based components +sidebar_label: React class components hide_title: true --- # React class components -[react-integration](React integration) discusses the basic patterns for +[React integration](react-integration.md) discusses the basic patterns for using MobX with React function components. But MobX also works with React class components. ## Using `observer` with a class component diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index bb68ed903..0183ec8ff 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -178,7 +178,7 @@ const TimerView = ({ timer }) => ( #### How can I further optimize my React components? -See the relevant [React performance section](../best/react-performance.md). +See the relevant [React performance section](react-performance.md). #### When combining `observer` with other higher-order-components, apply `observer` first diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md new file mode 100644 index 000000000..34ed138df --- /dev/null +++ b/docs/react/react-performance.md @@ -0,0 +1,120 @@ +--- +sidebar_label: Optimizing React components +title: Optimizing rendering React components +hide_title: true +--- + +# Optimizing rendering React components + +MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). But here are some tips to get most out of React and MobX. Most tips apply to React in general and are not specific for MobX. + +Note that while it's good to be aware of these patterns, usually your application +will be fast enough if you don't worry about them at all. Prioritize performance only +when it's an actual issue! + +## Use many small components + +`observer` components will track all values they use and re-render if any of them changes. +So the smaller your components are, the smaller the change they have to re-render; it means that more parts of your user interface have the possibility to render independently of each other. + +## Render lists in dedicated components + +This is especially true when rendering big collections. +React is notoriously bad at rendering large collections as the reconciler has to evaluate the components produced by a collection on each collection change. +It is therefore recommended to have components that just map over a collection and render it, and render nothing else: + +Bad: + +```javascript +const MyComponent = observer(({ todos, user }) => ( +
    + {user.name} +
      + {todos.map(todo => ( + + ))} +
    +
    +)) +``` + +In the above listing React will unnecessarily need to reconcile all `TodoView` components when the `user.name` changes. They won't re-render, but the reconcile process is expensive in itself. + +Good: + +```javascript +const MyComponent = observer(({ todos, user }) => ( +
    + {user.name} + +
    +)) + +const TodosView = observer(({ todos }) => ( +
      + {todos.map(todo => ( + + ))} +
    +)) +``` + +## Don't use array indexes as keys + +Don't use array indexes or any value that might change in the future as key. Generate ids for your objects if needed. +See also this [blog](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318). + +## Dereference values late + +When using `mobx-react` it is recommended to dereference values as late as possible. +This is because MobX will re-render components that dereference observable values automatically. +If this happens deeper in your component tree, less components have to re-render. + +Fast: + +```javascript + +``` + +Slower: + +```javascript + +``` + +There is nothing wrong with the latter, but a change in the `name` property will, in the first case, trigger only the `DisplayName` to re-render, while in the latter, the owner of the component has to re-render. If rendering the owning component is fast enough (usually it will be!), that approach will work well. + +### Function props + +You may notice that to deference values late you have to create lots of small observer components where eachis customized to render some different part of data, for example: + +```javascript +const PersonNameDisplayer = observer(({ person }) => ) + +const CarNameDisplayer = observer(({ car }) => ) + +const ManufacturerNameDisplayer = observer({ car}) => ( + +)) +``` + +This quickly becomes tedious if you have lots of data of different shape. An alternative is to use a function that returns the data that you want your `*Displayer` to render: + +```javascript +const GenericNameDisplayer = observer(({ getName }) => ) +``` + +Then, you can use the component like this: + +```javascript +const MyComponent = observer(({ person, car }) => ( + <> + person.name} /> + car.model} /> + car.manufacturer.name} /> + +)) +``` + +This approach will allow `GenericNameDisplayer` to be reused throughout your application to render any name, and you still keep component re-rendering +to a minimum. diff --git a/website/i18n/en.json b/website/i18n/en.json index affba1851..aa5efab07 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -25,10 +25,6 @@ "title": "Common pitfalls & best practices", "sidebar_label": "Common Pitfalls & Best Practices" }, - "best/react-performance": { - "title": "Optimizing rendering React components", - "sidebar_label": "Optimizing React components" - }, "best/react": { "title": "What does MobX react to?", "sidebar_label": "Understanding what MobX reacts to" @@ -66,12 +62,16 @@ }, "react/react-class-components": { "title": "React class components", - "sidebar_label": "React based components" + "sidebar_label": "React class components" }, "react/react-integration": { "title": "React integration", "sidebar_label": "React integration" }, + "react/react-performance": { + "title": "Optimizing rendering React components", + "sidebar_label": "Optimizing React components" + }, "README": { "title": "Introduction", "sidebar_label": "Introduction" diff --git a/website/sidebars.json b/website/sidebars.json index 50cd3563d..341c00232 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -8,6 +8,7 @@ ], "MobX and React": [ "react/react-integration", + "react/react-performance", "react/react-class-components" ], "Making things observable": [ @@ -49,7 +50,6 @@ "best/decorators", "best/trace", "best/store", - "best/react-performance", "refguide/spy" ] } From 77b93815a723b93095556826dad18edc10c44f03 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 16:35:28 +0200 Subject: [PATCH 0361/1043] Update a few outdated links. --- docs/intro/concepts.md | 2 +- docs/refguide/api.md | 6 +++--- docs/refguide/autorun.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index f3196e1d8..a742f80f9 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -112,7 +112,7 @@ In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_pro ##### React components -If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function from the `mobx-react` package. +If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/react/react-integration.html) function from the `mobx-react` package. ```javascript import React from "react" diff --git a/docs/refguide/api.md b/docs/refguide/api.md index f79c0704a..e5b0ae61a 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -324,7 +324,7 @@ async function* someNumbers() { yield Promise.resolve(3) } -const count = mobx.flow(async function*() { +const count = mobx.flow(async function* () { // use for await to loop async iterators for await (const number of someNumbers()) { total += number @@ -348,7 +348,7 @@ Can be used as higher order component around a React component. The component will then automatically re-render if any of the observables used in the `render` function of the component has changed. Note that `observer` is provided by the `"mobx-react"` package and not by `"mobx"` itself. -[«details»](observer-component.md) +[«details»](../react/reactintegration.md) Usage: @@ -522,7 +522,7 @@ export class City { clearInterval(this.interval) } - fetchTemperature = flow(function*() { + fetchTemperature = flow(function* () { // data fetching logic }) } diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 875e9b890..a1b29f831 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -42,7 +42,7 @@ autorun(reaction => { }) ``` -Just like the [`@observer` decorator/function](./observer-component.md), `autorun` will only observe data that is used during the execution of the provided function. +Just like the [`@observer` decorator/function](../react/react-integration.md), `autorun` will only observe data that is used during the execution of the provided function. ```javascript var numbers = observable([1, 2, 3]) From e5e6459ac42d5d2c309fa6b63d1087c3d7f30e33 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 16:35:37 +0200 Subject: [PATCH 0362/1043] todo item. --- notes-docs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/notes-docs.md b/notes-docs.md index 31601b2fb..26b4ba589 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -33,6 +33,7 @@ Todo - [ ] We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? - [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? - [ ] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. +- [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. Fragments From 2239019b753952bb4153b2dc0caa8d68d1fbcb7d Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 19:26:36 +0200 Subject: [PATCH 0363/1043] Remove this. It's out of date anyway, but to test netlify. --- docs/refguide/action.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index e9557b65e..6617e6226 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -6,8 +6,6 @@ hide_title: true # action -
    -
    egghead.io lesson 5: actions
    From 2634a02d83fc99271e9a65a6ce2f50ae4761e14d Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 19:27:55 +0200 Subject: [PATCH 0364/1043] Another todo item. --- notes-docs.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index 26b4ba589..27e293200 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -10,9 +10,6 @@ Questions: - What to do about the egghead lessons? They have a reference the decorator syntax. -> consolidate into a single page and explain the decorator story on it. -- The README is rather long. Credits, testimonials, and sponsors in multiple - places. - - How to name "compatible property tracking" as opposed to proxy-based? How does one configure it, or it is an automatic fallback? @@ -34,6 +31,7 @@ Todo - [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? - [ ] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. +- [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar Fragments From 359fd9fb6d85b5c1bfdd5c911ec28d38701ef075 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 29 Jun 2020 21:56:50 +0100 Subject: [PATCH 0365/1043] Some build fixes --- notes.md | 5 +++-- src/api/observable.ts | 7 +++---- src/core/action.ts | 1 - src/mobx.ts | 1 - test/perf/perf.js | 1 - 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/notes.md b/notes.md index 0685cf5bd..c1661929b 100644 --- a/notes.md +++ b/notes.md @@ -23,6 +23,7 @@ - [ ] migrate `@observer` calls - [ ] unit tests for `ignoreImports` - [ ] unit tests for `keepDecorators` + - [ ] put in separate package - [ ] ES5 support - [x] combine with ES5? - [x] backport tests and code to v4(6) @@ -43,14 +44,14 @@ - [x] verify: action called from computed throws? - [ ] apply deprecation of find and findIndex error - [ ] verify perf / memory changes - - [ ] investigate skipped tests + - [x] investigate skipped tests - [ ] process TODO's - [ ] weakmap for hasMaps in Map (and Set?) - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - [ ] include #2343 - [ ] default observable requires reaction? - - [ ] kill globalstate options? + - [x] kill globalstate options? - [ ] no auto lifting? https://twitter.com/getify/status/1258137826241241088 - [ ] flow types - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. diff --git a/src/api/observable.ts b/src/api/observable.ts index 1f6f0be58..c0c44fae1 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -4,7 +4,6 @@ import { IObservableArray, IObservableMapInitialValues, IObservableSetInitialValues, - IObservableObject, IObservableValue, ObservableMap, ObservableSet, @@ -129,7 +128,7 @@ export interface IObservableFactory extends Annotation, PropertyDecorator { value: T, decorators?: AnnotationsMap, options?: CreateObservableOptions - ): T & IObservableObject + ): T box(value?: T, options?: CreateObservableOptions): IObservableValue array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray @@ -145,7 +144,7 @@ export interface IObservableFactory extends Annotation, PropertyDecorator { props: T, decorators?: AnnotationsMap, options?: CreateObservableOptions - ): T & IObservableObject + ): T /** * Decorator that creates an observable that only observes the references, but doesn't try to turn the assigned value into an observable.ts. @@ -188,7 +187,7 @@ const observableFactories: IObservableFactory = { props: T, decorators?: AnnotationsMap, options?: CreateObservableOptions - ): T & IObservableObject { + ): T { const o = asCreateObservableOptions(options) const base = {} asObservableObject(base, options?.name, getEnhancerFromOption(o)) diff --git a/src/core/action.ts b/src/core/action.ts index 36cf65e53..0aba0607e 100644 --- a/src/core/action.ts +++ b/src/core/action.ts @@ -16,7 +16,6 @@ import { die, getDescriptor } from "../internal" -import { addHiddenProp } from "../utils/utils" // we don't use globalState for these in order to avoid possible issues with multiple // mobx versions diff --git a/src/mobx.ts b/src/mobx.ts index 217d31948..3d48c2def 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -43,7 +43,6 @@ export { IListenable, IObjectWillChange, IObjectDidChange, - IObservableObject, isObservableObject, IValueDidChange, IValueWillChange, diff --git a/test/perf/perf.js b/test/perf/perf.js index b92a7eaac..a531272ed 100644 --- a/test/perf/perf.js +++ b/test/perf/perf.js @@ -184,7 +184,6 @@ results of this test: return a.get() * b.get() * c.get() }) t.equal(d.get(), 126) - t.equal(d.dependenciesState, -1) const start = now() for (let i = 0; i < 10000; i++) { c.set(i) From 4eee3da31b89115fdbd1698bc8262b281ef9ca9b Mon Sep 17 00:00:00 2001 From: Daniel K Date: Tue, 30 Jun 2020 20:59:10 +0200 Subject: [PATCH 0366/1043] Run prettier --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CHANGELOG.md | 10 +- codemod/undecorate.ts | 2 +- docs/best/actions.md | 2 +- docs/intro/concepts.md | 2 +- docs/refguide/api.md | 4 +- docs/refguide/boxed.md | 2 +- docs/refguide/extend-observable.md | 2 +- package.json | 2 +- src/api/autorun.ts | 4 +- src/api/become-observed.ts | 2 +- src/api/computed.ts | 2 +- src/api/decorators.ts | 4 +- src/api/flow.ts | 6 +- src/api/makeObservable.ts | 5 +- src/core/globalstate.ts | 2 +- src/core/spy.ts | 2 +- src/types/legacyobservablearray.ts | 4 +- src/types/observablearray.ts | 6 +- src/utils/utils.ts | 4 +- test/perf/index.js | 4 +- test/perf/perf.js | 70 ++++---- test/v4/base/array.js | 48 ++--- test/v4/base/autorun.js | 12 +- test/v4/base/cycles.js | 38 ++-- test/v4/base/extendObservable.js | 14 +- test/v4/base/extras.js | 20 +-- test/v4/base/makereactive.js | 80 ++++----- test/v4/base/observables.js | 238 ++++++++++++------------- test/v4/base/observe.ts | 2 +- test/v4/base/tojs.js | 22 +-- test/v5/base/action.js | 12 +- test/v5/base/api.js | 2 +- test/v5/base/array.js | 50 +++--- test/v5/base/autorun.js | 12 +- test/v5/base/autorunAsync.js | 54 +++--- test/v5/base/babel-decorators.js | 18 +- test/v5/base/babel-tests.js | 22 +-- test/v5/base/cycles.js | 38 ++-- test/v5/base/decorate.js | 22 +-- test/v5/base/errorhandling.js | 76 ++++---- test/v5/base/extendObservable.js | 14 +- test/v5/base/extras.js | 26 +-- test/v5/base/flow.js | 30 ++-- test/v5/base/makereactive.js | 82 ++++----- test/v5/base/map.js | 64 +++---- test/v5/base/observables.js | 246 +++++++++++++------------- test/v5/base/set.js | 20 +-- test/v5/base/strict-mode.js | 40 ++--- test/v5/base/tojs.js | 24 +-- test/v5/base/trace.ts | 2 +- test/v5/base/typescript-decorators.ts | 6 +- test/v5/base/typescript-tests.ts | 14 +- test/v5/utils/test-utils.js | 4 +- 54 files changed, 748 insertions(+), 747 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 092c7edf3..245e73ab5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,7 +4,7 @@ 🚨🚨🚨 IMPORTANT NOTICE 🚨🚨🚨 Next major of MobX V6 is under development. Try to direct all changes toward `mobx6` branch instead of `master`. - + 🚨🚨🚨 IMPORTANT NOTICE 🚨🚨🚨 👋 Are you making a change to documentation only? Delete the rest of the template and go ahead. diff --git a/CHANGELOG.md b/CHANGELOG.md index de1f5ca84..1bbc552d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -901,7 +901,7 @@ A deprecation message will now be printed if creating computed properties while ```javascript const x = observable({ - computedProp: function() { + computedProp: function () { return someComputation } }) @@ -926,7 +926,7 @@ or alternatively: ```javascript observable({ - computedProp: computed(function() { + computedProp: computed(function () { return someComputation }) }) @@ -944,7 +944,7 @@ N.B. If you want to introduce actions on an observable that modify its state, us ```javascript observable({ counter: 0, - increment: action(function() { + increment: action(function () { this.counter++ }) }) @@ -1070,10 +1070,10 @@ function Square() { extendObservable(this, { length: 2, squared: computed( - function() { + function () { return this.squared * this.squared }, - function(surfaceSize) { + function (surfaceSize) { this.length = Math.sqrt(surfaceSize) } ) diff --git a/codemod/undecorate.ts b/codemod/undecorate.ts index 9d55d07c5..46eb5ec39 100644 --- a/codemod/undecorate.ts +++ b/codemod/undecorate.ts @@ -200,7 +200,7 @@ export default function tranform( } function handleProperty( - property: ClassProperty /* | or ClassMethod */ & { decorators: Decorator[] }, + property: ClassProperty & /* | or ClassMethod */ { decorators: Decorator[] }, effects: { membersMap: [[any, any, boolean]] }, diff --git a/docs/best/actions.md b/docs/best/actions.md index e49e6dc74..a3a3ad2c2 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -191,7 +191,7 @@ class Store { @observable githubProjects = [] @observable state = "pending" - fetchProjects = flow(function*() { + fetchProjects = flow(function* () { // <- note the star, this a generator function! this.githubProjects = [] this.state = "pending" diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index ca2768d08..37f0f98bf 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -78,7 +78,7 @@ var todoStore = observable({ }) /* a function that observes the state */ -autorun(function() { +autorun(function () { console.log("Completed %d of %d items", todoStore.completedCount, todoStore.todos.length) }) diff --git a/docs/refguide/api.md b/docs/refguide/api.md index f79c0704a..00b70d0f4 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -324,7 +324,7 @@ async function* someNumbers() { yield Promise.resolve(3) } -const count = mobx.flow(async function*() { +const count = mobx.flow(async function* () { // use for await to loop async iterators for await (const number of someNumbers()) { total += number @@ -522,7 +522,7 @@ export class City { clearInterval(this.interval) } - fetchTemperature = flow(function*() { + fetchTemperature = flow(function* () { // data fetching logic }) } diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index 4f7131fb8..78e4e62b0 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -43,7 +43,7 @@ const cityName = observable.box("Vienna") console.log(cityName.get()) // prints 'Vienna' -cityName.observe(function(change) { +cityName.observe(function (change) { console.log(change.oldValue, "->", change.newValue) }) diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 476508e7a..05e52c305 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -18,7 +18,7 @@ The `decorators` param can be used to override the decorator that will be used f Use the `deep: false` option to make the new properties _shallow_. That is, prevent auto conversion of their _values_ to observables. ```javascript -var Person = function(firstName, lastName) { +var Person = function (firstName, lastName) { // initialize observable properties on a new instance extendObservable( this, diff --git a/package.json b/package.json index f8f69c5c5..94ad0789d 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "test:performance": "PERSIST=true time node --expose-gc test/perf/index.js", "test:size": "yarn build && yarn import-size --report . observable computed autorun action", "test:codemod": "jest --testRegex 'codemod/.*spec' codemod/undecorate.spec.ts", - "prettier": "prettier --write '**/*.{js,ts,md}'", + "prettier": "prettier --write **/*.{js,ts,md}", "prebuild": "rimraf lib", "build": "tsdx build --name mobx --format esm,cjs,umd", "postbuild": "cp flow-typed/mobx.js dist/index.js.flow", diff --git a/src/api/autorun.ts b/src/api/autorun.ts index 665f5299f..a79b6bb53 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -50,7 +50,7 @@ export function autorun( // normal autorun reaction = new Reaction( name, - function(this: Reaction) { + function (this: Reaction) { this.track(reactionRunner) }, opts.onError, @@ -159,7 +159,7 @@ export function reaction( } function wrapErrorHandler(errorHandler, baseFn) { - return function() { + return function () { try { return baseFn.apply(this, arguments) } catch (e) { diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index 0a77a063c..ced0ad980 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -60,7 +60,7 @@ function interceptHook(hook: "onBO" | "onBUO", thing, arg2, arg3) { atom[listenersKey] = new Set([cb]) } - return function() { + return function () { const hookListeners = atom[listenersKey] if (hookListeners) { hookListeners.delete(cb) diff --git a/src/api/computed.ts b/src/api/computed.ts index f86f44d6a..1ab98fceb 100644 --- a/src/api/computed.ts +++ b/src/api/computed.ts @@ -54,7 +54,7 @@ export const computed: IComputedFactory = function computed(arg1, arg2, arg3) { computed.annotationType_ = COMPUTED computed.struct = assign( - function(target, property) { + function (target, property) { storeDecorator(target, property, COMPUTED_STRUCT) }, { diff --git a/src/api/decorators.ts b/src/api/decorators.ts index 8deb0c424..198c97c61 100644 --- a/src/api/decorators.ts +++ b/src/api/decorators.ts @@ -15,7 +15,7 @@ export function createDecorator( type: Annotation["annotationType_"] ): Annotation & PropertyDecorator & ((arg: ArgType) => PropertyDecorator & Annotation) { return assign( - function(target: any, property?: PropertyKey): any { + function (target: any, property?: PropertyKey): any { if (property === undefined) { // @decorator(arg) member createDecoratorAndAnnotation(type, target) @@ -35,7 +35,7 @@ export function createDecoratorAndAnnotation( arg_?: any ): PropertyDecorator & Annotation { return assign( - function(target, property) { + function (target, property) { storeDecorator(target, property, type, arg_) }, { diff --git a/src/api/flow.ts b/src/api/flow.ts index d742da8d4..4f930877f 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -21,7 +21,7 @@ export function flow( const name = generator.name || "" // Implementation based on https://github.com/tj/co/blob/master/index.js - return function() { + return function () { const ctx = this const args = arguments const runId = ++generatorId @@ -32,7 +32,7 @@ export function flow( let rejector: (error: any) => void let pendingPromise: CancellablePromise | undefined = undefined - const promise = new Promise(function(resolve, reject) { + const promise = new Promise(function (resolve, reject) { let stepId = 0 rejector = reject @@ -79,7 +79,7 @@ export function flow( onFulfilled(undefined) // kick off the process }) as any - promise.cancel = action(`${name} - runid: ${runId} - cancel`, function() { + promise.cancel = action(`${name} - runid: ${runId} - cancel`, function () { try { if (pendingPromise) cancelPromise(pendingPromise) // Finally block can return (or yield) stuff.. diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index c008c6d87..92962eab7 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -148,8 +148,9 @@ export function makeProperty( default: if (__DEV__) die( - `invalid decorator '${annotation.annotationType_ ?? - annotation}' for '${key.toString()}'` + `invalid decorator '${ + annotation.annotationType_ ?? annotation + }' for '${key.toString()}'` ) } } diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 2a0125c22..0194b4138 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -143,7 +143,7 @@ let isolateCalled = false declare const global: any -export let globalState: MobXGlobals = (function() { +export let globalState: MobXGlobals = (function () { if (global.__mobxInstanceCount > 0 && !global.__mobxGlobals) canMergeGlobalState = false if (global.__mobxGlobals && global.__mobxGlobals.version !== new MobXGlobals().version) canMergeGlobalState = false diff --git a/src/core/spy.ts b/src/core/spy.ts index 0a3f5b816..6e59d429d 100644 --- a/src/core/spy.ts +++ b/src/core/spy.ts @@ -28,7 +28,7 @@ export function spyReportEnd(change?) { export function spy(listener: (change: any) => void): Lambda { if (!__DEV__) { console.warn(`[mobx.spy] Is a no-op in production builds`) - return function() {} + return function () {} } else { globalState.spyListeners.push(listener) return once(() => { diff --git a/src/types/legacyobservablearray.ts b/src/types/legacyobservablearray.ts index 0e0e3700c..a5c6a952d 100644 --- a/src/types/legacyobservablearray.ts +++ b/src/types/legacyobservablearray.ts @@ -102,10 +102,10 @@ function createArrayEntryDescriptor(index: number) { return { enumerable: false, configurable: true, - get: function() { + get: function () { return this[$mobx].get_(index) }, - set: function(value) { + set: function (value) { this[$mobx].set_(index, value) } } diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index d30582aa3..c6d736010 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -482,7 +482,7 @@ function addArrayExtension(funcName, funcFactory) { // Report and delegate to dehanced array function simpleFunc(funcName) { - return function() { + return function () { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() const res = adm.dehanceValues_(adm.values_) @@ -492,7 +492,7 @@ function simpleFunc(funcName) { // Make sure callbacks recieve correct array arg #2326 function mapLikeFunc(funcName) { - return function(callback, thisArg) { + return function (callback, thisArg) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() return adm.values_[funcName]((element, index) => { @@ -504,7 +504,7 @@ function mapLikeFunc(funcName) { // Make sure callbacks recieve correct array arg #2326 function reduceLikeFunc(funcName) { - return function(callback, initialValue) { + return function (callback, initialValue) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() return adm.values_[funcName]((accumulator, currentValue, index) => { diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 83ccd5bc3..5436bc25e 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -47,7 +47,7 @@ export function getNextId() { */ export function once(func: Lambda): Lambda { let invoked = false - return function() { + return function () { if (invoked) return invoked = true return (func as any).apply(this, arguments) @@ -123,7 +123,7 @@ export function createInstanceofPredicate( ): (x: any) => x is T { const propName = "isMobX" + name clazz.prototype[propName] = true - return function(x) { + return function (x) { return isObject(x) && x[propName] === true } as any } diff --git a/test/perf/index.js b/test/perf/index.js index b37ec75d9..821563a6f 100644 --- a/test/perf/index.js +++ b/test/perf/index.js @@ -11,12 +11,12 @@ if (process.env.PERSIST) { // clear previous results if (fs.existsSync(logFile)) fs.unlinkSync(logFile) - exports.logMeasurement = function(msg) { + exports.logMeasurement = function (msg) { console.log(msg) fs.appendFileSync(logFile, "\n" + msg, "utf8") } } else { - exports.logMeasurement = function(msg) { + exports.logMeasurement = function (msg) { console.log(msg) } } diff --git a/test/perf/perf.js b/test/perf/perf.js index a531272ed..dd24f8a31 100644 --- a/test/perf/perf.js +++ b/test/perf/perf.js @@ -25,16 +25,16 @@ results of this test: const observable = mobx.observable const computed = mobx.computed - test(`${version} - one observes ten thousand that observe one`, function(t) { + test(`${version} - one observes ten thousand that observe one`, function (t) { gc() const a = observable.box(2) // many observers that listen to one.. const observers = [] for (let i = 0; i < 10000; i++) { - ;(function(idx) { + ;(function (idx) { observers.push( - computed(function() { + computed(function () { return a.get() * idx }) ) @@ -43,7 +43,7 @@ results of this test: // let bCalcs = 0 // one observers that listens to many.. - const b = computed(function() { + const b = computed(function () { let res = 0 for (let i = 0; i < observers.length; i++) res += observers[i].get() // bCalcs += 1 @@ -71,13 +71,13 @@ results of this test: t.end() }) - test(`${version} - five hundrend properties that observe their sibling`, function(t) { + test(`${version} - five hundrend properties that observe their sibling`, function (t) { gc() const observables = [observable.box(1)] for (let i = 0; i < 500; i++) { - ;(function(idx) { + ;(function (idx) { observables.push( - computed(function() { + computed(function () { return observables[idx].get() + 1 }) ) @@ -105,12 +105,12 @@ results of this test: t.end() }) - test(`${version} - late dependency change`, function(t) { + test(`${version} - late dependency change`, function (t) { gc() const values = [] for (let i = 0; i < 100; i++) values.push(observable.box(0)) - const sum = computed(function() { + const sum = computed(function () { let sum = 0 for (let i = 0; i < 100; i++) sum += values[i].get() return sum @@ -127,16 +127,16 @@ results of this test: t.end() }) - test(`${version} - lots of unused computables`, function(t) { + test(`${version} - lots of unused computables`, function (t) { gc() const a = observable.box(1) // many observers that listen to one.. const observers = [] for (let i = 0; i < 10000; i++) { - ;(function(idx) { + ;(function (idx) { observers.push( - computed(function() { + computed(function () { return a.get() * idx }) ) @@ -144,7 +144,7 @@ results of this test: } // one observers that listens to many.. - const b = computed(function() { + const b = computed(function () { let res = 0 for (let i = 0; i < observers.length; i++) res += observers[i].get() return res @@ -153,7 +153,7 @@ results of this test: let sum = 0 const subscription = mobx.observe( b, - function(e) { + function (e) { sum = e.newValue }, true @@ -175,12 +175,12 @@ results of this test: t.end() }) - test(`${version} - many unreferenced observables`, function(t) { + test(`${version} - many unreferenced observables`, function (t) { gc() const a = observable.box(3) const b = observable.box(6) const c = observable.box(7) - const d = computed(function() { + const d = computed(function () { return a.get() * b.get() * c.get() }) t.equal(d.get(), 126) @@ -196,15 +196,15 @@ results of this test: t.end() }) - test(`${version} - array reduce`, function(t) { + test(`${version} - array reduce`, function (t) { gc() let aCalc = 0 const ar = observable([]) const b = observable.box(1) - const sum = computed(function() { + const sum = computed(function () { aCalc++ - return ar.reduce(function(a, c) { + return ar.reduce(function (a, c) { return a + c * b.get() }, 0) }) @@ -238,12 +238,12 @@ results of this test: t.end() }) - test(`${version} - array classic loop`, function(t) { + test(`${version} - array classic loop`, function (t) { gc() const ar = observable([]) let aCalc = 0 const b = observable.box(1) - const sum = computed(function() { + const sum = computed(function () { let s = 0 aCalc++ for (let i = 0; i < ar.length; i++) s += ar[i] * b.get() @@ -282,7 +282,7 @@ results of this test: const orders = observable([]) const vat = observable.box(2) - const totalAmount = computed(function() { + const totalAmount = computed(function () { let sum = 0, l = orders.length for (let i = 0; i < l; i++) sum += orders[i].total.get() @@ -293,7 +293,7 @@ results of this test: this.price = observable.box(price) this.amount = observable.box(amount) this.total = computed( - function() { + function () { return order.vat.get() * this.price.get() * this.amount.get() }, { context: this } @@ -305,7 +305,7 @@ results of this test: this.lines = observable([]) this.vat = computed( - function() { + function () { if (this.includeVat.get()) return vat.get() return 1 }, @@ -313,8 +313,8 @@ results of this test: ) this.total = computed( - function() { - return this.lines.reduce(function(acc, order) { + function () { + return this.lines.reduce(function (acc, order) { return acc + order.total.get() }, 0) }, @@ -370,23 +370,23 @@ results of this test: t.end() } - test(`${version} - order system observed`, function(t) { + test(`${version} - order system observed`, function (t) { order_system_helper(t, false, true) }) - test(`${version} - order system batched observed`, function(t) { + test(`${version} - order system batched observed`, function (t) { order_system_helper(t, true, true) }) - test(`${version} - order system lazy`, function(t) { + test(`${version} - order system lazy`, function (t) { order_system_helper(t, false, false) }) - test(`${version} - order system batched lazy`, function(t) { + test(`${version} - order system batched lazy`, function (t) { order_system_helper(t, true, false) }) - test(`${version} - create array`, function(t) { + test(`${version} - create array`, function (t) { gc() const a = [] for (let i = 0; i < 1000; i++) a.push(i) @@ -396,7 +396,7 @@ results of this test: t.end() }) - test(`${version} - create array (fast)`, function(t) { + test(`${version} - create array (fast)`, function (t) { gc() const a = [] for (let i = 0; i < 1000; i++) a.push(i) @@ -517,7 +517,7 @@ results of this test: t.end() }) - test(`${version} - Map: initializing`, function(t) { + test(`${version} - Map: initializing`, function (t) { gc() const iterationsCount = 100000 let i @@ -531,7 +531,7 @@ results of this test: t.end() }) - test(`${version} - Map: looking up properties`, function(t) { + test(`${version} - Map: looking up properties`, function (t) { gc() const iterationsCount = 1000 const propertiesCount = 100 @@ -563,7 +563,7 @@ results of this test: t.end() }) - test(`${version} - Map: setting and deleting properties`, function(t) { + test(`${version} - Map: setting and deleting properties`, function (t) { gc() const iterationsCount = 1000 const propertiesCount = 100 diff --git a/test/v4/base/array.js b/test/v4/base/array.js index d9dd83829..0ae4bd5d3 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -4,7 +4,7 @@ const mobx = require("../mobx4") const { observable, _getAdministration, reaction, makeObservable } = mobx const iterall = require("iterall") -test("test1", function() { +test("test1", function () { const a = observable.array([]) expect(a.length).toBe(0) expect(Object.keys(a)).toEqual([]) @@ -18,10 +18,10 @@ test("test1", function() { expect(a.length).toBe(2) expect(a.slice()).toEqual([1, 2]) - const sum = mobx.computed(function() { + const sum = mobx.computed(function () { return ( -1 + - a.reduce(function(a, b) { + a.reduce(function (a, b) { return a + b }, 1) ) @@ -109,7 +109,7 @@ test("array should support iterall / iterable ", () => { expect(iter.next()).toEqual({ value: undefined, done: true }) }) -test("find(findIndex) and remove", function() { +test("find(findIndex) and remove", function () { const a = mobx.observable([10, 20, 20]) let idx = -1 function predicate(item, index) { @@ -146,12 +146,12 @@ test("concat should automatically slice observable arrays, #260", () => { expect(a1.concat(a2)).toEqual([1, 2, 3, 4]) }) -test("observe", function() { +test("observe", function () { const ar = mobx.observable([1, 4]) const buf = [] const disposer = mobx.observe( ar, - function(changes) { + function (changes) { buf.push(changes) }, true @@ -170,7 +170,7 @@ test("observe", function() { ar.pop() // does not fire anything // check the object param - buf.forEach(function(change) { + buf.forEach(function (change) { expect(change.object).toBe(ar) delete change.object }) @@ -207,14 +207,14 @@ test("observe", function() { expect(buf).toEqual(result) }) -test("array modification1", function() { +test("array modification1", function () { const a = mobx.observable([1, 2, 3]) const r = a.splice(-10, 5, 4, 5, 6) expect(a.slice()).toEqual([4, 5, 6]) expect(r).toEqual([1, 2, 3]) }) -test("serialize", function() { +test("serialize", function () { let a = [1, 2, 3] const m = mobx.observable(a) @@ -227,11 +227,11 @@ test("serialize", function() { expect(a).toEqual(m.toJSON()) }) -test("array modification functions", function() { +test("array modification functions", function () { const ars = [[], [1, 2, 3]] const funcs = ["push", "pop", "shift", "unshift"] - funcs.forEach(function(f) { - ars.forEach(function(ar) { + funcs.forEach(function (f) { + ars.forEach(function (ar) { const a = ar.slice() const b = mobx.observable(a) const res1 = a[f](4) @@ -242,7 +242,7 @@ test("array modification functions", function() { }) }) -test("array modifications", function() { +test("array modifications", function () { const a2 = mobx.observable([]) const inputs = [undefined, -10, -4, -3, -1, 0, 1, 3, 4, 10] const arrays = [ @@ -278,7 +278,7 @@ test("array modifications", function() { } }) -test("is array", function() { +test("is array", function () { const x = mobx.observable([]) expect(x instanceof Array).toBe(true) @@ -286,7 +286,7 @@ test("is array", function() { expect(Array.isArray(x)).toBe(false) }) -test("stringifies same as ecma array", function() { +test("stringifies same as ecma array", function () { const x = mobx.observable([]) expect(x instanceof Array).toBe(true) @@ -298,10 +298,10 @@ test("stringifies same as ecma array", function() { expect(x.toLocaleString()).toBe("1,2") }) -test("observes when stringified", function() { +test("observes when stringified", function () { const x = mobx.observable([]) let c = 0 - mobx.autorun(function() { + mobx.autorun(function () { x.toString() c++ }) @@ -309,10 +309,10 @@ test("observes when stringified", function() { expect(c).toBe(2) }) -test("observes when stringified to locale", function() { +test("observes when stringified to locale", function () { const x = mobx.observable([]) let c = 0 - mobx.autorun(function() { + mobx.autorun(function () { x.toLocaleString() c++ }) @@ -320,14 +320,14 @@ test("observes when stringified to locale", function() { expect(c).toBe(2) }) -test("react to sort changes", function() { +test("react to sort changes", function () { const x = mobx.observable([4, 2, 3]) - const sortedX = mobx.computed(function() { + const sortedX = mobx.computed(function () { return x.slice().sort() }) let sorted - mobx.autorun(function() { + mobx.autorun(function () { sorted = sortedX.get() }) @@ -341,7 +341,7 @@ test("react to sort changes", function() { expect(sorted).toEqual([1, 2, 3]) }) -test("autoextend buffer length", function() { +test("autoextend buffer length", function () { const ar = observable(new Array(1000)) let changesCount = 0 mobx.observe(ar, () => ++changesCount) @@ -545,7 +545,7 @@ describe("extended array prototype", () => { test("reproduce #2021", () => { expect.assertions(1) try { - Array.prototype.extension = function() { + Array.prototype.extension = function () { console.log("I'm the extension!", this.length) } diff --git a/test/v4/base/autorun.js b/test/v4/base/autorun.js index fababe749..a238db16f 100644 --- a/test/v4/base/autorun.js +++ b/test/v4/base/autorun.js @@ -4,7 +4,7 @@ const mobx = require("../mobx4") const utils = require("../../v5/utils/test-utils") -test("autorun passes Reaction as an argument to view function", function() { +test("autorun passes Reaction as an argument to view function", function () { const a = mobx.observable.box(1) const values = [] @@ -23,7 +23,7 @@ test("autorun passes Reaction as an argument to view function", function() { expect(values).toEqual([1, 2, "pleaseDispose"]) }) -test("autorun can be disposed on first run", function() { +test("autorun can be disposed on first run", function () { const a = mobx.observable.box(1) const values = [] @@ -37,13 +37,13 @@ test("autorun can be disposed on first run", function() { expect(values).toEqual([1]) }) -test("autorun warns when passed an action", function() { +test("autorun warns when passed an action", function () { const action = mobx.action(() => {}) expect.assertions(1) expect(() => mobx.autorun(action)).toThrowError(/Autorun does not accept actions/) }) -test("autorun batches automatically", function() { +test("autorun batches automatically", function () { let runs = 0 let a1runs = 0 let a2runs = 0 @@ -83,7 +83,7 @@ test("autorun batches automatically", function() { d2() }) -test("autorun tracks invalidation of unbound dependencies", function() { +test("autorun tracks invalidation of unbound dependencies", function () { const a = mobx.observable.box(0) const b = mobx.observable.box(0) const c = mobx.computed(() => a.get() + b.get()) @@ -98,7 +98,7 @@ test("autorun tracks invalidation of unbound dependencies", function() { expect(values).toEqual([0, 100, 101]) }) -test("when effect is an action", function(done) { +test("when effect is an action", function (done) { const a = mobx.observable.box(0) mobx.configure({ enforceActions: "observed" }) diff --git a/test/v4/base/cycles.js b/test/v4/base/cycles.js index 71cda39b0..c35cfb124 100644 --- a/test/v4/base/cycles.js +++ b/test/v4/base/cycles.js @@ -1,15 +1,15 @@ const m = require("../mobx4") -test("cascading active state (form 1)", function() { - const Store = function() { +test("cascading active state (form 1)", function () { + const Store = function () { m.extendObservable(this, { _activeItem: null }) } - Store.prototype.activeItem = function(item) { + Store.prototype.activeItem = function (item) { const _this = this if (arguments.length === 0) return this._activeItem - m.transaction(function() { + m.transaction(function () { if (_this._activeItem === item) return if (_this._activeItem) _this._activeItem.isActive = false _this._activeItem = item @@ -17,7 +17,7 @@ test("cascading active state (form 1)", function() { }) } - const Item = function() { + const Item = function () { m.extendObservable(this, { isActive: false }) } @@ -44,12 +44,12 @@ test("cascading active state (form 1)", function() { expect(item2.isActive).toBe(false) }) -test("cascading active state (form 2)", function() { - const Store = function() { +test("cascading active state (form 2)", function () { + const Store = function () { const _this = this m.extendObservable(this, { activeItem: null }) - m.autorun(function() { + m.autorun(function () { if (_this._activeItem === _this.activeItem) return if (_this._activeItem) _this._activeItem.isActive = false _this._activeItem = _this.activeItem @@ -57,7 +57,7 @@ test("cascading active state (form 2)", function() { }) } - const Item = function() { + const Item = function () { m.extendObservable(this, { isActive: false }) } @@ -84,27 +84,27 @@ test("cascading active state (form 2)", function() { expect(item2.isActive).toBe(false) }) -test("emulate rendering", function() { +test("emulate rendering", function () { let renderCount = 0 - const Component = function(props) { + const Component = function (props) { this.props = props } - Component.prototype.destroy = function() { + Component.prototype.destroy = function () { if (this.handler) { this.handler() this.handler = null } } - Component.prototype.render = function() { + Component.prototype.render = function () { const _this = this if (this.handler) { this.handler() this.handler = null } - this.handler = m.autorun(function() { + this.handler = m.autorun(function () { if (!_this.props.data.title) _this.props.data.title = "HELLO" renderCount++ }) @@ -135,7 +135,7 @@ test("emulate rendering", function() { expect(renderCount).toBe(5) }) -test("efficient selection", function() { +test("efficient selection", function () { function Item(value) { m.extendObservable(this, { selected: false, @@ -161,14 +161,14 @@ test("efficient selection", function() { expect(store.selection).toBe(null) expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(0) store.selection = store.items[1] expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(1) @@ -177,7 +177,7 @@ test("efficient selection", function() { store.selection = store.items[2] expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(1) @@ -186,7 +186,7 @@ test("efficient selection", function() { store.selection = null expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(0) diff --git a/test/v4/base/extendObservable.js b/test/v4/base/extendObservable.js index f0c84102b..676601afe 100644 --- a/test/v4/base/extendObservable.js +++ b/test/v4/base/extendObservable.js @@ -10,13 +10,13 @@ import { extendObservable } from "../mobx4" -test("extendObservable should work", function() { +test("extendObservable should work", function () { class Box { // @ts-ignore uninitialized height = 20 sizes = [2] - someFunc = function() { + someFunc = function () { return 2 } get width() { @@ -66,13 +66,13 @@ test("extendObservable should work", function() { expect(ar.slice()).toEqual([40]) }) -test("extendObservable should work with plain object", function() { +test("extendObservable should work with plain object", function () { const box = { /** @type {boolean | undefined} */ uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -119,13 +119,13 @@ test("extendObservable should work with plain object", function() { expect(ar.slice()).toEqual([40]) }) -test("extendObservable should apply specified decorators", function() { +test("extendObservable should apply specified decorators", function () { const box = { /** @type {boolean | undefined} */ uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -150,7 +150,7 @@ test("extendObservable should apply specified decorators", function() { extendObservable( box, { - someFunc: function() { + someFunc: function () { return 2 } }, diff --git a/test/v4/base/extras.js b/test/v4/base/extras.js index 3c491f140..027bcd97b 100644 --- a/test/v4/base/extras.js +++ b/test/v4/base/extras.js @@ -2,7 +2,7 @@ const mobx = require("../mobx4") const m = mobx const { $mobx } = mobx -test("treeD", function() { +test("treeD", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const a = m.observable.box(3) @@ -54,7 +54,7 @@ test("treeD", function() { }) const x = mobx.observable.map({ temperature: 0 }) - const d = mobx.autorun(function() { + const d = mobx.autorun(function () { x.keys() if (x.has("temperature")) x.get("temperature") x.has("absent") @@ -80,7 +80,7 @@ test("treeD", function() { }) function stripTrackerOutput(output) { - return output.map(function(i) { + return output.map(function (i) { if (Array.isArray(i)) return stripTrackerOutput(i) delete i.object delete i.time @@ -89,18 +89,18 @@ function stripTrackerOutput(output) { }) } -test("spy 1", function() { +test("spy 1", function () { m._resetGlobalState() const lines = [] const a = m.observable.box(3) - const b = m.computed(function() { + const b = m.computed(function () { return a.get() * 2 }) - m.autorun(function() { + m.autorun(function () { b.get() }) - const stop = m.spy(function(line) { + const stop = m.spy(function (line) { lines.push(line) }) @@ -110,7 +110,7 @@ test("spy 1", function() { expect(stripTrackerOutput(lines)).toMatchSnapshot() }) -test("get atom", function() { +test("get atom", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? @@ -163,7 +163,7 @@ test("get atom", function() { f() }) -test("get debug name", function() { +test("get debug name", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? @@ -211,7 +211,7 @@ test("get debug name", function() { f() }) -test("get administration", function() { +test("get administration", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? diff --git a/test/v4/base/makereactive.js b/test/v4/base/makereactive.js index 08f3208fd..f882c7704 100644 --- a/test/v4/base/makereactive.js +++ b/test/v4/base/makereactive.js @@ -5,16 +5,16 @@ const { makeObservable } = mobx function buffer() { const b = [] - const res = function(x) { + const res = function (x) { b.push(x) } - res.toArray = function() { + res.toArray = function () { return b } return res } -test("isObservable", function() { +test("isObservable", function () { function Order() {} function ReactiveOrder(price) { @@ -27,12 +27,12 @@ test("isObservable", function() { expect(m.isObservable(m.observable([]))).toBe(true) expect(m.isObservable(m.observable({}))).toBe(true) - expect(m.isObservable(m.observable.box(function() {}))).toBe(true) - expect(m.isObservable(m.computed(function() {}))).toBe(true) + expect(m.isObservable(m.observable.box(function () {}))).toBe(true) + expect(m.isObservable(m.computed(function () {}))).toBe(true) expect(m.isObservable([])).toBe(false) expect(m.isObservable({})).toBe(false) - expect(m.isObservable(function() {})).toBe(false) + expect(m.isObservable(function () {})).toBe(false) expect(m.isObservable(new Order())).toBe(false) expect(m.isObservable(m.observable.box(new Order()))).toBe(true) @@ -43,8 +43,8 @@ test("isObservable", function() { const obj = {} expect(m.isObservable(obj)).toBe(false) - expect(m.isObservable(m.observable.box(function() {}))).toBe(true) - expect(m.isObservable(m.autorun(function() {}))).toBe(true) + expect(m.isObservable(m.observable.box(function () {}))).toBe(true) + expect(m.isObservable(m.autorun(function () {}))).toBe(true) expect(m.isObservableProp(m.observable({ a: 1 }), "a")).toBe(true) expect(m.isObservableProp(m.observable({ a: 1 }), "b")).toBe(false) @@ -59,7 +59,7 @@ test("isObservable", function() { expect(m.isObservableProp(obs, "a")).toBe(true) }) -test("isBoxedObservable", function() { +test("isBoxedObservable", function () { expect(m.isBoxedObservable(m.observable({}))).toBe(false) expect(m.isBoxedObservable(m.computed(() => 3))).toBe(false) expect(m.isBoxedObservable(m.observable.box(3))).toBe(true) @@ -67,7 +67,7 @@ test("isBoxedObservable", function() { expect(m.isBoxedObservable(m.observable.box({}))).toBe(true) }) -test("observable1", function() { +test("observable1", function () { m._resetGlobalState() // recursive structure @@ -79,7 +79,7 @@ test("observable1", function() { } }) const b = buffer() - m.autorun(function() { + m.autorun(function () { b(x.a.b.c) }) x.a = { b: { c: 4 } } @@ -106,7 +106,7 @@ test("observable1", function() { expect(m.isObservable(x2.a.b)).toBe(false) const b2 = buffer() - m.autorun(function() { + m.autorun(function () { b2(x2.a.b.c) }) x2.a = { b: { c: 4 } } @@ -126,7 +126,7 @@ test("observable1", function() { { deep: false } ) const b3 = buffer() - m.autorun(function() { + m.autorun(function () { b3(x3.a.b.c) }) x3.a = { b: { c: 4 } } @@ -134,7 +134,7 @@ test("observable1", function() { expect(b3.toArray()).toEqual([3, 4]) }) -test("observable3", function() { +test("observable3", function () { function Order(price) { this.price = price } @@ -144,7 +144,7 @@ test("observable3", function() { }) const b = buffer() - m.autorun(function() { + m.autorun(function () { b(x.orders.length) }) @@ -157,13 +157,13 @@ test("observable3", function() { expect(b.toArray()).toEqual([2, 3, 0, 1]) }) -test("observable4", function() { +test("observable4", function () { const x = m.observable([{ x: 1 }, { x: 2 }]) const b = buffer() m.observe( - m.computed(function() { - return x.map(function(d) { + m.computed(function () { + return x.map(function (d) { return d.x }) }), @@ -181,8 +181,8 @@ test("observable4", function() { const b2 = buffer() m.observe( - m.computed(function() { - return x2.map(function(d) { + m.computed(function () { + return x2.map(function (d) { return d.x }) }), @@ -196,18 +196,18 @@ test("observable4", function() { expect(b2.toArray()).toEqual([[1, 2], [2], [2, 5]]) }) -test("observable5", function() { - let x = m.computed(function() {}) - expect(function() { +test("observable5", function () { + let x = m.computed(function () {}) + expect(function () { x.set(7) // set not allowed }).toThrow(/It is not possible to assign a new value to a computed value/) - let f = function() {} + let f = function () {} const x2 = m.observable.box(f) expect(x2.get()).toBe(f) x2.set(null) // allowed - f = function() { + f = function () { return this.price } x = m.observable( @@ -224,12 +224,12 @@ test("observable5", function() { ) const b = buffer() - m.autorun(function() { + m.autorun(function () { b([x.reactive, x.nonReactive, x.nonReactive()]) }) x.price = 18 - const three = function() { + const three = function () { return 3 } x.nonReactive = three @@ -240,7 +240,7 @@ test("observable5", function() { ]) }) -test("flat array", function() { +test("flat array", function () { const x = m.observable.object( { x: [ @@ -254,7 +254,7 @@ test("flat array", function() { let result let updates = 0 - m.autorun(function() { + m.autorun(function () { updates++ result = JSON.stringify(mobx.toJS(x)) }) @@ -279,7 +279,7 @@ test("flat array", function() { expect(updates).toBe(3) }) -test("flat object", function() { +test("flat object", function () { const y = m.observable.object( { x: { z: 3 } @@ -290,7 +290,7 @@ test("flat object", function() { let result let updates = 0 - m.autorun(function() { + m.autorun(function () { updates++ result = JSON.stringify(mobx.toJS(y)) }) @@ -311,7 +311,7 @@ test("flat object", function() { expect(updates).toBe(2) }) -test("as structure", function() { +test("as structure", function () { const x = m.observable.object( { x: null @@ -322,7 +322,7 @@ test("as structure", function() { ) let changed = 0 - const dis = m.autorun(function() { + const dis = m.autorun(function () { changed++ JSON.stringify(x) }) @@ -407,7 +407,7 @@ test("as structure", function() { dis() }) -test("as structure view", function() { +test("as structure view", function () { const x = m.observable.object( { a: 1, @@ -427,14 +427,14 @@ test("as structure view", function() { ) let bc = 0 - m.autorun(function() { + m.autorun(function () { x.b bc++ }) expect(bc).toBe(1) let cc = 0 - m.autorun(function() { + m.autorun(function () { x.c cc++ }) @@ -449,7 +449,7 @@ test("as structure view", function() { expect(cc).toBe(2) }) -test("ES5 non reactive props", function() { +test("ES5 non reactive props", function () { let te = m.observable({}) Object.defineProperty(te, "nonConfigurable", { enumerable: true, @@ -458,7 +458,7 @@ test("ES5 non reactive props", function() { value: "static" }) // should throw if trying to reconfigure an existing non-configurable prop - expect(function() { + expect(function () { m.extendObservable(te2, { notConfigurable: 1 }) }).toThrow(/'extendObservable' expects an object as first argument/) // should skip non-configurable / writable props when using `observable` @@ -476,7 +476,7 @@ test("ES5 non reactive props", function() { value: "static" }) // should throw if trying to reconfigure an existing non-writable prop - expect(function() { + expect(function () { m.set(te2, { notWritable: 1 }) }).toThrow(/Cannot make property 'notWritable' observable/) const d2 = Object.getOwnPropertyDescriptor(te2, "notWritable") @@ -486,7 +486,7 @@ test("ES5 non reactive props", function() { expect(m.extendObservable(te, { bla: 3 }).bla).toBe(3) }) -test("540 - extendobservable should not report cycles", function() { +test("540 - extendobservable should not report cycles", function () { expect(() => m.extendObservable(Object.freeze({}), {})).toThrowError( /Cannot make the designated object observable/ ) diff --git a/test/v4/base/observables.js b/test/v4/base/observables.js index dddba9327..91ffc5c73 100644 --- a/test/v4/base/observables.js +++ b/test/v4/base/observables.js @@ -5,11 +5,11 @@ const m = mobx const { $mobx, makeObservable, observable, computed, transaction, autorun, extendObservable } = mobx const utils = require("../../v5/utils/test-utils") -const voidObserver = function() {} +const voidObserver = function () {} function buffer() { const b = [] - const res = function(x) { + const res = function (x) { if (typeof x.newValue === "object") { const copy = { ...x.newValue } delete copy[$mobx] @@ -18,7 +18,7 @@ function buffer() { b.push(x.newValue) } } - res.toArray = function() { + res.toArray = function () { return b } return res @@ -31,7 +31,7 @@ test("argumentless observable", () => { expect(a.get()).toBe(undefined) }) -test("basic", function() { +test("basic", function () { const x = observable.box(3) const b = buffer() m.observe(x, b) @@ -43,12 +43,12 @@ test("basic", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("basic2", function() { +test("basic2", function () { const x = observable.box(3) - const z = computed(function() { + const z = computed(function () { return x.get() * 2 }) - const y = computed(function() { + const y = computed(function () { return x.get() * 3 }) @@ -64,11 +64,11 @@ test("basic2", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("computed with asStructure modifier", function() { +test("computed with asStructure modifier", function () { const x1 = observable.box(3) const x2 = observable.box(5) const y = m.computed( - function() { + function () { return { sum: x1.get() + x2.get() } @@ -83,7 +83,7 @@ test("computed with asStructure modifier", function() { x1.set(4) expect(9).toBe(y.get().sum) - m.transaction(function() { + m.transaction(function () { // swap values, computation results is structuraly unchanged x1.set(5) x2.set(4) @@ -93,10 +93,10 @@ test("computed with asStructure modifier", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("dynamic", function(done) { +test("dynamic", function (done) { try { const x = observable.box(3) - const y = m.computed(function() { + const y = m.computed(function () { return x.get() }) const b = buffer() @@ -116,10 +116,10 @@ test("dynamic", function(done) { } }) -test("dynamic2", function(done) { +test("dynamic2", function (done) { try { const x = observable.box(3) - const y = computed(function() { + const y = computed(function () { return x.get() * x.get() }) @@ -140,7 +140,7 @@ test("dynamic2", function(done) { } }) -test("box uses equals", function(done) { +test("box uses equals", function (done) { try { const x = observable.box("a", { equals: (oldValue, newValue) => { @@ -165,7 +165,7 @@ test("box uses equals", function(done) { } }) -test("box uses equals2", function(done) { +test("box uses equals2", function (done) { try { const x = observable.box("01", { equals: (oldValue, newValue) => { @@ -173,7 +173,7 @@ test("box uses equals2", function(done) { } }) - const y = computed(function() { + const y = computed(function () { return parseInt(x) }) @@ -194,7 +194,7 @@ test("box uses equals2", function(done) { } }) -test("readme1", function(done) { +test("readme1", function (done) { try { const b = buffer() @@ -203,7 +203,7 @@ test("readme1", function(done) { order.price = observable.box(10) // Prints: New price: 24 // in TS, just: value(() => this.price() * (1+vat())) - order.priceWithVat = computed(function() { + order.priceWithVat = computed(function () { return order.price.get() * (1 + vat.get()) }) @@ -222,13 +222,13 @@ test("readme1", function(done) { } }) -test("batch", function() { +test("batch", function () { const a = observable.box(2) const b = observable.box(3) - const c = computed(function() { + const c = computed(function () { return a.get() * b.get() }) - const d = computed(function() { + const d = computed(function () { return c.get() * b.get() }) const buf = buffer() @@ -239,7 +239,7 @@ test("batch", function() { // Note, 60 should not happen! (that is d begin computed before c after update of b) expect(buf.toArray()).toEqual([36, 100]) - const x = mobx.transaction(function() { + const x = mobx.transaction(function () { a.set(2) b.set(3) a.set(6) @@ -252,16 +252,16 @@ test("batch", function() { expect(buf.toArray()).toEqual([36, 100, 54]) // only one new value for d }) -test("transaction with inspection", function() { +test("transaction with inspection", function () { const a = observable.box(2) let calcs = 0 - const b = computed(function() { + const b = computed(function () { calcs++ return a.get() * 2 }) // if not inspected during transaction, postpone value to end - mobx.transaction(function() { + mobx.transaction(function () { a.set(3) expect(b.get()).toBe(6) expect(calcs).toBe(1) @@ -270,7 +270,7 @@ test("transaction with inspection", function() { expect(calcs).toBe(2) // if inspected, evaluate eagerly - mobx.transaction(function() { + mobx.transaction(function () { a.set(4) expect(b.get()).toBe(8) expect(calcs).toBe(3) @@ -279,17 +279,17 @@ test("transaction with inspection", function() { expect(calcs).toBe(4) }) -test("transaction with inspection 2", function() { +test("transaction with inspection 2", function () { const a = observable.box(2) let calcs = 0 let b - mobx.autorun(function() { + mobx.autorun(function () { calcs++ b = a.get() * 2 }) // if not inspected during transaction, postpone value to end - mobx.transaction(function() { + mobx.transaction(function () { a.set(3) expect(b).toBe(4) expect(calcs).toBe(1) @@ -298,7 +298,7 @@ test("transaction with inspection 2", function() { expect(calcs).toBe(2) // if inspected, evaluate eagerly - mobx.transaction(function() { + mobx.transaction(function () { a.set(4) expect(b).toBe(6) expect(calcs).toBe(2) @@ -307,13 +307,13 @@ test("transaction with inspection 2", function() { expect(calcs).toBe(3) }) -test("scope", function() { +test("scope", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { this.price = observable.box(20) this.amount = observable.box(2) this.total = computed( - function() { + function () { return (1 + vat.get()) * this.price.get() * this.amount.get() }, { context: this } @@ -328,9 +328,9 @@ test("scope", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("props1", function() { +test("props1", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { mobx.extendObservable(this, { price: 20, amount: 2, @@ -347,7 +347,7 @@ test("props1", function() { expect(36).toBe(order.total) const totals = [] - const sub = mobx.autorun(function() { + const sub = mobx.autorun(function () { totals.push(order.total) }) order.amount = 4 @@ -358,9 +358,9 @@ test("props1", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("props2", function() { +test("props2", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { mobx.extendObservable(this, { price: 20, amount: 2, @@ -377,12 +377,12 @@ test("props2", function() { expect(36).toBe(order.total) }) -test("props4", function() { +test("props4", function () { function Bzz() { mobx.extendObservable(this, { fluff: [1, 2], get sum() { - return this.fluff.reduce(function(a, b) { + return this.fluff.reduce(function (a, b) { return a + b }, 0) } @@ -400,7 +400,7 @@ test("props4", function() { expect(x.sum).toBe(13) }) -test("extend observable multiple prop maps", function() { +test("extend observable multiple prop maps", function () { const x = { a: 1 } expect(() => { mobx.extendObservable( @@ -415,7 +415,7 @@ test("extend observable multiple prop maps", function() { }).toThrow(/invalid option for \(extend\)observable: c/) }) -test("object enumerable props", function() { +test("object enumerable props", function () { const x = mobx.observable({ a: 3, get b() { @@ -428,11 +428,11 @@ test("object enumerable props", function() { expect(ar).toEqual(["a", "c"]) }) -test("observe property", function() { +test("observe property", function () { const sb = [] const mb = [] - const Wrapper = function(chocolateBar) { + const Wrapper = function (chocolateBar) { mobx.extendObservable(this, { chocolateBar: chocolateBar, get calories() { @@ -451,10 +451,10 @@ test("observe property", function() { const wrappedSnickers = new Wrapper(snickers) const wrappedMars = new Wrapper(mars) - const disposeSnickers = mobx.autorun(function() { + const disposeSnickers = mobx.autorun(function () { sb.push(wrappedSnickers.calories) }) - const disposeMars = mobx.autorun(function() { + const disposeMars = mobx.autorun(function () { mb.push(wrappedMars.calories) }) snickers.calories = 10 @@ -469,7 +469,7 @@ test("observe property", function() { expect(mb).toEqual([undefined, 15]) }) -test("observe object", function() { +test("observe object", function () { let events = [] const a = observable({ a: 1, @@ -477,7 +477,7 @@ test("observe object", function() { return this.a * 2 } }) - const stop = m.observe(a, function(change) { + const stop = m.observe(a, function (change) { events.push(change) }) @@ -523,13 +523,13 @@ test("observe object", function() { expect(events.length).toBe(0) }) -test("mobx.observe", function() { +test("mobx.observe", function () { const events = [] const o = observable({ b: 2 }) const ar = observable([3]) const map = mobx.observable.map({}) - const push = function(event) { + const push = function (event) { events.push(event) } @@ -573,15 +573,15 @@ test("mobx.observe", function() { ]) }) -test("change count optimization", function() { +test("change count optimization", function () { let bCalcs = 0 let cCalcs = 0 const a = observable.box(3) - const b = computed(function() { + const b = computed(function () { bCalcs += 1 return 4 + a.get() - a.get() }) - const c = computed(function() { + const c = computed(function () { cCalcs += 1 return b.get() }) @@ -603,11 +603,11 @@ test("change count optimization", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("observables removed", function() { +test("observables removed", function () { let calcs = 0 const a = observable.box(1) const b = observable.box(2) - const c = computed(function() { + const c = computed(function () { calcs++ if (a.get() === 1) return b.get() * a.get() * b.get() return 3 @@ -632,19 +632,19 @@ test("observables removed", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("lazy evaluation", function() { +test("lazy evaluation", function () { let bCalcs = 0 let cCalcs = 0 let dCalcs = 0 let observerChanges = 0 const a = observable.box(1) - const b = computed(function() { + const b = computed(function () { bCalcs += 1 return a.get() + 1 }) - const c = computed(function() { + const c = computed(function () { cCalcs += 1 return b.get() + 1 }) @@ -667,14 +667,14 @@ test("lazy evaluation", function() { expect(bCalcs).toBe(3) expect(cCalcs).toBe(3) - const d = computed(function() { + const d = computed(function () { dCalcs += 1 return b.get() * 2 }) const handle = m.observe( d, - function() { + function () { observerChanges += 1 }, false @@ -710,16 +710,16 @@ test("lazy evaluation", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("multiple view dependencies", function() { +test("multiple view dependencies", function () { let bCalcs = 0 let dCalcs = 0 const a = observable.box(1) - const b = computed(function() { + const b = computed(function () { bCalcs++ return 2 * a.get() }) const c = observable.box(2) - const d = computed(function() { + const d = computed(function () { dCalcs++ return 3 * c.get() }) @@ -727,7 +727,7 @@ test("multiple view dependencies", function() { let zwitch = true const buffer = [] let fCalcs = 0 - const dis = mobx.autorun(function() { + const dis = mobx.autorun(function () { fCalcs++ if (zwitch) buffer.push(b.get() + d.get()) else buffer.push(d.get() + b.get()) @@ -754,17 +754,17 @@ test("multiple view dependencies", function() { expect(buffer).toEqual([8, 11, 14]) }) -test("nested observable2", function() { +test("nested observable2", function () { const factor = observable.box(0) const price = observable.box(100) let totalCalcs = 0 let innerCalcs = 0 - const total = computed(function() { + const total = computed(function () { totalCalcs += 1 // outer observable shouldn't recalc if inner observable didn't publish a real change return ( price.get() * - computed(function() { + computed(function () { innerCalcs += 1 return factor.get() % 2 === 0 ? 1 : 3 }).get() @@ -774,7 +774,7 @@ test("nested observable2", function() { const b = [] m.observe( total, - function(x) { + function (x) { b.push(x.newValue) }, true @@ -792,14 +792,14 @@ test("nested observable2", function() { expect(totalCalcs).toBe(5) }) -test("observe", function() { +test("observe", function () { const x = observable.box(3) - const x2 = computed(function() { + const x2 = computed(function () { return x.get() * 2 }) const b = [] - const cancel = mobx.autorun(function() { + const cancel = mobx.autorun(function () { b.push(x2.get()) }) @@ -811,15 +811,15 @@ test("observe", function() { expect(b).toEqual([6, 8, 10]) }) -test("when", function() { +test("when", function () { const x = observable.box(3) let called = 0 mobx.when( - function() { + function () { return x.get() === 4 }, - function() { + function () { called += 1 } ) @@ -834,15 +834,15 @@ test("when", function() { expect(called).toBe(1) }) -test("when 2", function() { +test("when 2", function () { const x = observable.box(3) let called = 0 const d = mobx.when( - function() { + function () { return x.get() === 3 }, - function() { + function () { called += 1 }, { name: "when x is 3" } @@ -865,7 +865,7 @@ function stripSpyOutput(events) { return events } -test("issue 50", function(done) { +test("issue 50", function (done) { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const x = observable({ @@ -884,12 +884,12 @@ test("issue 50", function(done) { result = [x.a, x.b, x.c].join(",") }) - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) - setTimeout(function() { - mobx.transaction(function() { + setTimeout(function () { + mobx.transaction(function () { events.push("transstart") x.a = !x.a x.b = !x.b @@ -907,7 +907,7 @@ test("issue 50", function(done) { }, 500) }) -test("verify transaction events", function() { +test("verify transaction events", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 @@ -925,11 +925,11 @@ test("verify transaction events", function() { x.c }) - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) - mobx.transaction(function() { + mobx.transaction(function () { events.push("transstart") x.b = 1 x.b = 2 @@ -943,18 +943,18 @@ test("verify transaction events", function() { disposer2() }) -test("verify array in transaction", function() { +test("verify array in transaction", function () { const ar = observable([]) let aCount = 0 let aValue - mobx.autorun(function() { + mobx.autorun(function () { aCount++ aValue = 0 for (let i = 0; i < ar.length; i++) aValue += ar[i] }) - mobx.transaction(function() { + mobx.transaction(function () { ar.push(2) ar.push(3) ar.push(4) @@ -964,7 +964,7 @@ test("verify array in transaction", function() { expect(aCount).toBe(2) }) -test("delay autorun until end of transaction", function() { +test("delay autorun until end of transaction", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const events = [] @@ -976,13 +976,13 @@ test("delay autorun until end of transaction", function() { } }) let disposer1 - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) let didRun = false - mobx.transaction(function() { - mobx.transaction(function() { + mobx.transaction(function () { + mobx.transaction(function () { disposer1 = mobx.autorun(function test() { didRun = true events.push("auto") @@ -1014,10 +1014,10 @@ test("delay autorun until end of transaction", function() { disposer2() }) -test("computed values believe NaN === NaN", function() { +test("computed values believe NaN === NaN", function () { const a = observable.box(2) const b = observable.box(3) - const c = computed(function() { + const c = computed(function () { return String(a.get() * b.get()) }) const buf = buffer() @@ -1032,10 +1032,10 @@ test("computed values believe NaN === NaN", function() { expect(buf.toArray()).toEqual(["NaN", "6"]) }) -test("computed values believe deep NaN === deep NaN when using compareStructural", function() { +test("computed values believe deep NaN === deep NaN when using compareStructural", function () { const a = observable({ b: { a: 1 } }) const c = computed( - function() { + function () { return a.b }, { compareStructural: true } @@ -1059,7 +1059,7 @@ test("computed values believe deep NaN === deep NaN when using compareStructural expect(bufArray.length).toBe(3) }) -test("issue 71, transacting running transformation", function() { +test("issue 71, transacting running transformation", function () { const state = mobx.observable({ things: [] }) @@ -1087,18 +1087,18 @@ test("issue 71, transacting running transformation", function() { let copy let vSum - mobx.autorun(function() { - copy = state.things.map(function(thing) { + mobx.autorun(function () { + copy = state.things.map(function (thing) { return thing.value }) - vSum = state.things.reduce(function(a, thing) { + vSum = state.things.reduce(function (a, thing) { return a + thing.value }, 0) }) expect(copy).toEqual([]) - mobx.transaction(function() { + mobx.transaction(function () { state.things.push(new Thing(1)) }) @@ -1112,7 +1112,7 @@ test("issue 71, transacting running transformation", function() { expect(vSum).toBe(25) }) -test("eval in transaction", function() { +test("eval in transaction", function () { let bCalcs = 0 const x = mobx.observable({ a: 1, @@ -1123,14 +1123,14 @@ test("eval in transaction", function() { }) let c - mobx.autorun(function() { + mobx.autorun(function () { c = x.b }) expect(bCalcs).toBe(1) expect(c).toBe(2) - mobx.transaction(function() { + mobx.transaction(function () { x.a = 3 expect(x.b).toBe(6) expect(bCalcs).toBe(2) @@ -1145,15 +1145,15 @@ test("eval in transaction", function() { expect(c).toBe(8) }) -test("forcefully tracked reaction should still yield valid results", function() { +test("forcefully tracked reaction should still yield valid results", function () { const x = observable.box(3) let z let runCount = 0 - const identity = function() { + const identity = function () { runCount++ z = x.get() } - const a = new mobx.Reaction("test", function() { + const a = new mobx.Reaction("test", function () { this.track(identity) }) a.runReaction_() @@ -1161,7 +1161,7 @@ test("forcefully tracked reaction should still yield valid results", function() expect(z).toBe(3) expect(runCount).toBe(1) - transaction(function() { + transaction(function () { x.set(4) a.track(identity) expect(a.isScheduled()).toBe(true) @@ -1172,7 +1172,7 @@ test("forcefully tracked reaction should still yield valid results", function() expect(z).toBe(4) expect(runCount).toBe(2) // x is observed, so it should recompute only on dependency change - transaction(function() { + transaction(function () { x.set(5) expect(a.isScheduled()).toBe(true) a.track(identity) @@ -1189,17 +1189,17 @@ test("forcefully tracked reaction should still yield valid results", function() expect(runCount).toBe(4) }) -test("autoruns created in autoruns should kick off", function() { +test("autoruns created in autoruns should kick off", function () { const x = observable.box(3) const x2 = [] let d - const a = m.autorun(function() { + const a = m.autorun(function () { if (d) { // dispose previous autorun d() } - d = m.autorun(function() { + d = m.autorun(function () { x2.push(x.get() * 2) }) }) @@ -1468,7 +1468,7 @@ test("support computed property getters / setters", () => { d() }) -test("computed getter / setter for plan objects should succeed", function() { +test("computed getter / setter for plan objects should succeed", function () { const b = observable({ a: 3, get propX() { @@ -1480,7 +1480,7 @@ test("computed getter / setter for plan objects should succeed", function() { }) const values = [] - mobx.autorun(function() { + mobx.autorun(function () { return values.push(b.propX) }) expect(b.propX).toBe(6) @@ -1490,7 +1490,7 @@ test("computed getter / setter for plan objects should succeed", function() { expect(values).toEqual([6, 8]) }) -test("helpful error for self referencing setter", function() { +test("helpful error for self referencing setter", function () { const a = observable({ x: 1, get y() { @@ -1504,7 +1504,7 @@ test("helpful error for self referencing setter", function() { expect(() => (a.y = 2)).toThrowError(/The setter of computed value/) }) -test("#558 boxed observables stay boxed observables", function() { +test("#558 boxed observables stay boxed observables", function () { const a = observable({ x: observable.box(3) }) @@ -1513,11 +1513,11 @@ test("#558 boxed observables stay boxed observables", function() { expect(typeof a.x.get).toBe("function") }) -test("iscomputed", function() { +test("iscomputed", function () { expect(mobx.isComputed(observable.box(3))).toBe(false) expect( mobx.isComputed( - mobx.computed(function() { + mobx.computed(function () { return 3 }) ) @@ -1562,7 +1562,7 @@ test("603 - transaction should not kill reactions", () => { d() }) -test("#561 test toPrimitive() of observable objects", function() { +test("#561 test toPrimitive() of observable objects", function () { if (typeof Symbol !== "undefined" && Symbol.toPrimitive) { let x = observable.box(3) diff --git a/test/v4/base/observe.ts b/test/v4/base/observe.ts index cf668e409..fc7328517 100644 --- a/test/v4/base/observe.ts +++ b/test/v4/base/observe.ts @@ -1,6 +1,6 @@ import { observable, observe, computed } from "../mobx4" -test("observe object and map properties", function() { +test("observe object and map properties", function () { const map = observable.map({ a: 1 }) const events: any[] = [] diff --git a/test/v4/base/tojs.js b/test/v4/base/tojs.js index 648804090..057d83011 100644 --- a/test/v4/base/tojs.js +++ b/test/v4/base/tojs.js @@ -5,7 +5,7 @@ const m = mobx const observable = mobx.observable const { makeObservable } = mobx -test("json1", function() { +test("json1", function () { mobx._resetGlobalState() const todos = observable([ @@ -18,9 +18,9 @@ test("json1", function() { ]) let output - mobx.autorun(function() { + mobx.autorun(function () { output = todos - .map(function(todo) { + .map(function (todo) { return todo.title }) .join(", ") @@ -32,7 +32,7 @@ test("json1", function() { expect(output).toBe("write blog, improve coverage, take a nap") }) -test("json2", function() { +test("json2", function () { const source = { todos: [ { @@ -56,13 +56,13 @@ test("json2", function() { expect(mobx.toJS(o)).toEqual(source) - const analyze = mobx.computed(function() { + const analyze = mobx.computed(function () { return [o.todos.length, o.todos[1].details.url] }) - const alltags = mobx.computed(function() { + const alltags = mobx.computed(function () { return o.todos - .map(function(todo) { + .map(function (todo) { return todo.tags.join(",") }) .join(",") @@ -73,14 +73,14 @@ test("json2", function() { m.observe( analyze, - function(d) { + function (d) { ab.push(d.newValue) }, true ) m.observe( alltags, - function(d) { + function (d) { tb.push(d.newValue) }, true @@ -224,7 +224,7 @@ test("toJS handles dates", () => { expect(a.d === b.d).toBe(true) }) -test("json cycles", function() { +test("json cycles", function () { const a = observable({ b: 1, c: [2], @@ -316,7 +316,7 @@ test("verify already seen", () => { expect(res.x === a).toBeFalsy() }) -test("json cycles when exporting maps as maps", function() { +test("json cycles when exporting maps as maps", function () { const a = observable({ b: 1, c: [2], diff --git a/test/v5/base/action.js b/test/v5/base/action.js index 351bf9c14..7edf62acc 100644 --- a/test/v5/base/action.js +++ b/test/v5/base/action.js @@ -15,7 +15,7 @@ test("action should wrap in transaction", () => { }) expect(mobx.isAction(increment)).toBe(true) - expect(mobx.isAction(function() {})).toBe(false) + expect(mobx.isAction(function () {})).toBe(false) increment(7) @@ -257,7 +257,7 @@ test("action in autorun should be untracked", () => { test("action should not be converted to computed when using (extend)observable", () => { const a = mobx.observable({ a: 1, - b: mobx.action(function() { + b: mobx.action(function () { this.a++ }) }) @@ -267,7 +267,7 @@ test("action should not be converted to computed when using (extend)observable", expect(a.a).toBe(2) mobx.extendObservable(a, { - c: mobx.action(function() { + c: mobx.action(function () { this.a *= 3 }) }) @@ -282,7 +282,7 @@ test("#286 exceptions in actions should not affect global state", () => { function Todos() { mobx.extendObservable(this, { count: 0, - add: mobx.action(function() { + add: mobx.action(function () { this.count++ if (this.count === 2) { throw new Error("An Action Error!") @@ -370,7 +370,7 @@ test("action in autorun does not keep / make computed values alive", () => { callComputedTwice() expect(calls).toBe(5) - runWithMemoizing(function() { + runWithMemoizing(function () { mobx.runInAction(callComputedTwice) }) expect(calls).toBe(6) @@ -453,7 +453,7 @@ test("bound actions bind", () => { const x = mobx.observable( { y: 0, - z: function(v) { + z: function (v) { this.y += v this.y += v }, diff --git a/test/v5/base/api.js b/test/v5/base/api.js index e6f888dcc..bcd342339 100644 --- a/test/v5/base/api.js +++ b/test/v5/base/api.js @@ -1,6 +1,6 @@ const mobx = require("../../../src/mobx.ts") -test("correct api should be exposed", function() { +test("correct api should be exposed", function () { expect( Object.keys(mobx) .filter(key => mobx[key] !== undefined) diff --git a/test/v5/base/array.js b/test/v5/base/array.js index 175b2d6da..8298f1bbd 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -4,7 +4,7 @@ const mobx = require("../../../src/mobx.ts") const { observable, when, _getAdministration, reaction, computed, makeObservable, autorun } = mobx const iterall = require("iterall") -test("test1", function() { +test("test1", function () { const a = observable.array([]) expect(a.length).toBe(0) expect(Object.keys(a)).toEqual([]) @@ -18,10 +18,10 @@ test("test1", function() { expect(a.length).toBe(2) expect(a.slice()).toEqual([1, 2]) - const sum = mobx.computed(function() { + const sum = mobx.computed(function () { return ( -1 + - a.reduce(function(a, b) { + a.reduce(function (a, b) { return a + b }, 1) ) @@ -146,7 +146,7 @@ test("array should support iterall / iterable ", () => { expect(iter.next()).toEqual({ value: undefined, done: true }) }) -test("find(findIndex) and remove", function() { +test("find(findIndex) and remove", function () { const a = mobx.observable([10, 20, 20]) let idx = -1 function predicate(item, index) { @@ -180,12 +180,12 @@ test("concat should automatically slice observable arrays, #260", () => { expect(a1.concat(a2)).toEqual([1, 2, 3, 4]) }) -test("observe", function() { +test("observe", function () { const ar = mobx.observable([1, 4]) const buf = [] const disposer = mobx.observe( ar, - function(changes) { + function (changes) { buf.push(changes) }, true @@ -204,7 +204,7 @@ test("observe", function() { ar.pop() // does not fire anything // check the object param - buf.forEach(function(change) { + buf.forEach(function (change) { expect(change.object).toBe(ar) delete change.object }) @@ -241,14 +241,14 @@ test("observe", function() { expect(buf).toEqual(result) }) -test("array modification1", function() { +test("array modification1", function () { const a = mobx.observable([1, 2, 3]) const r = a.splice(-10, 5, 4, 5, 6) expect(a.slice()).toEqual([4, 5, 6]) expect(r).toEqual([1, 2, 3]) }) -test("serialize", function() { +test("serialize", function () { let a = [1, 2, 3] const m = mobx.observable(a) @@ -262,11 +262,11 @@ test("serialize", function() { expect(a).toEqual(m.toJSON()) }) -test("array modification functions", function() { +test("array modification functions", function () { const ars = [[], [1, 2, 3]] const funcs = ["push", "pop", "shift", "unshift"] - funcs.forEach(function(f) { - ars.forEach(function(ar) { + funcs.forEach(function (f) { + ars.forEach(function (ar) { const a = ar.slice() const b = mobx.observable(a) const res1 = a[f](4) @@ -277,7 +277,7 @@ test("array modification functions", function() { }) }) -test("array modifications", function() { +test("array modifications", function () { const a2 = mobx.observable([]) const inputs = [undefined, -10, -4, -3, -1, 0, 1, 3, 4, 10] const arrays = [ @@ -313,7 +313,7 @@ test("array modifications", function() { } }) -test("is array", function() { +test("is array", function () { const x = mobx.observable([]) expect(x instanceof Array).toBe(true) @@ -321,7 +321,7 @@ test("is array", function() { expect(Array.isArray(x)).toBe(true) }) -test("stringifies same as ecma array", function() { +test("stringifies same as ecma array", function () { const x = mobx.observable([]) expect(x instanceof Array).toBe(true) @@ -333,10 +333,10 @@ test("stringifies same as ecma array", function() { expect(x.toLocaleString()).toBe("1,2") }) -test("observes when stringified", function() { +test("observes when stringified", function () { const x = mobx.observable([]) let c = 0 - mobx.autorun(function() { + mobx.autorun(function () { x.toString() c++ }) @@ -344,10 +344,10 @@ test("observes when stringified", function() { expect(c).toBe(2) }) -test("observes when stringified to locale", function() { +test("observes when stringified to locale", function () { const x = mobx.observable([]) let c = 0 - mobx.autorun(function() { + mobx.autorun(function () { x.toLocaleString() c++ }) @@ -355,14 +355,14 @@ test("observes when stringified to locale", function() { expect(c).toBe(2) }) -test("react to sort changes", function() { +test("react to sort changes", function () { const x = mobx.observable([4, 2, 3]) - const sortedX = mobx.computed(function() { + const sortedX = mobx.computed(function () { return x.slice().sort() }) let sorted - mobx.autorun(function() { + mobx.autorun(function () { sorted = sortedX.get() }) @@ -376,7 +376,7 @@ test("react to sort changes", function() { expect(sorted).toEqual([1, 2, 3]) }) -test("autoextend buffer length", function() { +test("autoextend buffer length", function () { const ar = observable(new Array(1000)) let changesCount = 0 mobx.observe(ar, () => ++changesCount) @@ -505,7 +505,7 @@ test("can define properties on arrays", () => { Object.defineProperty(ar, "toString", { enumerable: false, configurable: true, - value: function() { + value: function () { return "hoi" } }) @@ -618,7 +618,7 @@ describe("extended array prototype", () => { test("reproduce #2021", () => { expect.assertions(1) try { - Array.prototype.extension = function() { + Array.prototype.extension = function () { console.log("I'm the extension!", this.length) } diff --git a/test/v5/base/autorun.js b/test/v5/base/autorun.js index 37e746dfc..c84a9b3c5 100644 --- a/test/v5/base/autorun.js +++ b/test/v5/base/autorun.js @@ -4,7 +4,7 @@ const mobx = require("../../../src/mobx.ts") const utils = require("../../v5/utils/test-utils") -test("autorun passes Reaction as an argument to view function", function() { +test("autorun passes Reaction as an argument to view function", function () { const a = mobx.observable.box(1) const values = [] @@ -23,7 +23,7 @@ test("autorun passes Reaction as an argument to view function", function() { expect(values).toEqual([1, 2, "pleaseDispose"]) }) -test("autorun can be disposed on first run", function() { +test("autorun can be disposed on first run", function () { const a = mobx.observable.box(1) const values = [] @@ -37,13 +37,13 @@ test("autorun can be disposed on first run", function() { expect(values).toEqual([1]) }) -test("autorun warns when passed an action", function() { +test("autorun warns when passed an action", function () { const action = mobx.action(() => {}) expect.assertions(1) expect(() => mobx.autorun(action)).toThrowError(/Autorun does not accept actions/) }) -test("autorun batches automatically", function() { +test("autorun batches automatically", function () { let runs = 0 let a1runs = 0 let a2runs = 0 @@ -83,7 +83,7 @@ test("autorun batches automatically", function() { d2() }) -test("autorun tracks invalidation of unbound dependencies", function() { +test("autorun tracks invalidation of unbound dependencies", function () { const a = mobx.observable.box(0) const b = mobx.observable.box(0) const c = mobx.computed(() => a.get() + b.get()) @@ -98,7 +98,7 @@ test("autorun tracks invalidation of unbound dependencies", function() { expect(values).toEqual([0, 100, 101]) }) -test("when effect is an action", function(done) { +test("when effect is an action", function (done) { const a = mobx.observable.box(0) mobx.configure({ enforceActions: "observed" }) diff --git a/test/v5/base/autorunAsync.js b/test/v5/base/autorunAsync.js index f0bc1f54e..e3abc93da 100644 --- a/test/v5/base/autorunAsync.js +++ b/test/v5/base/autorunAsync.js @@ -7,7 +7,7 @@ const utils = require("../../v5/utils/test-utils") const { $mobx } = mobx -test("autorun 1", function(done) { +test("autorun 1", function (done) { let _fired = 0 let _result = null let _cCalcs = 0 @@ -23,12 +23,12 @@ test("autorun 1", function(done) { const a = mobx.observable.box(2) const b = mobx.observable.box(3) - const c = mobx.computed(function() { + const c = mobx.computed(function () { _cCalcs++ return a.get() * b.get() }) const d = mobx.observable.box(1) - const autorun = function() { + const autorun = function () { _fired++ _result = d.get() > 0 ? a.get() * c.get() : d.get() } @@ -36,43 +36,43 @@ test("autorun 1", function(done) { check(0, 0, null) disp() - to(function() { + to(function () { check(0, 0, null) disp = mobx.autorun(autorun, { delay: 20 }) - to(function() { + to(function () { check(1, 1, 12) a.set(4) b.set(5) a.set(6) check(0, 0, null) // a change triggered async rerun, compute will trigger after 20ms of async timeout - to(function() { + to(function () { check(1, 1, 180) d.set(2) - to(function() { + to(function () { check(1, 0, 180) d.set(-2) - to(function() { + to(function () { check(1, 0, -2) a.set(7) - to(function() { + to(function () { check(0, 0, 0) // change a has no effect a.set(4) b.set(2) d.set(2) - to(function() { + to(function () { check(1, 1, 32) disp() a.set(1) b.set(2) d.set(4) - to(function() { + to(function () { check(0, 0, 0) done() }, 30) @@ -85,7 +85,7 @@ test("autorun 1", function(done) { }, 30) }) -test("autorun should not result in loop", function(done) { +test("autorun should not result in loop", function (done) { let i = 0 const a = mobx.observable({ x: i @@ -93,17 +93,17 @@ test("autorun should not result in loop", function(done) { let autoRunsCalled = 0 const d = mobx.autorun( - function() { + function () { autoRunsCalled++ a.x = ++i - setTimeout(function() { + setTimeout(function () { a.x = ++i }, 10) }, { delay: 10, name: "named async" } ) - setTimeout(function() { + setTimeout(function () { expect(autoRunsCalled).toBe(1) done() @@ -112,7 +112,7 @@ test("autorun should not result in loop", function(done) { }, 100) }) -test("autorunAsync passes Reaction as an argument to view function", function(done) { +test("autorunAsync passes Reaction as an argument to view function", function (done) { const a = mobx.observable.box(1) let autoRunsCalled = 0 @@ -131,13 +131,13 @@ test("autorunAsync passes Reaction as an argument to view function", function(do setTimeout(() => a.set(3), 550) setTimeout(() => a.set(4), 700) - setTimeout(function() { + setTimeout(function () { expect(autoRunsCalled).toBe(3) done() }, 1000) }) -test("autorunAsync accepts a scheduling function", function(done) { +test("autorunAsync accepts a scheduling function", function (done) { const a = mobx.observable({ x: 0, y: 1 @@ -147,36 +147,36 @@ test("autorunAsync accepts a scheduling function", function(done) { let schedulingsCalled = 0 mobx.autorun( - function() { + function () { autoRunsCalled++ expect(a.y).toBe(a.x + 1) if (a.x < 10) { // Queue the two actions separately, if this was autorun it would fail - setTimeout(function() { + setTimeout(function () { a.x = a.x + 1 }, 0) - setTimeout(function() { + setTimeout(function () { a.y = a.y + 1 }, 0) } }, { - scheduler: function(fn) { + scheduler: function (fn) { schedulingsCalled++ setTimeout(fn, 0) } } ) - setTimeout(function() { + setTimeout(function () { expect(autoRunsCalled).toBe(11) expect(schedulingsCalled).toBe(11) done() }, 1000) }) -test("reaction accepts a scheduling function", function(done) { +test("reaction accepts a scheduling function", function (done) { const a = mobx.observable({ x: 0, y: 1 @@ -199,7 +199,7 @@ test("reaction accepts a scheduling function", function(done) { }, { fireImmediately: true, - scheduler: function(fn) { + scheduler: function (fn) { schedulingsCalled++ setTimeout(fn, 2) } @@ -215,7 +215,7 @@ test("reaction accepts a scheduling function", function(done) { a.x++ }, 20) - setTimeout(function() { + setTimeout(function () { expect(exprCalled).toBe(3) // start, 2 batches expect(autoRunsCalled).toBe(3) // start, 2 batches expect(schedulingsCalled).toBe(2) // skipped first time due to fireImmediately @@ -224,7 +224,7 @@ test("reaction accepts a scheduling function", function(done) { }, 100) }) -test("autorunAsync warns when passed an action", function() { +test("autorunAsync warns when passed an action", function () { const action = mobx.action(() => {}) expect.assertions(1) expect(() => mobx.autorun(action)).toThrowError(/Autorun does not accept actions/) diff --git a/test/v5/base/babel-decorators.js b/test/v5/base/babel-decorators.js index 40d7d1064..9c2bfc67b 100644 --- a/test/v5/base/babel-decorators.js +++ b/test/v5/base/babel-decorators.js @@ -17,13 +17,13 @@ import { } from "../../../src/mobx" import * as mobx from "../../../src/mobx" -test("babel", function() { +test("babel", function () { class Box { @observable uninitialized @observable height = 20 @observable sizes = [2] @observable - someFunc = function() { + someFunc = function () { return 2 } @@ -152,7 +152,7 @@ class Order { @observable price = 3 @observable amount = 2 @observable orders = [] - @observable aFunction = function() {} + @observable aFunction = function () {} constructor() { makeObservable(this) @@ -164,7 +164,7 @@ class Order { } } -test("issue 191 - shared initializers (babel)", function() { +test("issue 191 - shared initializers (babel)", function () { class Test { @observable obj = { a: 1 } @observable array = [2] @@ -249,7 +249,7 @@ function normalizeSpyEvents(events) { return events } -test("action decorator (babel)", function() { +test("action decorator (babel)", function () { class Store { constructor(multiplier) { makeObservable(this) @@ -282,7 +282,7 @@ test("action decorator (babel)", function() { d() }) -test("custom action decorator (babel)", function() { +test("custom action decorator (babel)", function () { class Store { constructor(multiplier) { makeObservable(this) @@ -333,7 +333,7 @@ test("custom action decorator (babel)", function() { d() }) -test("action decorator on field (babel)", function() { +test("action decorator on field (babel)", function () { class Store { constructor(multiplier) { makeObservable(this) @@ -367,7 +367,7 @@ test("action decorator on field (babel)", function() { d() }) -test("custom action decorator on field (babel)", function() { +test("custom action decorator on field (babel)", function () { class Store { constructor(multiplier) { makeObservable(this) @@ -883,7 +883,7 @@ test("505, don't throw when accessing subclass fields in super constructor (babe expect(values).toEqual({ a: 1, b: undefined }) }) -test("computed setter should succeed (babel)", function() { +test("computed setter should succeed (babel)", function () { class Bla { @observable a = 3 diff --git a/test/v5/base/babel-tests.js b/test/v5/base/babel-tests.js index 3052d91fb..0bd4be3c7 100644 --- a/test/v5/base/babel-tests.js +++ b/test/v5/base/babel-tests.js @@ -17,12 +17,12 @@ import { } from "../../../src/mobx" import * as mobx from "../../../src/mobx" -test("babel", function() { +test("babel", function () { class Box { uninitialized height = 20 sizes = [2] - someFunc = function() { + someFunc = function () { return 2 } @@ -162,7 +162,7 @@ class Order { price = 3 amount = 2 orders = [] - aFunction = function() {} + aFunction = function () {} constructor() { makeObservable(this, { @@ -179,7 +179,7 @@ class Order { } } -test("decorators", function() { +test("decorators", function () { const o = new Order() expect(isObservableObject(o)).toBe(true) expect(isObservableProp(o, "amount")).toBe(true) @@ -209,7 +209,7 @@ test("decorators", function() { ]) }) -test("issue 191 - shared initializers (babel)", function() { +test("issue 191 - shared initializers (babel)", function () { class Test { obj = { a: 1 } array = [2] @@ -300,7 +300,7 @@ function normalizeSpyEvents(events) { return events } -test("action decorator (babel)", function() { +test("action decorator (babel)", function () { class Store { constructor(multiplier) { makeObservable(this, { @@ -335,7 +335,7 @@ test("action decorator (babel)", function() { d() }) -test("custom action decorator (babel)", function() { +test("custom action decorator (babel)", function () { class Store { constructor(multiplier) { makeObservable(this, { @@ -388,7 +388,7 @@ test("custom action decorator (babel)", function() { d() }) -test("action decorator on field (babel)", function() { +test("action decorator on field (babel)", function () { class Store { constructor(multiplier) { makeObservable(this, { @@ -424,7 +424,7 @@ test("action decorator on field (babel)", function() { d() }) -test("custom action decorator on field (babel)", function() { +test("custom action decorator on field (babel)", function () { class Store { constructor(multiplier) { makeObservable(this, { @@ -1037,7 +1037,7 @@ test("505, don't throw when accessing subclass fields in super constructor (babe expect(values).toEqual({ a: 1, b: undefined }) }) -test("computed setter should succeed (babel)", function() { +test("computed setter should succeed (babel)", function () { class Bla { a = 3 @@ -1062,7 +1062,7 @@ test("computed setter should succeed (babel)", function() { expect(b.propX).toBe(8) }) -test("computed getter / setter for plan objects should succeed (babel)", function() { +test("computed getter / setter for plan objects should succeed (babel)", function () { const b = observable({ a: 3, get propX() { diff --git a/test/v5/base/cycles.js b/test/v5/base/cycles.js index 261be8d27..773386589 100644 --- a/test/v5/base/cycles.js +++ b/test/v5/base/cycles.js @@ -1,15 +1,15 @@ const m = require("../../../src/mobx.ts") -test("cascading active state (form 1)", function() { - const Store = function() { +test("cascading active state (form 1)", function () { + const Store = function () { m.extendObservable(this, { _activeItem: null }) } - Store.prototype.activeItem = function(item) { + Store.prototype.activeItem = function (item) { const _this = this if (arguments.length === 0) return this._activeItem - m.transaction(function() { + m.transaction(function () { if (_this._activeItem === item) return if (_this._activeItem) _this._activeItem.isActive = false _this._activeItem = item @@ -17,7 +17,7 @@ test("cascading active state (form 1)", function() { }) } - const Item = function() { + const Item = function () { m.extendObservable(this, { isActive: false }) } @@ -44,12 +44,12 @@ test("cascading active state (form 1)", function() { expect(item2.isActive).toBe(false) }) -test("cascading active state (form 2)", function() { - const Store = function() { +test("cascading active state (form 2)", function () { + const Store = function () { const _this = this m.extendObservable(this, { activeItem: null }) - m.autorun(function() { + m.autorun(function () { if (_this._activeItem === _this.activeItem) return if (_this._activeItem) _this._activeItem.isActive = false _this._activeItem = _this.activeItem @@ -57,7 +57,7 @@ test("cascading active state (form 2)", function() { }) } - const Item = function() { + const Item = function () { m.extendObservable(this, { isActive: false }) } @@ -84,27 +84,27 @@ test("cascading active state (form 2)", function() { expect(item2.isActive).toBe(false) }) -test("emulate rendering", function() { +test("emulate rendering", function () { let renderCount = 0 - const Component = function(props) { + const Component = function (props) { this.props = props } - Component.prototype.destroy = function() { + Component.prototype.destroy = function () { if (this.handler) { this.handler() this.handler = null } } - Component.prototype.render = function() { + Component.prototype.render = function () { const _this = this if (this.handler) { this.handler() this.handler = null } - this.handler = m.autorun(function() { + this.handler = m.autorun(function () { if (!_this.props.data.title) _this.props.data.title = "HELLO" renderCount++ }) @@ -135,7 +135,7 @@ test("emulate rendering", function() { expect(renderCount).toBe(5) }) -test("efficient selection", function() { +test("efficient selection", function () { function Item(value) { m.extendObservable(this, { selected: false, @@ -161,14 +161,14 @@ test("efficient selection", function() { expect(store.selection).toBe(null) expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(0) store.selection = store.items[1] expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(1) @@ -177,7 +177,7 @@ test("efficient selection", function() { store.selection = store.items[2] expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(1) @@ -186,7 +186,7 @@ test("efficient selection", function() { store.selection = null expect( - store.items.filter(function(i) { + store.items.filter(function (i) { return i.selected }).length ).toBe(0) diff --git a/test/v5/base/decorate.js b/test/v5/base/decorate.js index b84506a90..278ce30af 100644 --- a/test/v5/base/decorate.js +++ b/test/v5/base/decorate.js @@ -33,13 +33,13 @@ test("throws on undeclared prop", () => { ) }) -test("decorate should work", function() { +test("decorate should work", function () { class Box { // @ts-ignore uninitialized height = 20 sizes = [2] - someFunc = function() { + someFunc = function () { return 2 } get width() { @@ -107,13 +107,13 @@ test("decorate should work", function() { expect(box2.width).toBe(40) // no shared state! }) -test("decorate should work with plain object", function() { +test("decorate should work with plain object", function () { const box = { /** @type {boolean | undefined} */ uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -175,12 +175,12 @@ test("decorate should work with plain object", function() { expect(ar.slice()).toEqual([40, 20, 60, 210, 420, 700]) }) -test("decorate should work with Object.create", function() { +test("decorate should work with Object.create", function () { const Box = { uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -243,7 +243,7 @@ test("decorate should work with Object.create", function() { expect(ar.slice()).toEqual([40, 20, 60, 210, 420, 700]) }) -test("decorate should work with constructor function", function() { +test("decorate should work with constructor function", function () { function Box() { this.uninitialized = undefined this.height = 20 @@ -265,10 +265,10 @@ test("decorate should work with constructor function", function() { } }) this.sizes = [2] - this.someFunc = function() { + this.someFunc = function () { return 2 } - this.addSize = function() { + this.addSize = function () { this.sizes.push([3]) this.sizes.push([4]) } @@ -342,7 +342,7 @@ test("decorate should work with inheritance through Object.create", () => { expect(child1.x).toBe(5) }) -test("decorate should not allow @observable on getter", function() { +test("decorate should not allow @observable on getter", function () { const obj = { x: 0, get y() { @@ -375,7 +375,7 @@ test("decorate should not allow @observable on getter", function() { ) }) -test("decorate a property with two decorators", function() { +test("decorate a property with two decorators", function () { let updatedByAutorun class Obj { diff --git a/test/v5/base/errorhandling.js b/test/v5/base/errorhandling.js index 3c3756a73..357ed88da 100644 --- a/test/v5/base/errorhandling.js +++ b/test/v5/base/errorhandling.js @@ -4,7 +4,7 @@ const utils = require("../../v5/utils/test-utils") const { observable, computed, $mobx } = mobx -const voidObserver = function() {} +const voidObserver = function () {} function checkGlobalState() { const gs = mobx._getGlobalState() @@ -15,8 +15,8 @@ function checkGlobalState() { expect(gs.pendingUnobservations.length).toBe(0) } -test("exception1", function() { - const a = computed(function() { +test("exception1", function () { + const a = computed(function () { throw "hoi" }) expect(() => a.get()).toThrow(/hoi/) @@ -134,10 +134,10 @@ test("multiple autoruns with exceptions are handled correctly", () => { d3() }) -test("deny state changes in views", function() { +test("deny state changes in views", function () { const x = observable.box(3) const z = observable.box(5) - const y = computed(function() { + const y = computed(function () { z.set(6) return x.get() * x.get() }) @@ -161,11 +161,11 @@ test("deny state changes in views", function() { checkGlobalState() }) -test("allow state changes in autorun", function() { +test("allow state changes in autorun", function () { const x = observable.box(3) const z = observable.box(3) - m.autorun(function() { + m.autorun(function () { if (x.get() !== 3) z.set(x.get()) }) @@ -181,15 +181,15 @@ test("allow state changes in autorun", function() { checkGlobalState() }) -test("deny array change in view", function(done) { +test("deny array change in view", function (done) { const x = observable.box(3) const z = observable([]) - const y = computed(function() { + const y = computed(function () { z.push(3) return x.get() * x.get() }) - expect(function() { + expect(function () { y.get() // modifying z is allowed if nobody is observing }).not.toThrow() m.reaction( @@ -198,7 +198,7 @@ test("deny array change in view", function(done) { ) expect( - utils.grabConsole(function() { + utils.grabConsole(function () { y.get() }) ).toMatchInlineSnapshot( @@ -212,10 +212,10 @@ test("deny array change in view", function(done) { done() }) -test("allow array change in autorun", function() { +test("allow array change in autorun", function () { const x = observable.box(3) const z = observable([]) - m.autorun(function() { + m.autorun(function () { if (x.get() > 4) z.push(x.get()) }) @@ -229,9 +229,9 @@ test("allow array change in autorun", function() { checkGlobalState() }) -test("throw error if modification loop", function() { +test("throw error if modification loop", function () { const x = observable.box(3) - m.autorun(function() { + m.autorun(function () { x.set(x.get() + 1) // is allowed to throw, but doesn't as the observables aren't bound yet during first execution }) utils.consoleError(() => { @@ -240,8 +240,8 @@ test("throw error if modification loop", function() { checkGlobalState() }) -test("cycle1", function() { - const p = computed(function() { +test("cycle1", function () { + const p = computed(function () { return p.get() * 2 }) // thats a cycle! utils.consoleError(() => { @@ -250,11 +250,11 @@ test("cycle1", function() { checkGlobalState() }) -test("cycle2", function() { - const a = computed(function() { +test("cycle2", function () { + const a = computed(function () { return b.get() * 2 }) - const b = computed(function() { + const b = computed(function () { return a.get() * 2 }) expect(() => { @@ -263,8 +263,8 @@ test("cycle2", function() { checkGlobalState() }) -test("cycle3", function() { - const p = computed(function() { +test("cycle3", function () { + const p = computed(function () { return p.get() * 2 }) expect(() => { @@ -273,12 +273,12 @@ test("cycle3", function() { checkGlobalState() }) -test("cycle4", function() { +test("cycle4", function () { const z = observable.box(true) - const a = computed(function() { + const a = computed(function () { return z.get() ? 1 : b.get() * 2 }) - const b = computed(function() { + const b = computed(function () { return a.get() * 2 }) @@ -311,7 +311,7 @@ test("throws when the max iterations over reactions are done", () => { mobx._resetGlobalState() }) -test("issue 86, converging cycles", function() { +test("issue 86, converging cycles", function () { function findIndex(arr, predicate) { for (let i = 0, l = arr.length; i < l; i++) if (predicate(arr[i]) === true) return i return -1 @@ -341,7 +341,7 @@ test("issue 86, converging cycles", function() { checkGlobalState() }) -test("slow converging cycle", function() { +test("slow converging cycle", function () { const x = mobx.observable.box(1) let res = -1 mobx.autorun(() => { @@ -364,7 +364,7 @@ test("slow converging cycle", function() { checkGlobalState() }) -test("error handling assistence ", function(done) { +test("error handling assistence ", function (done) { const baseError = console.error const baseWarn = console.warn const errors = [] // logged errors @@ -372,20 +372,20 @@ test("error handling assistence ", function(done) { const values = [] // produced errors const thrown = [] // list of actually thrown exceptons - console.error = function(msg) { + console.error = function (msg) { errors.push(msg) } - console.warn = function(msg) { + console.warn = function (msg) { warns.push(msg) } const a = observable.box(3) - const b = computed(function() { + const b = computed(function () { if (a.get() === 42) throw "should not be 42" return a.get() * 2 }) - m.autorun(function() { + m.autorun(function () { values.push(b.get()) }) @@ -398,7 +398,7 @@ test("error handling assistence ", function(done) { a.set(7) // Test recovery - setTimeout(function() { + setTimeout(function () { a.set(4) try { a.set(42) @@ -420,7 +420,7 @@ test("error handling assistence ", function(done) { }) test("236 - cycles", () => { - const Parent = function() { + const Parent = function () { m.extendObservable(this, { children: [], get total0() { @@ -440,7 +440,7 @@ test("236 - cycles", () => { }) } - const Child = function(parent, kind) { + const Child = function (parent, kind) { this.parent = parent m.extendObservable(this, { kind: kind, @@ -667,7 +667,7 @@ test("it should be possible to handle exceptions in reaction", () => { const errors = [] const a = mobx.observable.box(1) const d = mobx.autorun( - function() { + function () { throw a.get() }, { @@ -693,7 +693,7 @@ test("it should be possible to handle global errors in reactions", () => { const errors = [] const d2 = mobx.onReactionError(e => errors.push(e)) - const d = mobx.autorun(function() { + const d = mobx.autorun(function () { throw a.get() }) @@ -743,7 +743,7 @@ test("global error handling will be skipped when using disableErrorBoundaries - mobx.observable.box(1) expect(() => { - mobx.autorun(function() { + mobx.autorun(function () { throw "OOPS" }) }).toThrowError(/OOPS/) diff --git a/test/v5/base/extendObservable.js b/test/v5/base/extendObservable.js index dbdc637cf..152f5d702 100644 --- a/test/v5/base/extendObservable.js +++ b/test/v5/base/extendObservable.js @@ -10,13 +10,13 @@ import { extendObservable } from "../../../src/mobx" -test("extendObservable should work", function() { +test("extendObservable should work", function () { class Box { // @ts-ignore uninitialized height = 20 sizes = [2] - someFunc = function() { + someFunc = function () { return 2 } get width() { @@ -66,13 +66,13 @@ test("extendObservable should work", function() { expect(ar.slice()).toEqual([40]) }) -test("extendObservable should work with plain object", function() { +test("extendObservable should work with plain object", function () { const box = { /** @type {boolean | undefined} */ uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -119,13 +119,13 @@ test("extendObservable should work with plain object", function() { expect(ar.slice()).toEqual([40]) }) -test("extendObservable should apply specified decorators", function() { +test("extendObservable should apply specified decorators", function () { const box = { /** @type {boolean | undefined} */ uninitialized: undefined, height: 20, sizes: [2], - someFunc: function() { + someFunc: function () { return 2 }, get width() { @@ -149,7 +149,7 @@ test("extendObservable should apply specified decorators", function() { extendObservable( box, { - someFunc: function() { + someFunc: function () { return 2 } }, diff --git a/test/v5/base/extras.js b/test/v5/base/extras.js index 392e9d6ad..e726f7246 100644 --- a/test/v5/base/extras.js +++ b/test/v5/base/extras.js @@ -3,7 +3,7 @@ const m = mobx const { $mobx } = mobx -test("treeD", function() { +test("treeD", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const a = m.observable.box(3) @@ -55,7 +55,7 @@ test("treeD", function() { }) const x = mobx.observable.map({ temperature: 0 }) - const d = mobx.autorun(function() { + const d = mobx.autorun(function () { Array.from(x.keys()) if (x.has("temperature")) x.get("temperature") x.has("absent") @@ -80,7 +80,7 @@ test("treeD", function() { }) }) -test("names", function() { +test("names", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 @@ -110,12 +110,12 @@ test("names", function() { expect(rstruct.y.a[$mobx].values_.get("b").name_).toBe("ObservableObject@1.y.a.b") expect(rstruct.ar[2][$mobx].values_.get("b").name_).toBe("ObservableObject@1.ar[..].b") - const d = m.autorun(function() {}) + const d = m.autorun(function () {}) expect(d[$mobx].name_).toBeTruthy() expect(m.autorun(function namedFunction() {})[$mobx].name_).toBe("namedFunction") - expect(m.computed(function() {})).toBeTruthy() + expect(m.computed(function () {})).toBeTruthy() expect(m.computed(function namedFunction() {}).name_).toBe("namedFunction") @@ -131,7 +131,7 @@ test("names", function() { }) function stripTrackerOutput(output) { - return output.map(function(i) { + return output.map(function (i) { if (Array.isArray(i)) return stripTrackerOutput(i) delete i.object delete i.time @@ -140,18 +140,18 @@ function stripTrackerOutput(output) { }) } -test("spy 1", function() { +test("spy 1", function () { m._resetGlobalState() const lines = [] const a = m.observable.box(3) - const b = m.computed(function() { + const b = m.computed(function () { return a.get() * 2 }) - m.autorun(function() { + m.autorun(function () { b.get() }) - const stop = m.spy(function(line) { + const stop = m.spy(function (line) { lines.push(line) }) @@ -161,7 +161,7 @@ test("spy 1", function() { expect(stripTrackerOutput(lines)).toMatchSnapshot() }) -test("get atom", function() { +test("get atom", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? @@ -214,7 +214,7 @@ test("get atom", function() { f() }) -test("get debug name", function() { +test("get debug name", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? @@ -262,7 +262,7 @@ test("get debug name", function() { f() }) -test("get administration", function() { +test("get administration", function () { mobx._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? diff --git a/test/v5/base/flow.js b/test/v5/base/flow.js index 1c3eb4012..d7d1549b8 100644 --- a/test/v5/base/flow.js +++ b/test/v5/base/flow.js @@ -25,7 +25,7 @@ test("it should support async generator actions", done => { { fireImmediately: true } ) - const f = mobx.flow(function*(initial) { + const f = mobx.flow(function* (initial) { x.a = initial // this runs in action x.a = yield delay(100, 3) // and this as well! yield delay(100, 0) @@ -53,7 +53,7 @@ test("it should support try catch in async generator", done => { { fireImmediately: true } ) - const f = mobx.flow(function*(initial) { + const f = mobx.flow(function* (initial) { x.a = initial // this runs in action try { x.a = yield delay(100, 5, true) // and this as well! @@ -76,7 +76,7 @@ test("it should support try catch in async generator", done => { }) test("it should support throw from async generator", done => { - mobx.flow(function*() { + mobx.flow(function* () { yield "a" throw 7 })().then( @@ -91,7 +91,7 @@ test("it should support throw from async generator", done => { }) test("it should support throw from yielded promise generator", done => { - mobx.flow(function*() { + mobx.flow(function* () { return yield delay(10, 7, true) })().then( () => { @@ -112,7 +112,7 @@ test("it should support asyncAction in classes", done => { class X { a = 1 - f = mobx.flow(function*(initial) { + f = mobx.flow(function* (initial) { this.a = initial // this runs in action try { this.a = yield delay(100, 5, true) // and this as well! @@ -180,7 +180,7 @@ function stripEvents(events) { } test("flows are cancelled with an instance of FlowCancellationError", async () => { - const start = flow(function*() { + const start = flow(function* () { yield Promise.resolve() }) @@ -204,7 +204,7 @@ test("isFlowCancellationError returns true iff the argument is a FlowCancellatio test("flows can be cancelled - 1 - uncaught cancellation", done => { let steps = 0 - const start = flow(function*() { + const start = flow(function* () { steps = 1 yield Promise.resolve() steps = 2 @@ -227,7 +227,7 @@ test("flows can be cancelled - 1 - uncaught cancellation", done => { test("flows can be cancelled - 2 - finally clauses are run", done => { let steps = 0 let finallyHandled = false - const start = flow(function*() { + const start = flow(function* () { steps = 1 try { yield Promise.resolve() @@ -259,7 +259,7 @@ test("flows can be cancelled - 3 - throw in finally should be caught", done => { ) mobx.configure({ enforceActions: "observed" }) - const start = flow(function*() { + const start = flow(function* () { counter.counter = 1 try { yield Promise.resolve() @@ -287,7 +287,7 @@ test("flows can be cancelled - 3 - throw in finally should be caught", done => { test("flows can be cancelled - 4 - pending Promise will be ignored", done => { let steps = 0 - const start = flow(function*() { + const start = flow(function* () { steps = 1 yield Promise.reject("This won't be caught anywhere!") // cancel will resolve this flow before this one is throw, so this promise goes uncaught steps = 2 @@ -307,7 +307,7 @@ test("flows can be cancelled - 4 - pending Promise will be ignored", done => { test("flows can be cancelled - 5 - return before cancel", done => { // eslint-disable-next-line require-yield - const start = flow(function*() { + const start = flow(function* () { return Promise.resolve(2) // cancel will be to late.. }) @@ -328,7 +328,7 @@ test("flows can be cancelled - 5 - flows cancel recursively", done => { let flow2cancelled = false let stepsReached = 0 - const flow1 = flow(function*() { + const flow1 = flow(function* () { try { yield Promise.resolve() stepsReached++ @@ -337,7 +337,7 @@ test("flows can be cancelled - 5 - flows cancel recursively", done => { } }) - const flow2 = flow(function*() { + const flow2 = flow(function* () { try { yield flow1() stepsReached++ @@ -361,7 +361,7 @@ test("flows can be cancelled - 5 - flows cancel recursively", done => { }) test("flows yield anything", async () => { - const start = flow(function*() { + const start = flow(function* () { const x = yield 2 return x }) @@ -371,7 +371,7 @@ test("flows yield anything", async () => { }) test("cancelled flow should not result in runaway reject", async () => { - const start = flow(function*() { + const start = flow(function* () { try { const x = yield 2 return x diff --git a/test/v5/base/makereactive.js b/test/v5/base/makereactive.js index 853b0a120..7bb41925a 100644 --- a/test/v5/base/makereactive.js +++ b/test/v5/base/makereactive.js @@ -5,16 +5,16 @@ const { makeObservable } = mobx function buffer() { const b = [] - const res = function(x) { + const res = function (x) { b.push(x) } - res.toArray = function() { + res.toArray = function () { return b } return res } -test("isObservable", function() { +test("isObservable", function () { function Order() {} function ReactiveOrder(price) { @@ -27,12 +27,12 @@ test("isObservable", function() { expect(m.isObservable(m.observable([]))).toBe(true) expect(m.isObservable(m.observable({}))).toBe(true) - expect(m.isObservable(m.observable.box(function() {}))).toBe(true) - expect(m.isObservable(m.computed(function() {}))).toBe(true) + expect(m.isObservable(m.observable.box(function () {}))).toBe(true) + expect(m.isObservable(m.computed(function () {}))).toBe(true) expect(m.isObservable([])).toBe(false) expect(m.isObservable({})).toBe(false) - expect(m.isObservable(function() {})).toBe(false) + expect(m.isObservable(function () {})).toBe(false) expect(m.isObservable(new Order())).toBe(false) expect(m.isObservable(m.observable.box(new Order()))).toBe(true) @@ -43,8 +43,8 @@ test("isObservable", function() { const obj = {} expect(m.isObservable(obj)).toBe(false) - expect(m.isObservable(m.observable.box(function() {}))).toBe(true) - expect(m.isObservable(m.autorun(function() {}))).toBe(true) + expect(m.isObservable(m.observable.box(function () {}))).toBe(true) + expect(m.isObservable(m.autorun(function () {}))).toBe(true) expect(m.isObservableProp(m.observable({ a: 1 }), "a")).toBe(true) expect(m.isObservableProp(m.observable({ a: 1 }), "b")).toBe(false) @@ -59,7 +59,7 @@ test("isObservable", function() { expect(m.isObservableProp(obs, "a")).toBe(true) }) -test("isBoxedObservable", function() { +test("isBoxedObservable", function () { expect(m.isBoxedObservable(m.observable({}))).toBe(false) expect(m.isBoxedObservable(m.computed(() => 3))).toBe(false) expect(m.isBoxedObservable(m.observable.box(3))).toBe(true) @@ -68,7 +68,7 @@ test("isBoxedObservable", function() { expect(m.isBoxedObservable(m.observable.box({}, { deep: false }))).toBe(true) }) -test("observable1", function() { +test("observable1", function () { m._resetGlobalState() // recursive structure @@ -80,7 +80,7 @@ test("observable1", function() { } }) const b = buffer() - m.autorun(function() { + m.autorun(function () { b(x.a.b.c) }) x.a = { b: { c: 4 } } @@ -107,7 +107,7 @@ test("observable1", function() { expect(m.isObservable(x2.a.b)).toBe(false) const b2 = buffer() - m.autorun(function() { + m.autorun(function () { b2(x2.a.b.c) }) x2.a = { b: { c: 4 } } @@ -127,7 +127,7 @@ test("observable1", function() { { deep: false } ) const b3 = buffer() - m.autorun(function() { + m.autorun(function () { b3(x3.a.b.c) }) x3.a = { b: { c: 4 } } @@ -135,7 +135,7 @@ test("observable1", function() { expect(b3.toArray()).toEqual([3, 4]) }) -test("observable3", function() { +test("observable3", function () { function Order(price) { this.price = price } @@ -145,7 +145,7 @@ test("observable3", function() { }) const b = buffer() - m.autorun(function() { + m.autorun(function () { b(x.orders.length) }) @@ -158,13 +158,13 @@ test("observable3", function() { expect(b.toArray()).toEqual([2, 3, 0, 1]) }) -test("observable4", function() { +test("observable4", function () { const x = m.observable([{ x: 1 }, { x: 2 }]) const b = buffer() m.observe( - m.computed(function() { - return x.map(function(d) { + m.computed(function () { + return x.map(function (d) { return d.x }) }), @@ -182,8 +182,8 @@ test("observable4", function() { const b2 = buffer() m.observe( - m.computed(function() { - return x2.map(function(d) { + m.computed(function () { + return x2.map(function (d) { return d.x }) }), @@ -197,18 +197,18 @@ test("observable4", function() { expect(b2.toArray()).toEqual([[1, 2], [2], [2, 5]]) }) -test("observable5", function() { - let x = m.computed(function() {}) - expect(function() { +test("observable5", function () { + let x = m.computed(function () {}) + expect(function () { x.set(7) // set not allowed }).toThrow(/It is not possible to assign a new value to a computed value/) - let f = function() {} + let f = function () {} const x2 = m.observable.box(f) expect(x2.get()).toBe(f) x2.set(null) // allowed - f = function() { + f = function () { return this.price } x = m.observable( @@ -225,12 +225,12 @@ test("observable5", function() { ) const b = buffer() - m.autorun(function() { + m.autorun(function () { b([x.reactive, x.nonReactive, x.nonReactive()]) }) x.price = 18 - const three = function() { + const three = function () { return 3 } x.nonReactive = three @@ -241,7 +241,7 @@ test("observable5", function() { ]) }) -test("flat array", function() { +test("flat array", function () { const x = m.observable.object( { x: [ @@ -255,7 +255,7 @@ test("flat array", function() { let result let updates = 0 - m.autorun(function() { + m.autorun(function () { updates++ result = JSON.stringify(mobx.toJS(x)) }) @@ -280,7 +280,7 @@ test("flat array", function() { expect(updates).toBe(3) }) -test("flat object", function() { +test("flat object", function () { const y = m.observable.object( { x: { z: 3 } @@ -291,7 +291,7 @@ test("flat object", function() { let result let updates = 0 - m.autorun(function() { + m.autorun(function () { updates++ result = JSON.stringify(mobx.toJS(y)) }) @@ -312,7 +312,7 @@ test("flat object", function() { expect(updates).toBe(2) }) -test("as structure", function() { +test("as structure", function () { const x = m.observable.object( { x: null @@ -323,7 +323,7 @@ test("as structure", function() { ) let changed = 0 - const dis = m.autorun(function() { + const dis = m.autorun(function () { changed++ JSON.stringify(x) }) @@ -408,7 +408,7 @@ test("as structure", function() { dis() }) -test("as structure view", function() { +test("as structure view", function () { const x = m.observable.object( { a: 1, @@ -428,14 +428,14 @@ test("as structure view", function() { ) let bc = 0 - m.autorun(function() { + m.autorun(function () { x.b bc++ }) expect(bc).toBe(1) let cc = 0 - m.autorun(function() { + m.autorun(function () { x.c cc++ }) @@ -455,7 +455,7 @@ test("as structure view", function() { // will break the invariants of proxies (when trying to determine keys) // which is not unfixiable in itself, // but definitely a pattern we don't want to encourage -test("ES5 non reactive props", function() { +test("ES5 non reactive props", function () { let te = m.observable({}) Object.defineProperty(te, "nonConfigurable", { enumerable: true, @@ -464,7 +464,7 @@ test("ES5 non reactive props", function() { value: "static" }) // should throw if trying to reconfigure an existing non-configurable prop - expect(function() { + expect(function () { m.extendObservable(te2, { notConfigurable: 1 }) }).toThrow(/'extendObservable' expects an object as first argument/) // should skip non-configurable / writable props when using `observable` @@ -484,7 +484,7 @@ test("ES5 non reactive props", function() { value: "static" }) // should throw if trying to reconfigure an existing non-writable prop - expect(function() { + expect(function () { m.set(te2, { notWritable: 1 }) }).toThrow(/Cannot make property 'notWritable' observable/) const d2 = Object.getOwnPropertyDescriptor(te2, "notWritable") @@ -494,7 +494,7 @@ test("ES5 non reactive props", function() { expect(m.extendObservable(te, { bla: 3 }).bla).toBe(3) }) -test("ES5 non reactive props - 2", function() { +test("ES5 non reactive props - 2", function () { const te = {} Object.defineProperty(te, "nonConfigurable", { enumerable: true, @@ -508,7 +508,7 @@ test("ES5 non reactive props - 2", function() { }).toThrow(/Cannot make property 'nonConfigurable' observable/) }) -test("540 - extendobservable should not report cycles", function() { +test("540 - extendobservable should not report cycles", function () { expect(() => m.extendObservable(Object.freeze({}), {})).toThrowError( /Cannot make the designated object observable/ ) diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 0cbdb32a9..696d4b6ba 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -7,12 +7,12 @@ const iterall = require("iterall") const { makeObservable } = mobx import { grabConsole } from "../../v5/utils/test-utils" -test("map crud", function() { +test("map crud", function () { mobx._getGlobalState().mobxGuid = 0 // hmm dangerous reset? const events = [] const m = map({ "1": "a" }) - mobx.observe(m, function(changes) { + mobx.observe(m, function (changes) { events.push(changes) }) @@ -87,7 +87,7 @@ test("map crud", function() { expect(JSON.stringify(m)).toBe("[]") }) -test("map merge", function() { +test("map merge", function () { const a = map({ a: 1, b: 2, c: 2 }) const b = map({ c: 3, d: 4 }) a.merge(b) @@ -99,21 +99,21 @@ test("map merge", function() { ]) }) -test("observe value", function() { +test("observe value", function () { const a = map() let hasX = false let valueX = undefined let valueY = undefined - autorun(function() { + autorun(function () { hasX = a.has("x") }) - autorun(function() { + autorun(function () { valueX = a.get("x") }) - autorun(function() { + autorun(function () { valueY = a.get("y") }) @@ -147,7 +147,7 @@ test("observe value", function() { expect(mobx.keys(a)).toEqual(["y", "z"]) }) -test("initialize with entries", function() { +test("initialize with entries", function () { const thing = [{ x: 3 }] const a = map([ ["a", 1], @@ -159,7 +159,7 @@ test("initialize with entries", function() { ]) }) -test("initialize with empty value", function() { +test("initialize with empty value", function () { const a = map() const b = map({}) const c = map([]) @@ -173,17 +173,17 @@ test("initialize with empty value", function() { expect(c.toJSON()).toEqual([["0", 0]]) }) -test("observe collections", function() { +test("observe collections", function () { const x = map() let keys, values, entries - autorun(function() { + autorun(function () { keys = mobx.keys(x) }) - autorun(function() { + autorun(function () { values = iteratorToArray(x.values()) }) - autorun(function() { + autorun(function () { entries = iteratorToArray(x.entries()) }) @@ -227,11 +227,11 @@ test("observe collections", function() { expect(entries).toEqual([["b", 3]]) }) -test("cleanup", function() { +test("cleanup", function () { const x = map({ a: 1 }) let aValue - const disposer = autorun(function() { + const disposer = autorun(function () { aValue = x.get("a") }) @@ -261,10 +261,10 @@ test("cleanup", function() { expect(x.hasMap_.has("a")).toBe(false) }) -test("getAtom encapsulation leak test", function() { +test("getAtom encapsulation leak test", function () { const x = map({}) - let disposer = autorun(function() { + let disposer = autorun(function () { x.has("a") }) @@ -274,7 +274,7 @@ test("getAtom encapsulation leak test", function() { expect(x.hasMap_.get("a")).toBe(undefined) - disposer = autorun(function() { + disposer = autorun(function () { x.has("a") atom && atom.reportObserved() }) @@ -282,14 +282,14 @@ test("getAtom encapsulation leak test", function() { expect(x.hasMap_.get("a")).not.toBe(atom) }) -test("strict", function() { +test("strict", function () { const x = map() - autorun(function() { + autorun(function () { x.get("y") // should not throw }) }) -test("issue 100", function() { +test("issue 100", function () { const that = {} mobx.extendObservable(that, { myMap: map() @@ -297,7 +297,7 @@ test("issue 100", function() { expect(mobx.isObservableMap(that.myMap)).toBe(true) }) -test("issue 119 - unobserve before delete", function() { +test("issue 119 - unobserve before delete", function () { const propValues = [] const myObservable = mobx.observable({ myMap: map() @@ -311,8 +311,8 @@ test("issue 119 - unobserve before delete", function() { } }) // the error only happens if the value is observed - mobx.autorun(function() { - mobx.values(myObservable.myMap).forEach(function(value) { + mobx.autorun(function () { + mobx.values(myObservable.myMap).forEach(function (value) { propValues.push(value.myCalculatedProp) }) }) @@ -321,7 +321,7 @@ test("issue 119 - unobserve before delete", function() { expect(propValues).toEqual(["myPropValue calculated"]) }) -test("issue 116 - has should not throw on invalid keys", function() { +test("issue 116 - has should not throw on invalid keys", function () { const x = map() expect(x.has(undefined)).toBe(false) expect(x.has({})).toBe(false) @@ -510,22 +510,22 @@ test("798, cannot return observable map from computed prop", () => { // MWE: this is an anti pattern, yet should be possible in certain cases nonetheless..? // https://jsfiddle.net/7e6Ltscr/ - const form = function() { + const form = function () { const form = mobx.observable({ reactPropsMap: mobx.observable.map({ - onSubmit: function() {} + onSubmit: function () {} }), model: { value: "TEST" } }) - form.reactPropsMap.set("onSubmit", function() {}) + form.reactPropsMap.set("onSubmit", function () {}) return form } - const customerSearchStore = function() { + const customerSearchStore = function () { const customerSearchStore = mobx.observable({ customerType: "RUBY", searchTypeFormStore() { @@ -570,7 +570,7 @@ test("using deep map", () => { // Creating autorun triggers one observation, hence -1 let observed = -1 - mobx.autorun(function() { + mobx.autorun(function () { // Use the map, to observe all changes seen.push(store.map_deep.toJSON()) // JSON.stringify(store.map_deep) @@ -605,7 +605,7 @@ test("using deep map - toJS", () => { // Creating autorun triggers one observation, hence -1 let observed = -1 - mobx.autorun(function() { + mobx.autorun(function () { // Use the map, to observe all changes seen.push(mobx.toJS(store.map_deep)) // JSON.stringify(store.map_deep) @@ -883,7 +883,7 @@ test("can iterate map - values", () => { d() }) -test("NaN as map key", function() { +test("NaN as map key", function () { const a = map(new Map([[NaN, 0]])) expect(a.has(NaN)).toBe(true) expect(a.get(NaN)).toBe(0) diff --git a/test/v5/base/observables.js b/test/v5/base/observables.js index 8cd3d63f6..ecfe9dedb 100644 --- a/test/v5/base/observables.js +++ b/test/v5/base/observables.js @@ -5,11 +5,11 @@ const m = mobx const { $mobx, observable, computed, transaction, autorun, extendObservable, makeObservable } = mobx const utils = require("../../v5/utils/test-utils") -const voidObserver = function() {} +const voidObserver = function () {} function buffer() { const b = [] - const res = function(x) { + const res = function (x) { if (typeof x.newValue === "object") { const copy = { ...x.newValue } delete copy[$mobx] @@ -18,7 +18,7 @@ function buffer() { b.push(x.newValue) } } - res.toArray = function() { + res.toArray = function () { return b } return res @@ -31,7 +31,7 @@ test("argumentless observable", () => { expect(a.get()).toBe(undefined) }) -test("basic", function() { +test("basic", function () { const x = observable.box(3) const b = buffer() m.observe(x, b) @@ -43,12 +43,12 @@ test("basic", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("basic2", function() { +test("basic2", function () { const x = observable.box(3) - const z = computed(function() { + const z = computed(function () { return x.get() * 2 }) - const y = computed(function() { + const y = computed(function () { return x.get() * 3 }) @@ -64,11 +64,11 @@ test("basic2", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("computed with asStructure modifier", function() { +test("computed with asStructure modifier", function () { const x1 = observable.box(3) const x2 = observable.box(5) const y = m.computed( - function() { + function () { return { sum: x1.get() + x2.get() } @@ -83,7 +83,7 @@ test("computed with asStructure modifier", function() { x1.set(4) expect(9).toBe(y.get().sum) - m.transaction(function() { + m.transaction(function () { // swap values, computation results is structuraly unchanged x1.set(5) x2.set(4) @@ -93,10 +93,10 @@ test("computed with asStructure modifier", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("dynamic", function(done) { +test("dynamic", function (done) { try { const x = observable.box(3) - const y = m.computed(function() { + const y = m.computed(function () { return x.get() }) const b = buffer() @@ -116,10 +116,10 @@ test("dynamic", function(done) { } }) -test("dynamic2", function(done) { +test("dynamic2", function (done) { try { const x = observable.box(3) - const y = computed(function() { + const y = computed(function () { return x.get() * x.get() }) @@ -140,7 +140,7 @@ test("dynamic2", function(done) { } }) -test("box uses equals", function(done) { +test("box uses equals", function (done) { try { const x = observable.box("a", { equals: (oldValue, newValue) => { @@ -165,7 +165,7 @@ test("box uses equals", function(done) { } }) -test("box uses equals2", function(done) { +test("box uses equals2", function (done) { try { const x = observable.box("01", { equals: (oldValue, newValue) => { @@ -173,7 +173,7 @@ test("box uses equals2", function(done) { } }) - const y = computed(function() { + const y = computed(function () { return parseInt(x) }) @@ -194,7 +194,7 @@ test("box uses equals2", function(done) { } }) -test("readme1", function(done) { +test("readme1", function (done) { try { const b = buffer() @@ -203,7 +203,7 @@ test("readme1", function(done) { order.price = observable.box(10) // Prints: New price: 24 // in TS, just: value(() => this.price() * (1+vat())) - order.priceWithVat = computed(function() { + order.priceWithVat = computed(function () { return order.price.get() * (1 + vat.get()) }) @@ -222,13 +222,13 @@ test("readme1", function(done) { } }) -test("batch", function() { +test("batch", function () { const a = observable.box(2) const b = observable.box(3) - const c = computed(function() { + const c = computed(function () { return a.get() * b.get() }) - const d = computed(function() { + const d = computed(function () { return c.get() * b.get() }) const buf = buffer() @@ -239,7 +239,7 @@ test("batch", function() { // Note, 60 should not happen! (that is d begin computed before c after update of b) expect(buf.toArray()).toEqual([36, 100]) - const x = mobx.transaction(function() { + const x = mobx.transaction(function () { a.set(2) b.set(3) a.set(6) @@ -252,16 +252,16 @@ test("batch", function() { expect(buf.toArray()).toEqual([36, 100, 54]) // only one new value for d }) -test("transaction with inspection", function() { +test("transaction with inspection", function () { const a = observable.box(2) let calcs = 0 - const b = computed(function() { + const b = computed(function () { calcs++ return a.get() * 2 }) // if not inspected during transaction, postpone value to end - mobx.transaction(function() { + mobx.transaction(function () { a.set(3) expect(b.get()).toBe(6) expect(calcs).toBe(1) @@ -270,7 +270,7 @@ test("transaction with inspection", function() { expect(calcs).toBe(2) // if inspected, evaluate eagerly - mobx.transaction(function() { + mobx.transaction(function () { a.set(4) expect(b.get()).toBe(8) expect(calcs).toBe(3) @@ -279,17 +279,17 @@ test("transaction with inspection", function() { expect(calcs).toBe(4) }) -test("transaction with inspection 2", function() { +test("transaction with inspection 2", function () { const a = observable.box(2) let calcs = 0 let b - mobx.autorun(function() { + mobx.autorun(function () { calcs++ b = a.get() * 2 }) // if not inspected during transaction, postpone value to end - mobx.transaction(function() { + mobx.transaction(function () { a.set(3) expect(b).toBe(4) expect(calcs).toBe(1) @@ -298,7 +298,7 @@ test("transaction with inspection 2", function() { expect(calcs).toBe(2) // if inspected, evaluate eagerly - mobx.transaction(function() { + mobx.transaction(function () { a.set(4) expect(b).toBe(6) expect(calcs).toBe(2) @@ -307,13 +307,13 @@ test("transaction with inspection 2", function() { expect(calcs).toBe(3) }) -test("scope", function() { +test("scope", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { this.price = observable.box(20) this.amount = observable.box(2) this.total = computed( - function() { + function () { return (1 + vat.get()) * this.price.get() * this.amount.get() }, { context: this } @@ -328,9 +328,9 @@ test("scope", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("props1", function() { +test("props1", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { mobx.extendObservable(this, { price: 20, amount: 2, @@ -347,7 +347,7 @@ test("props1", function() { expect(36).toBe(order.total) const totals = [] - const sub = mobx.autorun(function() { + const sub = mobx.autorun(function () { totals.push(order.total) }) order.amount = 4 @@ -358,9 +358,9 @@ test("props1", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("props2", function() { +test("props2", function () { const vat = observable.box(0.2) - const Order = function() { + const Order = function () { mobx.extendObservable(this, { price: 20, amount: 2, @@ -377,12 +377,12 @@ test("props2", function() { expect(36).toBe(order.total) }) -test("props4", function() { +test("props4", function () { function Bzz() { mobx.extendObservable(this, { fluff: [1, 2], get sum() { - return this.fluff.reduce(function(a, b) { + return this.fluff.reduce(function (a, b) { return a + b }, 0) } @@ -400,7 +400,7 @@ test("props4", function() { expect(x.sum).toBe(13) }) -test("extend observable multiple prop maps", function() { +test("extend observable multiple prop maps", function () { const x = { a: 1 } expect(() => { mobx.extendObservable( @@ -415,7 +415,7 @@ test("extend observable multiple prop maps", function() { }).toThrow(/invalid option for \(extend\)observable: c/) }) -test("object enumerable props", function() { +test("object enumerable props", function () { const x = mobx.observable({ a: 3, get b() { @@ -428,11 +428,11 @@ test("object enumerable props", function() { expect(ar).toEqual(["a", "c"]) }) -test("observe property", function() { +test("observe property", function () { const sb = [] const mb = [] - const Wrapper = function(chocolateBar) { + const Wrapper = function (chocolateBar) { mobx.extendObservable(this, { chocolateBar: chocolateBar, get calories() { @@ -451,10 +451,10 @@ test("observe property", function() { const wrappedSnickers = new Wrapper(snickers) const wrappedMars = new Wrapper(mars) - const disposeSnickers = mobx.autorun(function() { + const disposeSnickers = mobx.autorun(function () { sb.push(wrappedSnickers.calories) }) - const disposeMars = mobx.autorun(function() { + const disposeMars = mobx.autorun(function () { mb.push(wrappedMars.calories) }) snickers.calories = 10 @@ -469,7 +469,7 @@ test("observe property", function() { expect(mb).toEqual([undefined, 15]) }) -test("observe object", function() { +test("observe object", function () { let events = [] const a = observable({ a: 1, @@ -477,7 +477,7 @@ test("observe object", function() { return this.a * 2 } }) - const stop = m.observe(a, function(change) { + const stop = m.observe(a, function (change) { events.push(change) }) @@ -523,13 +523,13 @@ test("observe object", function() { expect(events.length).toBe(0) }) -test("mobx.observe", function() { +test("mobx.observe", function () { const events = [] const o = observable({ b: 2 }) const ar = observable([3]) const map = mobx.observable.map({}) - const push = function(event) { + const push = function (event) { events.push(event) } @@ -573,15 +573,15 @@ test("mobx.observe", function() { ]) }) -test("change count optimization", function() { +test("change count optimization", function () { let bCalcs = 0 let cCalcs = 0 const a = observable.box(3) - const b = computed(function() { + const b = computed(function () { bCalcs += 1 return 4 + a.get() - a.get() }) - const c = computed(function() { + const c = computed(function () { cCalcs += 1 return b.get() }) @@ -603,11 +603,11 @@ test("change count optimization", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("observables removed", function() { +test("observables removed", function () { let calcs = 0 const a = observable.box(1) const b = observable.box(2) - const c = computed(function() { + const c = computed(function () { calcs++ if (a.get() === 1) return b.get() * a.get() * b.get() return 3 @@ -632,19 +632,19 @@ test("observables removed", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("lazy evaluation", function() { +test("lazy evaluation", function () { let bCalcs = 0 let cCalcs = 0 let dCalcs = 0 let observerChanges = 0 const a = observable.box(1) - const b = computed(function() { + const b = computed(function () { bCalcs += 1 return a.get() + 1 }) - const c = computed(function() { + const c = computed(function () { cCalcs += 1 return b.get() + 1 }) @@ -667,14 +667,14 @@ test("lazy evaluation", function() { expect(bCalcs).toBe(3) expect(cCalcs).toBe(3) - const d = computed(function() { + const d = computed(function () { dCalcs += 1 return b.get() * 2 }) const handle = m.observe( d, - function() { + function () { observerChanges += 1 }, false @@ -710,16 +710,16 @@ test("lazy evaluation", function() { expect(mobx._isComputingDerivation()).toBe(false) }) -test("multiple view dependencies", function() { +test("multiple view dependencies", function () { let bCalcs = 0 let dCalcs = 0 const a = observable.box(1) - const b = computed(function() { + const b = computed(function () { bCalcs++ return 2 * a.get() }) const c = observable.box(2) - const d = computed(function() { + const d = computed(function () { dCalcs++ return 3 * c.get() }) @@ -727,7 +727,7 @@ test("multiple view dependencies", function() { let zwitch = true const buffer = [] let fCalcs = 0 - const dis = mobx.autorun(function() { + const dis = mobx.autorun(function () { fCalcs++ if (zwitch) buffer.push(b.get() + d.get()) else buffer.push(d.get() + b.get()) @@ -754,17 +754,17 @@ test("multiple view dependencies", function() { expect(buffer).toEqual([8, 11, 14]) }) -test("nested observable2", function() { +test("nested observable2", function () { const factor = observable.box(0) const price = observable.box(100) let totalCalcs = 0 let innerCalcs = 0 - const total = computed(function() { + const total = computed(function () { totalCalcs += 1 // outer observable shouldn't recalc if inner observable didn't publish a real change return ( price.get() * - computed(function() { + computed(function () { innerCalcs += 1 return factor.get() % 2 === 0 ? 1 : 3 }).get() @@ -774,7 +774,7 @@ test("nested observable2", function() { const b = [] m.observe( total, - function(x) { + function (x) { b.push(x.newValue) }, true @@ -792,14 +792,14 @@ test("nested observable2", function() { expect(totalCalcs).toBe(5) }) -test("observe", function() { +test("observe", function () { const x = observable.box(3) - const x2 = computed(function() { + const x2 = computed(function () { return x.get() * 2 }) const b = [] - const cancel = mobx.autorun(function() { + const cancel = mobx.autorun(function () { b.push(x2.get()) }) @@ -811,15 +811,15 @@ test("observe", function() { expect(b).toEqual([6, 8, 10]) }) -test("when", function() { +test("when", function () { const x = observable.box(3) let called = 0 mobx.when( - function() { + function () { return x.get() === 4 }, - function() { + function () { called += 1 } ) @@ -834,15 +834,15 @@ test("when", function() { expect(called).toBe(1) }) -test("when 2", function() { +test("when 2", function () { const x = observable.box(3) let called = 0 const d = mobx.when( - function() { + function () { return x.get() === 3 }, - function() { + function () { called += 1 }, { name: "when x is 3" } @@ -866,7 +866,7 @@ function stripSpyOutput(events) { return events } -test("issue 50", function(done) { +test("issue 50", function (done) { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const x = observable({ @@ -885,12 +885,12 @@ test("issue 50", function(done) { result = [x.a, x.b, x.c].join(",") }) - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) - setTimeout(function() { - mobx.transaction(function() { + setTimeout(function () { + mobx.transaction(function () { events.push("transstart") x.a = !x.a x.b = !x.b @@ -908,7 +908,7 @@ test("issue 50", function(done) { }, 500) }) -test("verify transaction events", function() { +test("verify transaction events", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 @@ -926,11 +926,11 @@ test("verify transaction events", function() { x.c }) - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) - mobx.transaction(function() { + mobx.transaction(function () { events.push("transstart") x.b = 1 x.b = 2 @@ -944,18 +944,18 @@ test("verify transaction events", function() { disposer2() }) -test("verify array in transaction", function() { +test("verify array in transaction", function () { const ar = observable([]) let aCount = 0 let aValue - mobx.autorun(function() { + mobx.autorun(function () { aCount++ aValue = 0 for (let i = 0; i < ar.length; i++) aValue += ar[i] }) - mobx.transaction(function() { + mobx.transaction(function () { ar.push(2) ar.push(3) ar.push(4) @@ -965,7 +965,7 @@ test("verify array in transaction", function() { expect(aCount).toBe(2) }) -test("delay autorun until end of transaction", function() { +test("delay autorun until end of transaction", function () { m._resetGlobalState() mobx._getGlobalState().mobxGuid = 0 const events = [] @@ -977,13 +977,13 @@ test("delay autorun until end of transaction", function() { } }) let disposer1 - const disposer2 = mobx.spy(function(info) { + const disposer2 = mobx.spy(function (info) { events.push(info) }) let didRun = false - mobx.transaction(function() { - mobx.transaction(function() { + mobx.transaction(function () { + mobx.transaction(function () { disposer1 = mobx.autorun(function test() { didRun = true events.push("auto") @@ -1015,14 +1015,14 @@ test("delay autorun until end of transaction", function() { disposer2() }) -test("prematurely end autorun", function() { +test("prematurely end autorun", function () { const x = observable.box(2) let dis1, dis2 - mobx.transaction(function() { - dis1 = mobx.autorun(function() { + mobx.transaction(function () { + dis1 = mobx.autorun(function () { x.get() }) - dis2 = mobx.autorun(function() { + dis2 = mobx.autorun(function () { x.get() }) @@ -1043,10 +1043,10 @@ test("prematurely end autorun", function() { expect(dis2[$mobx].observing_.length).toBe(0) }) -test("computed values believe NaN === NaN", function() { +test("computed values believe NaN === NaN", function () { const a = observable.box(2) const b = observable.box(3) - const c = computed(function() { + const c = computed(function () { return String(a.get() * b.get()) }) const buf = buffer() @@ -1061,10 +1061,10 @@ test("computed values believe NaN === NaN", function() { expect(buf.toArray()).toEqual(["NaN", "6"]) }) -test("computed values believe deep NaN === deep NaN when using compareStructural", function() { +test("computed values believe deep NaN === deep NaN when using compareStructural", function () { const a = observable({ b: { a: 1 } }) const c = computed( - function() { + function () { return a.b }, { compareStructural: true } @@ -1088,7 +1088,7 @@ test("computed values believe deep NaN === deep NaN when using compareStructural expect(bufArray.length).toBe(3) }) -test("issue 71, transacting running transformation", function() { +test("issue 71, transacting running transformation", function () { const state = mobx.observable({ things: [] }) @@ -1116,18 +1116,18 @@ test("issue 71, transacting running transformation", function() { let copy let vSum - mobx.autorun(function() { - copy = state.things.map(function(thing) { + mobx.autorun(function () { + copy = state.things.map(function (thing) { return thing.value }) - vSum = state.things.reduce(function(a, thing) { + vSum = state.things.reduce(function (a, thing) { return a + thing.value }, 0) }) expect(copy).toEqual([]) - mobx.transaction(function() { + mobx.transaction(function () { state.things.push(new Thing(1)) }) @@ -1141,7 +1141,7 @@ test("issue 71, transacting running transformation", function() { expect(vSum).toBe(25) }) -test("eval in transaction", function() { +test("eval in transaction", function () { let bCalcs = 0 const x = mobx.observable({ a: 1, @@ -1152,14 +1152,14 @@ test("eval in transaction", function() { }) let c - mobx.autorun(function() { + mobx.autorun(function () { c = x.b }) expect(bCalcs).toBe(1) expect(c).toBe(2) - mobx.transaction(function() { + mobx.transaction(function () { x.a = 3 expect(x.b).toBe(6) expect(bCalcs).toBe(2) @@ -1174,15 +1174,15 @@ test("eval in transaction", function() { expect(c).toBe(8) }) -test("forcefully tracked reaction should still yield valid results", function() { +test("forcefully tracked reaction should still yield valid results", function () { const x = observable.box(3) let z let runCount = 0 - const identity = function() { + const identity = function () { runCount++ z = x.get() } - const a = new mobx.Reaction("test", function() { + const a = new mobx.Reaction("test", function () { this.track(identity) }) a.runReaction_() @@ -1190,7 +1190,7 @@ test("forcefully tracked reaction should still yield valid results", function() expect(z).toBe(3) expect(runCount).toBe(1) - transaction(function() { + transaction(function () { x.set(4) a.track(identity) expect(a.isScheduled()).toBe(true) @@ -1201,7 +1201,7 @@ test("forcefully tracked reaction should still yield valid results", function() expect(z).toBe(4) expect(runCount).toBe(2) // x is observed, so it should recompute only on dependency change - transaction(function() { + transaction(function () { x.set(5) expect(a.isScheduled()).toBe(true) a.track(identity) @@ -1218,17 +1218,17 @@ test("forcefully tracked reaction should still yield valid results", function() expect(runCount).toBe(4) }) -test("autoruns created in autoruns should kick off", function() { +test("autoruns created in autoruns should kick off", function () { const x = observable.box(3) const x2 = [] let d - const a = m.autorun(function() { + const a = m.autorun(function () { if (d) { // dispose previous autorun d() } - d = m.autorun(function() { + d = m.autorun(function () { x2.push(x.get() * 2) }) }) @@ -1517,7 +1517,7 @@ test("support computed property getters / setters", () => { d() }) -test("computed getter / setter for plan objects should succeed", function() { +test("computed getter / setter for plan objects should succeed", function () { const b = observable({ a: 3, get propX() { @@ -1529,7 +1529,7 @@ test("computed getter / setter for plan objects should succeed", function() { }) const values = [] - mobx.autorun(function() { + mobx.autorun(function () { return values.push(b.propX) }) expect(b.propX).toBe(6) @@ -1539,7 +1539,7 @@ test("computed getter / setter for plan objects should succeed", function() { expect(values).toEqual([6, 8]) }) -test("helpful error for self referencing setter", function() { +test("helpful error for self referencing setter", function () { const a = observable({ x: 1, get y() { @@ -1553,7 +1553,7 @@ test("helpful error for self referencing setter", function() { expect(() => (a.y = 2)).toThrowError(/The setter of computed value/) }) -test("#558 boxed observables stay boxed observables", function() { +test("#558 boxed observables stay boxed observables", function () { const a = observable({ x: observable.box(3) }) @@ -1562,11 +1562,11 @@ test("#558 boxed observables stay boxed observables", function() { expect(typeof a.x.get).toBe("function") }) -test("iscomputed", function() { +test("iscomputed", function () { expect(mobx.isComputed(observable.box(3))).toBe(false) expect( mobx.isComputed( - mobx.computed(function() { + mobx.computed(function () { return 3 }) ) @@ -1612,7 +1612,7 @@ test("603 - transaction should not kill reactions", () => { expect(b).toBe(3) }) -test("#561 test toPrimitive() of observable objects", function() { +test("#561 test toPrimitive() of observable objects", function () { if (typeof Symbol !== "undefined" && Symbol.toPrimitive) { let x = observable.box(3) diff --git a/test/v5/base/set.js b/test/v5/base/set.js index f999048e6..7bc98d47f 100644 --- a/test/v5/base/set.js +++ b/test/v5/base/set.js @@ -5,7 +5,7 @@ const set = mobx.observable.set const autorun = mobx.autorun const iterall = require("iterall") -test("set crud", function() { +test("set crud", function () { const events = [] const s = set([1]) @@ -75,15 +75,15 @@ test("set crud", function() { ]) }) -test("observe value", function() { +test("observe value", function () { const s = set() let hasX = false let hasY = false - autorun(function() { + autorun(function () { hasX = s.has("x") }) - autorun(function() { + autorun(function () { hasY = s.has("y") }) @@ -101,17 +101,17 @@ test("observe value", function() { expect(mobx.values(s)).toEqual(["y"]) }) -test("observe collections", function() { +test("observe collections", function () { const x = set() let keys, values, entries - autorun(function() { + autorun(function () { keys = mobx.keys(x) }) - autorun(function() { + autorun(function () { values = Array.from(x.values()) }) - autorun(function() { + autorun(function () { entries = Array.from(x.entries()) }) @@ -157,12 +157,12 @@ test("set modifier", () => { expect(mobx.isObservableSet(y.a)).toBe(true) }) -test("cleanup", function() { +test("cleanup", function () { const s = set(["a"]) let hasA - autorun(function() { + autorun(function () { hasA = s.has("a") }) diff --git a/test/v5/base/strict-mode.js b/test/v5/base/strict-mode.js index a8ed0a6f6..8472a3b68 100644 --- a/test/v5/base/strict-mode.js +++ b/test/v5/base/strict-mode.js @@ -151,7 +151,7 @@ test("can create objects in strict mode with action", () => { mobx.action(() => { mobx.observable({ a: 2, - b: function() { + b: function () { return this.a } }) @@ -170,21 +170,21 @@ test("can create objects in strict mode with action", () => { mobx.configure({ enforceActions: "never" }) }) -test("strict mode checks", function() { +test("strict mode checks", function () { const x = mobx.observable.box(3) const d = mobx.autorun(() => x.get()) - mobx._allowStateChanges(false, function() { + mobx._allowStateChanges(false, function () { x.get() }) - mobx._allowStateChanges(true, function() { + mobx._allowStateChanges(true, function () { x.set(7) }) expect( - utils.grabConsole(function() { - mobx._allowStateChanges(false, function() { + utils.grabConsole(function () { + mobx._allowStateChanges(false, function () { x.set(4) }) }) @@ -236,7 +236,7 @@ test("enforceActions 'strict' should not throw exception while observable array } }) -test("warn on unsafe reads of computed", function() { +test("warn on unsafe reads of computed", function () { try { mobx.configure({ computedRequiresReaction: true }) const x = mobx.observable({ @@ -253,8 +253,8 @@ test("warn on unsafe reads of computed", function() { } }) -describe("observableRequiresReaction", function() { - test("warn on unsafe reads of observable", function() { +describe("observableRequiresReaction", function () { + test("warn on unsafe reads of observable", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -268,7 +268,7 @@ describe("observableRequiresReaction", function() { } }) - test("warn on unsafe reads of observable also when there are other subscriptions", function() { + test("warn on unsafe reads of observable also when there are other subscriptions", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -287,7 +287,7 @@ describe("observableRequiresReaction", function() { } }) - test("warn on unsafe reads of observable array", function() { + test("warn on unsafe reads of observable array", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -300,7 +300,7 @@ describe("observableRequiresReaction", function() { mobx.configure({ observableRequiresReaction: false }) } }) - test("don't warn on reads inside a computed", function() { + test("don't warn on reads inside a computed", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -320,7 +320,7 @@ describe("observableRequiresReaction", function() { } }) - test("don't warn on autorun tracks invalidation of unbound dependencies", function() { + test("don't warn on autorun tracks invalidation of unbound dependencies", function () { // #2195 try { mobx.configure({ observableRequiresReaction: true }) @@ -344,7 +344,7 @@ describe("observableRequiresReaction", function() { } }) - test("don't warn on autorun tracks invalidation of unbound dependencies - also with action", function() { + test("don't warn on autorun tracks invalidation of unbound dependencies - also with action", function () { // #2195 try { mobx.configure({ observableRequiresReaction: true }) @@ -370,7 +370,7 @@ describe("observableRequiresReaction", function() { } }) - test("don't warn on reads inside an action", function() { + test("don't warn on reads inside an action", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -389,7 +389,7 @@ describe("observableRequiresReaction", function() { } }) - test("warn on reads inside a transaction", function() { + test("warn on reads inside a transaction", function () { try { mobx.configure({ observableRequiresReaction: true }) const x = mobx.observable({ @@ -405,8 +405,8 @@ describe("observableRequiresReaction", function() { }) }) -describe("reactionRequiresObservable", function() { - test("warn on reaction creation without dependencies", function() { +describe("reactionRequiresObservable", function () { + test("warn on reaction creation without dependencies", function () { try { mobx.configure({ reactionRequiresObservable: true }) @@ -424,7 +424,7 @@ describe("reactionRequiresObservable", function() { }) }) -test("#1869", function() { +test("#1869", function () { const x = mobx.observable.box(3) mobx.configure({ enforceActions: "always", isolateGlobalState: true }) expect( @@ -435,7 +435,7 @@ test("#1869", function() { mobx._resetGlobalState() // should preserve strict mode }) -test("allow overwriting computed if configured", function() { +test("allow overwriting computed if configured", function () { try { mobx.configure({ computedConfigurable: true }) const x = mobx.observable({ diff --git a/test/v5/base/tojs.js b/test/v5/base/tojs.js index a8e5c2abe..83a89d2c0 100644 --- a/test/v5/base/tojs.js +++ b/test/v5/base/tojs.js @@ -4,7 +4,7 @@ const mobx = require("../../../src/mobx.ts") const m = mobx const observable = mobx.observable -test("json1", function() { +test("json1", function () { mobx._resetGlobalState() const todos = observable([ @@ -17,9 +17,9 @@ test("json1", function() { ]) let output - mobx.autorun(function() { + mobx.autorun(function () { output = todos - .map(function(todo) { + .map(function (todo) { return todo.title }) .join(", ") @@ -31,7 +31,7 @@ test("json1", function() { expect(output).toBe("write blog, improve coverage, take a nap") }) -test("json2", function() { +test("json2", function () { const source = { todos: [ { @@ -55,13 +55,13 @@ test("json2", function() { expect(mobx.toJS(o)).toEqual(source) - const analyze = mobx.computed(function() { + const analyze = mobx.computed(function () { return [o.todos.length, o.todos[1].details.url] }) - const alltags = mobx.computed(function() { + const alltags = mobx.computed(function () { return o.todos - .map(function(todo) { + .map(function (todo) { return todo.tags.join(",") }) .join(",") @@ -72,14 +72,14 @@ test("json2", function() { m.observe( analyze, - function(d) { + function (d) { ab.push(d.newValue) }, true ) m.observe( alltags, - function(d) { + function (d) { tb.push(d.newValue) }, true @@ -241,7 +241,7 @@ test("toJS handles symbol keys in objects and maps", () => { expect(y.get(key)).toBe(43) }) -test("json cycles", function() { +test("json cycles", function () { const a = observable({ b: 1, c: [2], @@ -333,7 +333,7 @@ test("verify already seen", () => { expect(res.x === a).toBeFalsy() }) -test("json cycles when exporting maps as maps", function() { +test("json cycles when exporting maps as maps", function () { const a = observable({ b: 1, c: [2], @@ -362,7 +362,7 @@ test("json cycles when exporting maps as maps", function() { expect(cloneA.e).toBe(cloneA) }) -describe("recurseEverything set to true", function() { +describe("recurseEverything set to true", function () { test("recurseEverything is no longer supported", () => { expect(() => mobx.toJS({}, { recurseEverything: true })).toThrowErrorMatchingInlineSnapshot( `"[MobX] toJS no longer supports options"` diff --git a/test/v5/base/trace.ts b/test/v5/base/trace.ts index 6d927ef31..e93f6e161 100644 --- a/test/v5/base/trace.ts +++ b/test/v5/base/trace.ts @@ -8,7 +8,7 @@ test("trace", () => { const baselog = console.log try { const lines: any[] = [] - console.log = function() { + console.log = function () { lines.push(arguments) } diff --git a/test/v5/base/typescript-decorators.ts b/test/v5/base/typescript-decorators.ts index 0c357fbb8..b631aef15 100644 --- a/test/v5/base/typescript-decorators.ts +++ b/test/v5/base/typescript-decorators.ts @@ -29,7 +29,7 @@ import { } from "../../../src/mobx" import * as mobx from "../../../src/mobx" -const testFunction = function(a: any) {} +const testFunction = function (a: any) {} // lazy wrapper around yest @@ -137,7 +137,7 @@ test("annotations", () => { t.deepEqual(order1totals, [6, 3, 9]) t.equal(order1.aFunction, testFunction) - const x = function() { + const x = function () { return 3 } order1.aFunction = x @@ -150,7 +150,7 @@ test("box", () => { @observable height = 20 @observable sizes = [2] @observable - someFunc = function() { + someFunc = function () { return 2 } @computed diff --git a/test/v5/base/typescript-tests.ts b/test/v5/base/typescript-tests.ts index 1a824c7e1..ec5d75346 100644 --- a/test/v5/base/typescript-tests.ts +++ b/test/v5/base/typescript-tests.ts @@ -36,7 +36,7 @@ observe(v, () => {}) const a = observable([1, 2, 3]) -const testFunction = function(a: any) {} +const testFunction = function (a: any) {} // lazy wrapper around yest @@ -164,7 +164,7 @@ test("annotations", () => { t.deepEqual(order1totals, [6, 3, 9]) t.equal(order1.aFunction, testFunction) - const x = function() { + const x = function () { return 3 } order1.aFunction = x @@ -189,7 +189,7 @@ test("scope", () => { y: number } - const Thing = function(this: any) { + const Thing = function (this: any) { extendObservable(this, { y: 3, // this will work here @@ -236,7 +236,7 @@ test("box", () => { uninitialized: any height = 20 sizes = [2] - someFunc = function() { + someFunc = function () { return 2 } @@ -1414,7 +1414,7 @@ test("803 - action.bound and action preserve type info", () => { return { x: "3" } as Object }) as () => void - const bound2 = action(function() {}) as () => void + const bound2 = action(function () {}) as () => void }) test("@computed.equals (TS)", () => { @@ -1890,7 +1890,7 @@ test("flow support async generators", async () => { yield 3 } - const start = mobx.flow(async function*() { + const start = mobx.flow(async function* () { let total = 0 for await (const number of someNumbers()) { total += number @@ -1915,7 +1915,7 @@ test("flow support throwing async generators", async () => { throw "OOPS" } - const start = mobx.flow(async function*() { + const start = mobx.flow(async function* () { let total = 0 for await (const number of someNumbers()) { total += number diff --git a/test/v5/utils/test-utils.js b/test/v5/utils/test-utils.js index 1de7e5f35..593853d7a 100644 --- a/test/v5/utils/test-utils.js +++ b/test/v5/utils/test-utils.js @@ -3,7 +3,7 @@ import { $mobx } from "../../../src/mobx" export function consoleError(block, regex) { let messages = "" const orig = console.error - console.error = function() { + console.error = function () { Object.keys(arguments).forEach(key => { messages += ", " + arguments[key] }) @@ -22,7 +22,7 @@ export function consoleError(block, regex) { export function consoleWarn(block, regex) { let messages = "" const orig = console.warn - console.warn = function() { + console.warn = function () { Object.keys(arguments).forEach(key => { messages += ", " + arguments[key] }) From e82204d92682e7f2729af3a52bef754e267f71f1 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 30 Jun 2020 22:49:24 +0200 Subject: [PATCH 0367/1043] Oops. --- docs/intro/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro/installation.md b/docs/intro/installation.md index f7ce67708..4540141b4 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -8,7 +8,7 @@ hide_title: true MobX works in any ES5 environment, which includes browsers and NodeJS: -- Yarn: `yarn add immer`. React bindings: `yarn add mobx-react` +- Yarn: `yarn add mobx`. React bindings: `yarn add mobx-react` - NPM: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. From a7a4edb6d4b4c59c638e0d3d70ca343f0b530ec0 Mon Sep 17 00:00:00 2001 From: phiresky Date: Tue, 30 Jun 2020 23:30:08 +0200 Subject: [PATCH 0368/1043] add typings for spy() --- src/core/spy.ts | 89 ++++++++++++++++++++++++++++++++--- src/types/observablearray.ts | 20 ++++---- src/types/observablemap.ts | 12 +++-- src/types/observableobject.ts | 21 +++++---- src/types/observableset.ts | 8 +++- src/types/observablevalue.ts | 8 +++- 6 files changed, 127 insertions(+), 31 deletions(-) diff --git a/src/core/spy.ts b/src/core/spy.ts index 0a3f5b816..656a50578 100644 --- a/src/core/spy.ts +++ b/src/core/spy.ts @@ -1,23 +1,98 @@ -import { Lambda, globalState, once } from "../internal" +import { Lambda, globalState, once, ISetDidChange, IMapDidChange } from "../internal" export function isSpyEnabled() { return __DEV__ && !!globalState.spyListeners.length } -export function spyReport(event) { +export type ArraySpyEvent = + | { + type: "update" + observableKind: "array" + name: string + object: unknown + index: number + newValue: unknown + oldValue: unknown + } + | { + type: "splice" + observableKind: "array" + name: string + object: unknown + index: number + removed: unknown[] + added: unknown[] + removedCount: number + addedCount: number + } +export type ObjectSpyEvent = + | { + type: "add" + observableKind: "object" + name: string + key: string | number | symbol + newValue: unknown + } + | { + type: "remove" + observableKind: "object" + name: string + key: string | number | symbol + oldValue: unknown + } + | { + type: "update" + observableKind: "object" + key: string | number | symbol + name: string + object: unknown + newValue: unknown + oldValue: unknown + } +export type BoxSpyEvent = + | { + type: "create" + observableKind: "box" + name: string + newValue: unknown + } + | { + type: "update" + observableKind: "box" + name: string + newValue: unknown + oldValue: unknown + } +export type PureSpyEvent = + | { type: "scheduled-reaction"; name: string } + | { type: "reaction"; name: string } + | { type: "compute"; name: string } + | { type: "error"; name: string; message: string; error: string } + | { type: "action"; name: string; object: unknown; arguments: unknown[] } + | ObjectSpyEvent + | ArraySpyEvent + | BoxSpyEvent + | (Omit, "name"> & { name: string; key: unknown }) + | (Omit, "name"> & { name: string }) + | { type: "compute"; object: unknown; name: string } + | { type: "report-end-only" } + +type SpyEvent = PureSpyEvent & { spyReportStart?: true; spyReportEnd?: true } + +export function spyReport(event: SpyEvent) { if (!__DEV__) return // dead code elimination can do the rest if (!globalState.spyListeners.length) return const listeners = globalState.spyListeners for (let i = 0, l = listeners.length; i < l; i++) listeners[i](event) } -export function spyReportStart(event) { +export function spyReportStart(event: PureSpyEvent) { if (!__DEV__) return - const change = { ...event, spyReportStart: true } + const change = { ...event, spyReportStart: true as const } spyReport(change) } -const END_EVENT = { spyReportEnd: true } +const END_EVENT: SpyEvent = { spyReportEnd: true, type: "report-end-only" } export function spyReportEnd(change?) { if (!__DEV__) return @@ -25,10 +100,10 @@ export function spyReportEnd(change?) { else spyReport(END_EVENT) } -export function spy(listener: (change: any) => void): Lambda { +export function spy(listener: (change: SpyEvent) => void): Lambda { if (!__DEV__) { console.warn(`[mobx.spy] Is a no-op in production builds`) - return function() {} + return function () {} } else { globalState.spyListeners.push(listener) return once(() => { diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index d30582aa3..d1e3613d1 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -248,18 +248,19 @@ export class ObservableArrayAdministration const notify = hasListeners(this) const change = notify || notifySpy - ? { + ? ({ object: this.proxy_, type: UPDATE, + observableKind: "array", index, newValue, oldValue - } + } as const) : null // The reason why this is on right hand side here (and not above), is this way the uglifier will drop it, but it won't // cause any runtime overhead in development mode without NODE_ENV set, unless spying is enabled - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.atom_.name_ }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.atom_.name_ }) this.atom_.reportChanged() if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -270,18 +271,19 @@ export class ObservableArrayAdministration const notify = hasListeners(this) const change = notify || notifySpy - ? { + ? ({ object: this.proxy_, type: SPLICE, + observableKind: "array", index, removed, added, removedCount: removed.length, addedCount: added.length - } + } as const) : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.atom_.name_ }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.atom_.name_ }) this.atom_.reportChanged() // conform: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe if (notify) notifyListeners(this, change) @@ -482,7 +484,7 @@ function addArrayExtension(funcName, funcFactory) { // Report and delegate to dehanced array function simpleFunc(funcName) { - return function() { + return function () { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() const res = adm.dehanceValues_(adm.values_) @@ -492,7 +494,7 @@ function simpleFunc(funcName) { // Make sure callbacks recieve correct array arg #2326 function mapLikeFunc(funcName) { - return function(callback, thisArg) { + return function (callback, thisArg) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() return adm.values_[funcName]((element, index) => { @@ -504,7 +506,7 @@ function mapLikeFunc(funcName) { // Make sure callbacks recieve correct array arg #2326 function reduceLikeFunc(funcName) { - return function(callback, initialValue) { + return function (callback, initialValue) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() return adm.values_[funcName]((accumulator, currentValue, index) => { diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index ea8f62827..ef5ddd5d4 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -48,6 +48,7 @@ export type IMapDidChange = object: ObservableMap name: K // actual the key or index, but this is based on the ancient .observe proposal for consistency type: "update" + observableKind: "map" newValue: V oldValue: V } @@ -55,12 +56,14 @@ export type IMapDidChange = object: ObservableMap name: K type: "add" + observableKind: "map" newValue: V } | { object: ObservableMap name: K type: "delete" + observableKind: "map" oldValue: V } @@ -167,13 +170,14 @@ export class ObservableMap notify || notifySpy ? >{ type: DELETE, + observableKind: "map", object: this, oldValue: (this.data_.get(key)).value_, name: key } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) transaction(() => { this.keysAtom_.reportChanged() this.updateHasMapEntry_(key, false) @@ -205,13 +209,14 @@ export class ObservableMap notify || notifySpy ? >{ type: UPDATE, + observableKind: "map" as const, object: this, oldValue: (observable as any).value_, name: key, newValue } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) observable.setNewValue_(newValue as V) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -238,12 +243,13 @@ export class ObservableMap notify || notifySpy ? >{ type: ADD, + observableKind: "map", object: this, name: key, newValue } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() } diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index d690323b6..b633e7923 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -122,16 +122,17 @@ export class ObservableObjectAdministration const notifySpy = __DEV__ && isSpyEnabled() const change = notify || notifySpy - ? { + ? ({ type: UPDATE, + observableKind: "object", object: this.proxy_ || instance, oldValue: (observable as any).value_, name: key, newValue - } + } as const) : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) ;(observable as ObservableValue).setNewValue_(newValue) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -230,14 +231,15 @@ export class ObservableObjectAdministration delete this.target_[key] const change = notify || notifySpy - ? { + ? ({ type: REMOVE, + observableKind: "object", object: this.proxy_ || target, oldValue: oldValue, name: key - } + } as const) : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() } finally { @@ -265,15 +267,16 @@ export class ObservableObjectAdministration const notifySpy = __DEV__ && isSpyEnabled() const change = notify || notifySpy - ? { + ? ({ type: ADD, + observableKind: "object", object: this.proxy_ || this.target_, name: key, newValue - } + } as const) : null - if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() if (this.pendingKeys_) { diff --git a/src/types/observableset.ts b/src/types/observableset.ts index f50bfc720..ebe92c1a7 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -38,11 +38,13 @@ export type ISetDidChange = | { object: ObservableSet type: "add" + observableKind: "set" newValue: T } | { object: ObservableSet type: "delete" + observableKind: "set" oldValue: T } @@ -131,11 +133,12 @@ export class ObservableSet implements Set, IInterceptable>{ type: ADD, + observableKind: "set", object: this, newValue: value } : null - if (notifySpy && __DEV__) spyReportStart(change) + if (notifySpy && __DEV__) spyReportStart({ ...change!, name: this.name_ }) if (notify) notifyListeners(this, change) if (notifySpy && __DEV__) spyReportEnd() } @@ -159,12 +162,13 @@ export class ObservableSet implements Set, IInterceptable>{ type: DELETE, + observableKind: "set", object: this, oldValue: value } : null - if (notifySpy && __DEV__) spyReportStart({ ...change, name: this.name_ }) + if (notifySpy && __DEV__) spyReportStart({ ...change!, name: this.name_ }) transaction(() => { this.atom_.reportChanged() this.data_.delete(value) diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 73adc4be7..2b79d11fa 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -64,7 +64,12 @@ export class ObservableValue extends Atom this.value_ = enhancer(value, undefined, name_) if (__DEV__ && notifySpy && isSpyEnabled()) { // only notify spy if this is a stand-alone observable - spyReport({ type: CREATE, name: this.name_, newValue: "" + this.value_ }) + spyReport({ + type: CREATE, + observableKind: "box", + name: this.name_, + newValue: "" + this.value_ + }) } } @@ -81,6 +86,7 @@ export class ObservableValue extends Atom if (__DEV__ && notifySpy) { spyReportStart({ type: UPDATE, + observableKind: "box", name: this.name_, newValue, oldValue From a0adf50ec82ff826faaadfc430c83ff734ebd814 Mon Sep 17 00:00:00 2001 From: phiresky Date: Tue, 30 Jun 2020 23:35:15 +0200 Subject: [PATCH 0369/1043] update changelog --- CHANGELOG.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de1f5ca84..d554deac7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Don't omit action name in production [#2263](https://github.com/mobxjs/mobx/issues/2263) by [@elektronik2k5](https://github.com/elektronik2k5) - Update readme to reflect correct scripts by [@elektronik2k5](https://github.com/elektronik2k5) - `prettier` related tweaks by [@elektronik2k5](https://github.com/elektronik2k5) +- Add full types for the spy() function by [@phiresky](https://github.com/phiresky) # 5.15.4 / 4.15.4 @@ -901,7 +902,7 @@ A deprecation message will now be printed if creating computed properties while ```javascript const x = observable({ - computedProp: function() { + computedProp: function () { return someComputation } }) @@ -926,7 +927,7 @@ or alternatively: ```javascript observable({ - computedProp: computed(function() { + computedProp: computed(function () { return someComputation }) }) @@ -944,7 +945,7 @@ N.B. If you want to introduce actions on an observable that modify its state, us ```javascript observable({ counter: 0, - increment: action(function() { + increment: action(function () { this.counter++ }) }) @@ -1070,10 +1071,10 @@ function Square() { extendObservable(this, { length: 2, squared: computed( - function() { + function () { return this.squared * this.squared }, - function(surfaceSize) { + function (surfaceSize) { this.length = Math.sqrt(surfaceSize) } ) From 18264bd5dc4d9a4c76735ac05626f3d68952e434 Mon Sep 17 00:00:00 2001 From: phiresky Date: Tue, 30 Jun 2020 23:35:22 +0200 Subject: [PATCH 0370/1043] update snapshots --- test/v4/base/__snapshots__/extras.js.snap | 2 + test/v4/base/__snapshots__/object-api.js.snap | 2 + .../v4/base/__snapshots__/observables.js.snap | 16 ++++++++ test/v4/base/__snapshots__/spy.js.snap | 37 ++++++++++++++++++ test/v5/base/__snapshots__/extras.js.snap | 2 + test/v5/base/__snapshots__/flow.js.snap | 8 ++++ test/v5/base/__snapshots__/object-api.js.snap | 2 + .../v5/base/__snapshots__/observables.js.snap | 16 ++++++++ test/v5/base/__snapshots__/spy.js.snap | 39 +++++++++++++++++++ 9 files changed, 124 insertions(+) diff --git a/test/v4/base/__snapshots__/extras.js.snap b/test/v4/base/__snapshots__/extras.js.snap index 02ff4de2e..37e48c53d 100644 --- a/test/v4/base/__snapshots__/extras.js.snap +++ b/test/v4/base/__snapshots__/extras.js.snap @@ -5,6 +5,7 @@ Array [ Object { "name": "ObservableValue@9", "newValue": 4, + "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -23,6 +24,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, ] `; diff --git a/test/v4/base/__snapshots__/object-api.js.snap b/test/v4/base/__snapshots__/object-api.js.snap index 784abc025..27548a7ba 100644 --- a/test/v4/base/__snapshots__/object-api.js.snap +++ b/test/v4/base/__snapshots__/object-api.js.snap @@ -43,6 +43,7 @@ Array [ "title": "get tea", }, }, + "observableKind": "object", "type": "add", }, }, @@ -54,6 +55,7 @@ Array [ "title": "get tea", }, }, + "observableKind": "object", "oldValue": Object { "title": "get coffee", }, diff --git a/test/v4/base/__snapshots__/observables.js.snap b/test/v4/base/__snapshots__/observables.js.snap index b2fb4ff74..b8db15ff6 100644 --- a/test/v4/base/__snapshots__/observables.js.snap +++ b/test/v4/base/__snapshots__/observables.js.snap @@ -6,35 +6,41 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@1", "newValue": 4, + "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "end1", Object { "key": "a", "name": "ObservableObject@1", "newValue": 5, + "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "end2", Object { @@ -56,6 +62,7 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 6, + "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", @@ -76,18 +83,21 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "post trans2", Object { "key": "a", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "post trans3", ] @@ -102,23 +112,27 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": false, + "observableKind": "object", "oldValue": true, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "b", "name": "ObservableObject@1", "newValue": true, + "observableKind": "object", "oldValue": false, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "transpreend", Object { @@ -148,12 +162,14 @@ Array [ "key": "b", "name": "ObservableObject@1", "newValue": 2, + "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "transpreend", Object { diff --git a/test/v4/base/__snapshots__/spy.js.snap b/test/v4/base/__snapshots__/spy.js.snap index 52446be64..9156bebb2 100644 --- a/test/v4/base/__snapshots__/spy.js.snap +++ b/test/v4/base/__snapshots__/spy.js.snap @@ -18,6 +18,7 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", @@ -42,6 +43,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, ] `; @@ -51,59 +53,70 @@ Array [ Object { "name": "ObservableValue@1", "newValue": "2", + "observableKind": "box", "type": "create", }, Object { "name": "ObservableValue@1", "newValue": 3, + "observableKind": "box", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 4, + "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 5, + "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 6, + "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 7, + "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [ @@ -113,6 +126,7 @@ Array [ "addedCount": 2, "index": 0, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -120,6 +134,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [ @@ -129,6 +144,7 @@ Array [ "addedCount": 2, "index": 2, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -136,12 +152,14 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [], "addedCount": 0, "index": 0, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [ 1, ], @@ -151,58 +169,69 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "index": 2, "name": "ObservableArray@3", "newValue": 5, + "observableKind": "array", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", "newValue": 1, + "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", + "observableKind": "map", "oldValue": 1, "spyReportStart": true, "type": "delete", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 5, + "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 6, + "observableKind": "map", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "Autorun@7", @@ -219,6 +248,7 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 4, + "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -237,26 +267,31 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 5, + "observableKind": "box", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 6, + "observableKind": "box", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ComputedValue@6", @@ -281,12 +316,14 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 7, + "observableKind": "box", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ComputedValue@6", diff --git a/test/v5/base/__snapshots__/extras.js.snap b/test/v5/base/__snapshots__/extras.js.snap index 02ff4de2e..37e48c53d 100644 --- a/test/v5/base/__snapshots__/extras.js.snap +++ b/test/v5/base/__snapshots__/extras.js.snap @@ -5,6 +5,7 @@ Array [ Object { "name": "ObservableValue@9", "newValue": 4, + "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -23,6 +24,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, ] `; diff --git a/test/v5/base/__snapshots__/flow.js.snap b/test/v5/base/__snapshots__/flow.js.snap index 68907ca8f..80d218c42 100644 --- a/test/v5/base/__snapshots__/flow.js.snap +++ b/test/v5/base/__snapshots__/flow.js.snap @@ -25,12 +25,14 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 2, + "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "spyReportEnd": true, @@ -47,23 +49,27 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 5, + "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@10", "newValue": 4, + "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "spyReportEnd": true, @@ -80,12 +86,14 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 3, + "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "spyReportEnd": true, diff --git a/test/v5/base/__snapshots__/object-api.js.snap b/test/v5/base/__snapshots__/object-api.js.snap index 8fb4bf210..47e616ce9 100644 --- a/test/v5/base/__snapshots__/object-api.js.snap +++ b/test/v5/base/__snapshots__/object-api.js.snap @@ -31,6 +31,7 @@ Array [ "title": "get tea", }, "object": "skip", + "observableKind": "object", "type": "add", }, }, @@ -38,6 +39,7 @@ Array [ "observe": Object { "name": "a", "object": "skip", + "observableKind": "object", "oldValue": Object { "title": "get coffee", }, diff --git a/test/v5/base/__snapshots__/observables.js.snap b/test/v5/base/__snapshots__/observables.js.snap index b2fb4ff74..b8db15ff6 100644 --- a/test/v5/base/__snapshots__/observables.js.snap +++ b/test/v5/base/__snapshots__/observables.js.snap @@ -6,35 +6,41 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@1", "newValue": 4, + "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "end1", Object { "key": "a", "name": "ObservableObject@1", "newValue": 5, + "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "end2", Object { @@ -56,6 +62,7 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 6, + "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", @@ -76,18 +83,21 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "post trans2", Object { "key": "a", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "post trans3", ] @@ -102,23 +112,27 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": false, + "observableKind": "object", "oldValue": true, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "b", "name": "ObservableObject@1", "newValue": true, + "observableKind": "object", "oldValue": false, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "transpreend", Object { @@ -148,12 +162,14 @@ Array [ "key": "b", "name": "ObservableObject@1", "newValue": 2, + "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, "transpreend", Object { diff --git a/test/v5/base/__snapshots__/spy.js.snap b/test/v5/base/__snapshots__/spy.js.snap index f61975e5b..748b4d97e 100644 --- a/test/v5/base/__snapshots__/spy.js.snap +++ b/test/v5/base/__snapshots__/spy.js.snap @@ -18,6 +18,7 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 3, + "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", @@ -42,6 +43,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "arguments": Array [ @@ -55,12 +57,14 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 4, + "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ObservableObject@1.y", @@ -85,59 +89,70 @@ Array [ Object { "name": "ObservableValue@1", "newValue": "2", + "observableKind": "box", "type": "create", }, Object { "name": "ObservableValue@1", "newValue": 3, + "observableKind": "box", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 4, + "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 5, + "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 6, + "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 7, + "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [ @@ -147,6 +162,7 @@ Array [ "addedCount": 2, "index": 0, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -154,6 +170,7 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [ @@ -163,6 +180,7 @@ Array [ "addedCount": 2, "index": 2, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -170,12 +188,14 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "added": Array [], "addedCount": 0, "index": 0, "name": "ObservableArray@3", + "observableKind": "array", "removed": Array [ 1, ], @@ -185,58 +205,69 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "index": 2, "name": "ObservableArray@3", "newValue": 5, + "observableKind": "array", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", "newValue": 1, + "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", + "observableKind": "map", "oldValue": 1, "spyReportStart": true, "type": "delete", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 5, + "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 6, + "observableKind": "map", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "Autorun@7", @@ -253,6 +284,7 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 4, + "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -271,26 +303,31 @@ Array [ }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 5, + "observableKind": "box", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 6, + "observableKind": "box", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ComputedValue@6", @@ -315,12 +352,14 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 7, + "observableKind": "box", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, + "type": "report-end-only", }, Object { "name": "ComputedValue@6", From ae0f265982f1e9017f5356edf93f8b8fa0e396e6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 10:47:49 +0200 Subject: [PATCH 0371/1043] Remove egghead lesson link. --- docs/refguide/observable.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index ba3982ccb..f3bac5976 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -6,24 +6,6 @@ hide_title: true # observable -
    - egghead.io lesson 1: observable & observer -
    -
    - -
    - Hosted on egghead.io -
    - -
    - egghead.io lesson 4: observable objects & maps -
    -
    - -
    - Hosted on egghead.io -
    - Usage: - `observable(value)` From d5b88e8ccd15288e808af1e897df0e3d6655d6f7 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 10:49:25 +0200 Subject: [PATCH 0372/1043] Start of documentating makeObservable / makeAutoObservable APIs. --- docs/refguide/make-auto-observable.md | 36 --------- docs/refguide/make-observable.md | 105 ++++++++++++++++++++++++++ website/i18n/en.json | 6 +- website/sidebars.json | 1 + 4 files changed, 109 insertions(+), 39 deletions(-) delete mode 100644 docs/refguide/make-auto-observable.md create mode 100644 docs/refguide/make-observable.md diff --git a/docs/refguide/make-auto-observable.md b/docs/refguide/make-auto-observable.md deleted file mode 100644 index f6d344fa7..000000000 --- a/docs/refguide/make-auto-observable.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -sidebar_label: makeAutoObservable -hide_title: true ---- - -# makeAutoObservable - -```javascript -import { makeAutoObservable } from "mobx" - -class Todo { - id = Math.random() - title = "" - finished = false - - constructor() { - makeAutoObservable(this, { id: false }) - } - - toggle() { - this.finished = !finished - } -} - -class TodoList { - todos = [] - get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } - constructor() { - makeAutoObservable(this) - } -} -``` - -As you can see this is more compact; the only thing you need to do to make instances of a class become observable is `makeAutoObservable`. In our original `Todo` class `id` was not observable, and we've specified the same behavior here by telling `makeAutoObservable` not to do anything with it. diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md new file mode 100644 index 000000000..37fc08224 --- /dev/null +++ b/docs/refguide/make-observable.md @@ -0,0 +1,105 @@ +--- +title: makeObservable and makeAutoObservable +sidebar_label: makeObservable and makeAutoObservable +hide_title: true +--- + +# makeObservable and makeAutoObservable + +Usage: + +- `makeObservable(target, annotations?, options?)` +- `makeAutoObservable(arget, excludes?, options?)` + +In `makeObservable`, a JavaScript object (including class instance) is passed into `target`. In `annotations` you can declare properties observable, getters as computed and methods as actions. + +Typically `makeObservable` is used in the constructor of a class, and +its first argument is `this`. The `annotations` argument is a mapping with +declarations about properties and methods: + +```javascript +import { makeObservable, observable, computed, action } from "mobx" + +class Doubler { + constructor(value) { + makeObservable(this, { + value: observable, + double: computed, + increment: action + }) + this.value = value + } + + get double() { + return this.value * 2 + } + + increment() { + this.value++ + } +} +``` + +Annotation keys are the names of properties and methods. + +Possible annotation values are: + +- `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and `Map`. The property cannot be a getter or a setter. + +- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. + +- `action`: Used on a method that modifies observable properties. + +- `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. + +- `false`: Explicitly do not annotation this property. Normally only useful with `makeAutoObservable`. + +`makeAutoObservable` behaves much the same way, but infers all properties by default. +You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. + +Here is the doubler with `makeAutoObservable`: + +```javascript +import { makeAutoObservable } from "mobx" + +class Doubler { + constructor(value) { + makeAutoObservable(this) + this.value = value + } + + get double() { + return this.value * 2 + } + + increment() { + this.value++ + } +} +``` + +As you can see this is more compact. + +Here is how you can exclude a property from being observable: + +```javascript +import { makeAutoObservable } from "mobx" + +class Todo { + id = Math.random() + title = "" + finished = false + + constructor() { + makeAutoObservable(this, { id: false }) + } + + toggle() { + this.finished = !finished + } +} +``` + +`id` is not intended to be observable as it does not change after construction. +We have therefore declared it as `false` in the `exclusions` argument of +`makeAutoObservable`. diff --git a/website/i18n/en.json b/website/i18n/en.json index aa5efab07..b1fa95567 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -120,9 +120,9 @@ "title": "provider_inject", "sidebar_label": "Provider / inject" }, - "refguide/make-auto-observable": { - "title": "refguide/make-auto-observable", - "sidebar_label": "makeAutoObservable" + "refguide/make-observable": { + "title": "makeObservable and makeAutoObservable", + "sidebar_label": "makeObservable and makeAutoObservable" }, "refguide/map": { "title": "Observable Maps", diff --git a/website/sidebars.json b/website/sidebars.json index 341c00232..bc26c1c6c 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -12,6 +12,7 @@ "react/react-class-components" ], "Making things observable": [ + "refguide/make-observable", "refguide/observable", "refguide/observable-decorator", "refguide/object", From f5eab91257b0666e6c1663eafc136e0a97d2a35f Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 09:57:42 +0100 Subject: [PATCH 0373/1043] Build fixes --- test/v5/base/typescript-decorators.ts | 7 +++--- test/v5/base/typescript-tests.ts | 33 ++++++--------------------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/test/v5/base/typescript-decorators.ts b/test/v5/base/typescript-decorators.ts index b631aef15..dabc4be91 100644 --- a/test/v5/base/typescript-decorators.ts +++ b/test/v5/base/typescript-decorators.ts @@ -7,7 +7,6 @@ import { autorun, extendObservable, action, - IObservableObject, IObservableArray, IArrayChange, IArraySplice, @@ -29,7 +28,7 @@ import { } from "../../../src/mobx" import * as mobx from "../../../src/mobx" -const testFunction = function (a: any) {} +const testFunction = function(a: any) {} // lazy wrapper around yest @@ -137,7 +136,7 @@ test("annotations", () => { t.deepEqual(order1totals, [6, 3, 9]) t.equal(order1.aFunction, testFunction) - const x = function () { + const x = function() { return 3 } order1.aFunction = x @@ -150,7 +149,7 @@ test("box", () => { @observable height = 20 @observable sizes = [2] @observable - someFunc = function () { + someFunc = function() { return 2 } @computed diff --git a/test/v5/base/typescript-tests.ts b/test/v5/base/typescript-tests.ts index ec5d75346..492b100be 100644 --- a/test/v5/base/typescript-tests.ts +++ b/test/v5/base/typescript-tests.ts @@ -7,7 +7,6 @@ import { autorun, extendObservable, action, - IObservableObject, IObservableArray, IArrayChange, IArraySplice, @@ -36,7 +35,7 @@ observe(v, () => {}) const a = observable([1, 2, 3]) -const testFunction = function (a: any) {} +const testFunction = function(a: any) {} // lazy wrapper around yest @@ -164,7 +163,7 @@ test("annotations", () => { t.deepEqual(order1totals, [6, 3, 9]) t.equal(order1.aFunction, testFunction) - const x = function () { + const x = function() { return 3 } order1.aFunction = x @@ -189,7 +188,7 @@ test("scope", () => { y: number } - const Thing = function (this: any) { + const Thing = function(this: any) { extendObservable(this, { y: 3, // this will work here @@ -236,7 +235,7 @@ test("box", () => { uninitialized: any height = 20 sizes = [2] - someFunc = function () { + someFunc = function() { return 2 } @@ -1222,13 +1221,6 @@ test("computed getter / setter for plan objects should succeed (typescript)", () t.deepEqual(values, [6, 8]) }) -test("484 - observable objects are IObservableObject", () => { - const needs_observable_object = (o: IObservableObject): any => null - const o = observable({ stuff: "things" }) - - needs_observable_object(o) -}) - test("484 - observable objects are still type T", () => { const o = observable({ stuff: "things" }) o.stuff = "new things" @@ -1243,17 +1235,6 @@ test("484 - isObservableObject type guard includes type T", () => { } }) -test("484 - isObservableObject type guard includes type IObservableObject", () => { - const requires_observable_object = (o: IObservableObject): void => {} - const o = observable({ stuff: "things" }) - - if (isObservableObject(o)) { - requires_observable_object(o) - } else { - throw "object should have been IObservableObject" - } -}) - test("705 - setter undoing caching (typescript)", () => { let recomputes = 0 let autoruns = 0 @@ -1414,7 +1395,7 @@ test("803 - action.bound and action preserve type info", () => { return { x: "3" } as Object }) as () => void - const bound2 = action(function () {}) as () => void + const bound2 = action(function() {}) as () => void }) test("@computed.equals (TS)", () => { @@ -1890,7 +1871,7 @@ test("flow support async generators", async () => { yield 3 } - const start = mobx.flow(async function* () { + const start = mobx.flow(async function*() { let total = 0 for await (const number of someNumbers()) { total += number @@ -1915,7 +1896,7 @@ test("flow support throwing async generators", async () => { throw "OOPS" } - const start = mobx.flow(async function* () { + const start = mobx.flow(async function*() { let total = 0 for await (const number of someNumbers()) { total += number From ddb700ad61779ac47edaf026aa623bf9a94a207b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 12:34:40 +0200 Subject: [PATCH 0374/1043] Go through the Making things observable section cleaning it up. --- docs/best/decorators.md | 5 ++- docs/best/limitations-without-proxies.md | 31 +++++++++++----- docs/refguide/array.md | 26 ++++++------- docs/refguide/make-observable.md | 13 ++++--- docs/refguide/map.md | 19 ++++++---- docs/refguide/object.md | 19 ++++++---- docs/refguide/observable-decorator.md | 47 ------------------------ docs/refguide/observable.md | 12 +++++- notes-docs.md | 5 +++ website/i18n/en.json | 8 +--- website/sidebars.json | 1 - 11 files changed, 83 insertions(+), 103 deletions(-) delete mode 100644 docs/refguide/observable-decorator.md diff --git a/docs/best/decorators.md b/docs/best/decorators.md index ee0ce983d..d087a5190 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -6,9 +6,10 @@ hide_title: true # Decorators in MobX -MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In MobX6 in the interest of compatibility we have chosen to move away from them, and use `makeObservable()`/`makeAutoObservable()` instead. +MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend +the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. -But many existing code bases that use MobX still use them, and a lot of the documentation material online uses them as well. You can still use them with MobX 6 too! So let's examine what they look like: +But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. You can still use them with MobX 6 too! So let's examine what they look like: ```javascript import { makeObservable, observable, computed, action } from "mobx" diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 78581c6a6..1583bd1a1 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -13,27 +13,40 @@ MobX 6 works on any ES 5 environment, but if your environment or browser does no Luckily, most environments support Proxies these days. -See below for more details. - -## `Array.isArray(observable([1,2,3])) === false` +## Arrays _This limitation only applies if MobX runs in an environment without Proxy support_ -In ES5 there is no way to reliably inherit from arrays, and hence observable arrays inherit from objects. -This means that regularly libraries are not able to recognize observable arrays as normal arrays (like lodash, or built-in operations like `Array.concat`). -This can simply be fixed by passing calling `observable.toJS()` or `observable.slice()` before passing the array to another library. -As long as the external library has no intent to modify the array, this will further work completely as expected. +Due to limitations of native arrays, if Proxy support is not available, `observable.array` will create a faux-array (array-like object) instead of a real array. +In practice, these arrays work just as well as native arrays and all native methods are supported, including index assignments, up-to and including the length of the array. + +Bear in mind however that `Array.isArray(observable([1, 2, 3]))` returns `false`. +Some native array manipulation methods as well as external libraries use `Array.isArray` and fail to work properly if it returns `false`. Examples include `Array.concat` as well as libraries like `lodash`. + +So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. Alternatively you can use the `toJS` +method on observable array. As long as the external library has no intent to modify the array, this works as expected. + You can use `isObservableArray(observable)` to check whether something is an observable array. -## `object.someNewProp = value` is not picked up +## Objects _This limitation only applies if MobX run in an environment without Proxy support. If you are sure you are in an environment that does have Proxy support and it still does not work, it could be you forgot to mark the object observable._ -MobX observable _objects_ do not detect or react to property assignments that weren't declared observable before. +In an environment that does not support Proxies, MobX observable _objects_ do not detect or react to property assignments that weren't declared observable before. So, if you do: + +```javascript +object.someNewProp = value +``` + +is not picked up by MobX. + So MobX observable objects act as records with predefined keys. + You can use `extendObservable(target, props)` to introduce new observable properties to an object. However object iterators like `for .. in` or `Object.keys()` won't react to this automatically. If you need a dynamically keyed object in an environment without Proxy support, for example to store users by id, create observable _maps_ using [`observable.map`](../refguide/map.md) or use the utility methods as exposed by the [Object API](../refguide/object-api.md). For more info see [what will MobX react to?](https://mobx.js.org/best/react.html#what-does-mobx-react-to). + +See this [blog post](https://medium.com/@trekinbami/observe-changes-in-dynamically-keyed-objects-with-mobx-and-react-24b4f857bae9) for the different options available to work with dynamically keyed objects in environments without Proxy support. diff --git a/docs/refguide/array.md b/docs/refguide/array.md index aef399c83..dcbff364d 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -6,10 +6,14 @@ hide_title: true ## Observable Arrays -
    +Usage: -Similar to objects, arrays can be made observable using `observable.array(values?)` or by passing an array to `observable`. -This works recursively as well, so all (future) values of the array will also be observable. +- `observable.array(initialValues?, options?)` +- `observable(initialValues)` + +Similar to objects, arrays can be made observable using `observable.array(values)` or by passing an array to [`observable`](observable.md). +This works recursively as well, so all (future) values of the array will also be observable. If you want to create an empty observable array, create it using +`observable.array()` without arguments. ```javascript import { observable, autorun } from "mobx" @@ -42,16 +46,15 @@ todos.shift() Besides all built-in functions, the following goodies are available as well on observable arrays: -- `intercept(interceptor)`. Can be used to intercept any change before it is applied to the array. See [observe & intercept](observe.md) -- `observe(listener, fireImmediately? = false)` Listen to changes in this array. The callback will receive arguments that express an array splice or array change, conforming to [ES7 proposal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe). It returns a disposer function to stop the listener. - `clear()` Remove all current entries from the array. - `replace(newItems)` Replaces all existing entries in the array with new ones. - `find(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.find` proposal. - `findIndex(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.findIndex` proposal. - `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. -- _[MobX 4 and lower]_ `peek()` Returns an array with all the values which can safely be passed to other libraries, similar to `slice()`. +- `intercept(interceptor)`. Can be used to intercept any change before it is applied to the array. See [observe & intercept](observe.md) +- `observe(listener, fireImmediately? = false)` Listen to changes in this array. The `listener` callback will receive arguments that express an array splice or array change, conforming to [ES7 proposal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe). It returns a disposer function to stop the listener. -Unlike the built-in implementation of the functions `sort` and `reverse`, observableArray.sort and reverse will not change the array in-place, but only will return a sorted / reversed copy. From MobX 5 and higher this will show a warning. It is recommended to use `array.slice().sort()` instead. +Unlike the built-in implementation of the functions `sort` and `reverse`, `observableArray.sort` and `observableArray.reverse` do not change the array in-place, but return a sorted / reversed copy only. From MobX 5 and higher this shows a warning. It is recommended to use `array.slice().sort()` instead. ## `observable.array(values, { deep: false })` @@ -62,11 +65,6 @@ Create a shallow array to disable this behavior and store a values as-is. See al The `name` option can be used to give the array a friendly debug name, to be used in for example `spy` or the MobX dev tools. -## Array limitations in MobX 4 and below - -Due to limitations of native arrays in ES5 `observable.array` will create a faux-array (array-like object) instead of a real array. -In practice, these arrays work just as fine as native arrays and all native methods are supported, including index assignments, up-to and including the length of the array. +## Array limitations in environments without Proxy support -Bear in mind however that `Array.isArray(observable([]))` will yield `false`, which some native array manipulation methods require and which some external libraries may also require. -E.g. `[].concat(observable([]))` will not work as expected since the native array concat method expects the test to return `true`. -So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. +In environments with Proxy support, there are some [limitations](../best/limitations-without-proxies.md) with arrays that you should be aware about. diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 37fc08224..f368532b4 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -1,10 +1,10 @@ --- -title: makeObservable and makeAutoObservable -sidebar_label: makeObservable and makeAutoObservable +title: makeObservable / makeAutoObservable +sidebar_label: makeObservable / makeAutoObservable hide_title: true --- -# makeObservable and makeAutoObservable +# makeObservable / makeAutoObservable Usage: @@ -44,7 +44,7 @@ Annotation keys are the names of properties and methods. Possible annotation values are: -- `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and `Map`. The property cannot be a getter or a setter. +- `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map). The property cannot be a getter or a setter. See also the rules of [`observable`](observable.md). - `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. @@ -54,8 +54,9 @@ Possible annotation values are: - `false`: Explicitly do not annotation this property. Normally only useful with `makeAutoObservable`. -`makeAutoObservable` behaves much the same way, but infers all properties by default. -You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. +## `makeAutoObservable` + +`makeAutoObservable` behaves much like `makeObservable`, but infers all properties by default. You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. Here is the doubler with `makeAutoObservable`: diff --git a/docs/refguide/map.md b/docs/refguide/map.md index ff7cc7c48..7a388281e 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -6,15 +6,16 @@ hide_title: true # Observable Maps -
    +Usage: -## `observable.map(values, options?)` +- `observable.map(initialMap?, options?)` +- `observable(map)` `observable.map(values?)` creates a dynamic keyed observable map. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. Optionally takes an object, entries array or string keyed [ES6 map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) with initial values. -Using ES6 Map constructor you can initialize observable map using `observable(new Map())` or for class properties using the decorator `@observable map = new Map()`. +Using ES6 Map constructor you can initialize observable map using `observable(new Map())` or for class properties with `makeObservable` using `map = new Map()`. The following methods are exposed according to the [ES6 Map spec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): @@ -33,16 +34,18 @@ The following functions are not in the ES6 spec but are available in MobX: - `toJS()`. Converts the observable map back to an normal Map. - `toJSON()`. Returns a shallow plain object representation of this map. (For a deep copy use `mobx.toJS(map)`). -- `intercept(interceptor)`. Registers an interceptor that will be triggered before any changes are applied to the map. See [observe & intercept](observe.md). -- `observe(listener, fireImmediately?)`. Registers a listener that fires upon each change in this map, similarly to the events that are emitted for [Object.observe](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe). See [observe & intercept](observe.md) for more details. - `merge(values)`. Copies all entries from the provided object into this map. `values` can be a plain object, array of entries or string-keyed ES6 Map. - `replace(values)`. Replaces the entire contents of this map with the provided values. +- `observe(listener, fireImmediately?)`. Registers a listener that fires upon each change in this map, similarly to the events that are emitted for [Object.observe](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe). See [observe & intercept](observe.md) for more details. +- `intercept(interceptor)`. Registers an interceptor that will be triggered before any changes are applied to the map. See [observe & intercept](observe.md). + +## Options -## `observable.map(values, { deep: false })` +### `observable.map(values, { deep: false })` Any values assigned to an observable map will be default passed through [`observable`](observable.md) to make them observable. -Create a shallow map to disable this behavior and store are values as-is. See also [decorators](modifiers.md) for more details on this mechanism. +Create a shallow map to disable this behavior and store are values as-is. See also [modifiers](modifiers.md) for more details on this mechanism. -## `observable.map(values, { name: "my map" })` +### `observable.map(values, { name: "my map" })` The `name` option can be used to give the map a friendly debug name, to be used in for example `spy` or the MobX dev tools. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 9d6b7fb87..30645ba29 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -6,9 +6,9 @@ hide_title: true ## Observable Objects -
    +Usage: -Usage `observable.object(props, decorators?, options?)` +- `observable.object(props, decorators?, options?)` If a plain JavaScript object is passed to `observable` all properties inside will be copied into a clone and made observable. (A plain object is an object that wasn't created using a constructor function / but has `Object` as its prototype, or no prototype at all.) @@ -51,10 +51,13 @@ person.setAge(21) Some things to keep in mind when making objects observable: -- _[MobX 4 and lower]_ When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See this [blog post](https://medium.com/@trekinbami/observe-changes-in-dynamically-keyed-objects-with-mobx-and-react-24b4f857bae9) for the different options available to work with dynamically keyed objects in MobX 4 -- Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties. Either use the [`@observable`](observable.md) annotation or the [`extendObservable`](extend-observable.md) function. -- Property getters will be automatically turned into derived properties, just like [`@computed`](computed-decorator) would do. +- Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties using [`makeObservable` or `makeAutoObservable`](make-observable.md). +- Property getters will be automatically turned into derived properties, just like declaring it [`computed`](computed-decorator) would do. - `observable` is applied recursively to a whole object graph automatically. Both on instantiation and to any new values that will be assigned to observable properties in the future. Observable will not recurse into non-plain objects. -- These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [decorators](modifiers.md) section. -- Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values -- Pass `{ name: "my object" }` to assign a friendly debug name to this object +- These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [modifiers](modifiers.md) section. +- Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values. +- Pass `{ name: "my object" }` to assign a friendly debug name to this object. + +## Object limitations in environments without Proxy support + +When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See also [limitations without proxies](../best/limitations-without-proxies.md) diff --git a/docs/refguide/observable-decorator.md b/docs/refguide/observable-decorator.md deleted file mode 100644 index 54fe0f7d1..000000000 --- a/docs/refguide/observable-decorator.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: @observable -sidebar_label: @observable -hide_title: true ---- - -# @observable - -
    - -
    - egghead.io lesson 1: observable & observer -
    -
    - -
    - Hosted on egghead.io -
    - -
    - egghead.io lesson 4: observable objects & maps -
    -
    - -
    - Hosted on egghead.io -
    - -Decorator that can be used on ES7- or TypeScript class properties to make them observable. -The `@observable` can be used on instance fields and property getters. -This offers fine-grained control on which parts of your object become observable. - -```javascript -import { observable, computed } from "mobx" - -class OrderLine { - @observable price = 0 - @observable amount = 1 - - @computed get total() { - return this.price * this.amount - } -} -``` - -If your environment doesn't support decorators or field initializers, -use `decorate` instead (see [decorators](./modifiers.md) for details). diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index f3bac5976..ab5a0436d 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -10,6 +10,12 @@ Usage: - `observable(value)` +`observable` is a programmatic API to declare objects as observable directly. +Often you do not invoke it directly but instead use it to declare properties +observable using [`makeObservable` / `makeAutoObservable`](make-observable.md). + +## the rules of `observable` + Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. @@ -23,9 +29,9 @@ These rules might seem complicated at first sight, but you will notice that in p Some notes: - By default, making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using _modifiers_. -- _[Environments without Proxy support]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. +- _[Environments without Proxy support]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. See also [limitations without proxies](../best/limitations-without-proxies.md). -Some examples: +Some examples of the programmatic API: ```javascript const map = observable.map({ key: "value" }) @@ -43,3 +49,5 @@ person.firstName = "C.S." const temperature = observable.box(20) temperature.set(25) ``` + +For examples of the declarative use of `observable` with `makeObservable`, see [Concepts & Principles](../intro/concepts.md) and [`makeObservable` / `makeAutoObservable`](make-observable.md). diff --git a/notes-docs.md b/notes-docs.md index 27e293200..54a5bc64b 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -21,6 +21,11 @@ Questions: - When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. +- How do we document `extendObservable` in the face of the existence of `makeObservable`? + +- Should peek() be brought back on arrays for non-decorator support? I have assumed + it is still gone in the docs. + Todo - [ ] Netlify preview for docs PR. diff --git a/website/i18n/en.json b/website/i18n/en.json index b1fa95567..6b2cdb6aa 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -121,8 +121,8 @@ "sidebar_label": "Provider / inject" }, "refguide/make-observable": { - "title": "makeObservable and makeAutoObservable", - "sidebar_label": "makeObservable and makeAutoObservable" + "title": "makeObservable / makeAutoObservable", + "sidebar_label": "makeObservable / makeAutoObservable" }, "refguide/map": { "title": "Observable Maps", @@ -144,10 +144,6 @@ "title": "Observable Objects", "sidebar_label": "objects" }, - "refguide/observable-decorator": { - "title": "@observable", - "sidebar_label": "@observable" - }, "refguide/observable": { "title": "observable", "sidebar_label": "observable" diff --git a/website/sidebars.json b/website/sidebars.json index bc26c1c6c..3fb07a2ed 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -14,7 +14,6 @@ "Making things observable": [ "refguide/make-observable", "refguide/observable", - "refguide/observable-decorator", "refguide/object", "refguide/array", "refguide/map" From e690ed996ef1b254dcddd167cb5c80b4986d651a Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 13:26:18 +0200 Subject: [PATCH 0375/1043] Start work on the updating observable section. Since actions are now required I moved this up in the sidebar, to follow the order in Concepts & Principles. --- docs/best/decorators.md | 3 +- docs/refguide/action.md | 86 +++++++++++++++++++------------- docs/refguide/make-observable.md | 40 +++++++++++++-- docs/refguide/observable.md | 1 + website/i18n/en.json | 2 +- website/sidebars.json | 10 ++-- 6 files changed, 97 insertions(+), 45 deletions(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index d087a5190..53b3c9d02 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -9,7 +9,8 @@ hide_title: true MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. -But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. You can still use them with MobX 6 too! So let's examine what they look like: +But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. The rule is that anything you can +use as an annotation to `makeObservable`, such as `observable`, `action` and `computed`, you can also use as a decorator. So let's examine what that looks like: ```javascript import { makeObservable, observable, computed, action } from "mobx" diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 6617e6226..35479daf2 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -6,61 +6,58 @@ hide_title: true # action -
    - egghead.io lesson 5: actions -
    -
    - -
    - Hosted on egghead.io -
    - Usage: - `action(fn)` - `action(name, fn)` -- `@action classMethod() {}` -- `@action(name) classMethod () {}` -- `@action boundClassMethod = (args) => { body }` -- `@action(name) boundClassMethod = (args) => { body }` -- `@action.bound classMethod() {}` +- `action.bound(fn)` +- `makeObservable(this, {someProperty: action})` +- `makeObservable(this, {someProperty: action(name)})` +- `makeObservable(this, {someProperty: action.bound})` + +Any application has actions. Actions is code that that modifies the state. +MobX requires that you declare your actions, though [makeAutoObservable](make-observable.md) can automate much of this job. Actions help you to structure your code better and offer performance benefits. -Any application has actions. Actions are anything that modify the state. -With MobX you can make it explicit in your code where your actions live by marking them. -Actions help you to structure your code better. +Actions are wrapped with with [`transaction`](api.md#transaction), [`untracked`](api.md#untracked), and [`allowStateChanges`](api.md#untracked). -It takes a function and returns a function with the same signature, but wrapped with [`transaction`](api.md#transaction), [`untracked`](api.md#untracked), and [`allowStateChanges`](api.md#untracked). Especially the fact that [`transaction`](api.md#transaction) is applied automatically yields great performance benefits; actions will batch mutations and only notify computed values and reactions after the (outer most) action has finished. -This makes sure intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. +This ensures that intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. -It is advised to use `(@)action` on any function that modifies observables or has side effects. `action` also provides useful debugging information in combination with the devtools. -Using the `@action` decorator with setters (i.e. `@action set propertyName`) is not supported; however, setters of [computed properties are automatically actions](computed-decorator.md). - -Note: using `action` is mandatory when MobX is configured to require actions to make state changes, see [`enforceActions`](api.md#enforceactions). +[setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) of [computed properties are automatically actions](computed-decorator.md). -## When to use actions? +## When are functions and methods not actions? Actions should only, and always, be used on functions that _modify_ state. Functions that just perform look-ups, filters etc should _not_ be marked as actions; to allow MobX to track their invocations. -["enforce actions"](api.md#enforceactions) enforces that all state modifications are done by an action. This is a useful best practice in larger, long term code bases. +If you use `makeAutoObservable` you have to [exclude these methods explicitly from being marked as actions](make-observable.md#excluding-methods-that-are-not-actions). + +## Actions and async code + +There are some special rules you have to take into account when you have actions that +are asynchronous. See [Writing asynchronous actions](../best/actions.md). + +## action.bound -## Bound actions +The `action` function follows the normal rules for binding in JavaScript. +However, `action.bound` can be used to automatically bind actions to the targeted object. This ensures that `this` points to the right object when you use +the action as a callback later. -The `action` decorator / function follows the normal rules for binding in javascript. -However, `action.bound` can be used to automatically bind actions to the targeted object. -Note that unlike `action`, `(@)action.bound` does not take a name parameter, so the name will always be based on the property name to which the action is bound. +Note that unlike `action`, `action.bound` does not take a name parameter, so the name will always be based on the property name to which the action is bound. Example: ```javascript class Ticker { - @observable tick = 0 + tick = 0 + + constructor() { + makeObservable(this, { tick: observable, increment: action.bound }) + } - @action.bound increment() { this.tick++ // 'this' will always be correct } @@ -70,8 +67,29 @@ const ticker = new Ticker() setInterval(ticker.increment, 1000) ``` -_Note: don't use *action.bound* with arrow functions; arrow functions are already bound and cannot be rebound._ +## bound arrow functions + +You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: + +```javascript +class Ticker { + tick = 0 + + constructor() { + makeAutoObservable(this) + } + + // note declaration as an arrow function + increment = () => { + this.tick++ // 'this' will always be correct + } +} + +const ticker = new Ticker() +setInterval(ticker.increment, 1000) +``` -## `runInAction(name?, thunk)` +## Disabling mandatory actions -`runInAction` is a simple utility that takes an code block and executes in an (anonymous) action. This is useful to create and execute actions on the fly, for example inside an asynchronous process. `runInAction(f)` is sugar for `action(f)()` +By default, MobX 6 and later require that you use actions to make state changes. +You can however configure MobX to disable this behavior, see [`enforceActions`](api.md#enforceactions). diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index f368532b4..92abbdd00 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -46,13 +46,15 @@ Possible annotation values are: - `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map). The property cannot be a getter or a setter. See also the rules of [`observable`](observable.md). -- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. +- `action`: Used on a method that modifies observable properties. See also [action](action.md). + +- `action.bound`: Like action, but used to bind the method. See [action.bound](action.md#actionbound). -- `action`: Used on a method that modifies observable properties. +- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. -- `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. +* `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. -- `false`: Explicitly do not annotation this property. Normally only useful with `makeAutoObservable`. +* `false`: Explicitly do not annotate this property. Normally only useful with `makeAutoObservable`. ## `makeAutoObservable` @@ -81,6 +83,8 @@ class Doubler { As you can see this is more compact. +### Excluding properties that are not observable + Here is how you can exclude a property from being observable: ```javascript @@ -104,3 +108,31 @@ class Todo { `id` is not intended to be observable as it does not change after construction. We have therefore declared it as `false` in the `exclusions` argument of `makeAutoObservable`. + +### Excluding methods that are not actions + +By default, `makeAutoObservable` considers all methods to be actions. It's common for classes to have methods that are not actions, however, but compute derived information that cannot be getters as they take arguments. + +```javascript +class Zoo { + constructor() { + this.makeAutoObservable(this, { filterByAnimalClass: false }) + } + + // this is an action + addAnimal(animal) { + // ... + } + + // this is not an action + filterByAnimalClass(animalClass) { + // ... + } +} +``` + +In this case, the method `filterByAnimalClass` cannot be identified as `computed` as it is not a getter. By default, `makeAutoObservable` would interpret it as an action. We therefore have to exclude it from consideration. + +### Bound actions + +If you want to automatically bind the action so you can use it as a callback, you can override the behavior of `makeAutoObservable` using [`action.bound`](action.md#actionbound). Alternatively you can define the methods as [arrow function](action.md#bound-arrow-functions). diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index ab5a0436d..f4abfc31f 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -9,6 +9,7 @@ hide_title: true Usage: - `observable(value)` +- `makeObservable(this, {someProperty: observable})` `observable` is a programmatic API to declare objects as observable directly. Often you do not invoke it directly but instead use it to declare properties diff --git a/website/i18n/en.json b/website/i18n/en.json index 6b2cdb6aa..d91ac2424 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -177,8 +177,8 @@ "Basics": "Basics", "MobX and React": "MobX and React", "Making things observable": "Making things observable", - "Reacting to observables": "Reacting to observables", "Updating observables": "Updating observables", + "Reacting to observables": "Reacting to observables", "Utilities": "Utilities", "Tips & Tricks": "Tips & Tricks" } diff --git a/website/sidebars.json b/website/sidebars.json index 3fb07a2ed..341fb1935 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -18,6 +18,11 @@ "refguide/array", "refguide/map" ], + "Updating observables": [ + "refguide/action", + "best/actions", + "refguide/object-api" + ], "Reacting to observables": [ "refguide/computed-decorator", "refguide/autorun", @@ -25,11 +30,6 @@ "refguide/reaction", "best/react" ], - "Updating observables": [ - "refguide/action", - "best/actions", - "refguide/object-api" - ], "Utilities": [ "refguide/api", "refguide/boxed", From 13ec79898e017d7ab468f8917735ae1f0ff9103e Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 14:22:33 +0200 Subject: [PATCH 0376/1043] Fix language. --- docs/react/react-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index 0183ec8ff..9e603a084 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -6,7 +6,7 @@ hide_title: true # React integration -While MobX is dependent from React they are most commonly used together. In [the gist of Mobx](../intro/overview.md) as well as the [conceptual introduction](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. +While MobX works independently from React they are most commonly used together. In [the gist of Mobx](../intro/overview.md) as well as the [conceptual introduction](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. The `observer` HoC subscribes React components automatically to _any observables_ that are used _during render_. As a result, components will automatically re-render when relevant observables change. From 0dd60a45a7d396416d2eba79b6ce49f84fd7b40c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 14:22:55 +0200 Subject: [PATCH 0377/1043] A note about the async doc. --- notes-docs.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/notes-docs.md b/notes-docs.md index 54a5bc64b..ad92904f7 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -26,6 +26,8 @@ Questions: - Should peek() be brought back on arrays for non-decorator support? I have assumed it is still gone in the docs. +- The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. + Todo - [ ] Netlify preview for docs PR. From c74e26585f159654e6b24d2bcdd51f94b8e5e225 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 14:52:11 +0200 Subject: [PATCH 0378/1043] Update the asynchronous actions document. --- docs/best/actions.md | 230 ++++++++++++++++++++++++++++++---------- docs/refguide/action.md | 2 +- website/i18n/en.json | 4 +- 3 files changed, 177 insertions(+), 59 deletions(-) diff --git a/docs/best/actions.md b/docs/best/actions.md index e49e6dc74..21673922c 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -1,27 +1,29 @@ --- -sidebar_label: async actions & flows -title: Writing asynchronous actions +sidebar_label: Asynchronous actions +title: Asynchronous actions hide_title: true --- -# Writing asynchronous actions +# Asynchronous actions -
    +If you wrap a function in `action` or mark it as such with `makeObservable`, +this only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! -The `action` wrapper / decorator only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! This means that if you have a `setTimeout`, promise`.then` or `async` construction, and in that callback some more state is changed, those callbacks should be wrapped in `action` as well! There are several ways to create asynchronous actions. No approach is strictly better than the other, but this section just list different approaches you can take to writing asynchronous code. -Let's start with a basic example: -### Promises +## Promises -```javascript -mobx.configure({ enforceActions: "observed" }) // don't allow state modifications outside actions +This code **won't work**: +```javascript class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } - @action fetchProjects() { this.githubProjects = [] this.state = "pending" @@ -39,48 +41,70 @@ class Store { } ``` -The above example would throw exceptions, as the callbacks passed to the `fetchGithubProjectsSomehow` promise are not part of the `fetchProjects` action, as actions only apply to the current stack. +The above example would throw exceptions, as the arrow functions that are passed to the `fetchGithubProjectsSomehow` promise are not part of the `fetchProjects` action. -A first simple fix is to extract the callbacks to actions. (Note that binding using `action.bound` is important here to get a correct `this`!): +We discuss various alternative approaches below to make it work again: separating +out action methods, wrapping callbacks with `action` and `runInAction`. -```javascript -mobx.configure({ enforceActions: "observed" }) +### Separate methods + +A first simple fix is to extract the behavior inside the callback functions as action methods and call them: +```javascript class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } - @action fetchProjects() { this.githubProjects = [] this.state = "pending" - fetchGithubProjectsSomehow().then(this.fetchProjectsSuccess, this.fetchProjectsError) + fetchGithubProjectsSomehow().then( + projects => { + this.fetchProjectsSuccess(projects) + }, + error => { + this.fetchProjectsError(error) + } + ) } - @action.bound fetchProjectsSuccess(projects) { const filteredProjects = somePreprocessing(projects) this.githubProjects = filteredProjects this.state = "done" } - @action.bound fetchProjectsError(error) { this.state = "error" } } ``` -Although this is clean and explicit, it might get a bit verbose with complex async flows. Alternative, you can wrap the promise callbacks with the `action` keyword. It is recommended, but not mandatory, to give them a name as well: +Note that you still have to use arrow functions as callbacks to ensure the right binding, i.e. you cannot just write: + +`then(this.fetchProjectsSuccess, this.fetchProjectsError)` + +To be able to write the code like this, you first need to bind the actions, either by using [bound arrow functions](../refguide/action.md#bound-arrow-functions) or by explicitly marking the actions with [`action.bound`](../refguide/action.md#actionbound). + +### Wrap callbacks with `action` + +Although the approach above is clean and explicit, it might get a bit verbose with complex async flows. As an alternative you can wrap the promise callbacks with the [`action` function](../refguide/action.md). It is recommended, but not mandatory, to give them a name as well: ```javascript -mobx.configure({ enforceActions: "observed" }) +import { action } from "mobx" class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } - @action fetchProjects() { this.githubProjects = [] this.state = "pending" @@ -102,18 +126,23 @@ class Store { ### The `runInAction` utility -A downside of inline actions is that TypeScript does not apply type inference on them, so you would have type all your callbacks. +A downside of inline actions in combination with TypeScript is that TypeScript does +not apply type inference on them, so you would have type all your callbacks. Instead of creating an action for the entire callback, you can also run only the state modifying part of the callback in an action. -The advantage of this pattern is that it encourages you to not litter the place with `action`, but rather put all the state modifications as much as possible at the end of the whole process: + +`runInAction` requires you to structure your code so that state modifications happen at the end of the process as much as possible: ```javascript -mobx.configure({ enforceActions: "observed" }) +import { runInAction } from "mobx" class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } - @action fetchProjects() { this.githubProjects = [] this.state = "pending" @@ -137,25 +166,100 @@ class Store { } ``` -Note that `runInAction`'s can also be given a name as first argument. `runInAction(f)` is in fact just sugar for `action(f)()` +Note that `runInAction` can also be given a name as first argument. `runInAction(f)` is in fact just sugar for `action(f)()` + +## async / await -### async / await +Async / await based functions can initially seem confusing when you use them with +actions. Because they appear to be synchronous functions, you get the impression that `action` applies to the entire function. Unfortunately this is not the case, as `async` / `await` is just syntactic sugar around a promise based process. -Async / await based functions can initially seem confusing when starting with actions. -Because lexically they appear to synchronous functions, it gives the impression that `@action` applies to the entire function. -Which is of course not the case, as async / await is just syntactic sugar around a promise based process. -As a result, `@action` only applies to the code block until the first `await`. +As a result, `action` only applies to the code block until the first `await`. And after each `await` a new asynchronous function is started, so after each `await`, state modifying code should be wrapped as action. -This is where `runInAction` comes in handy again: + +So this code **won't work**: ```javascript -mobx.configure({ enforceActions: "observed" }) +import { runInAction } from "mobx" class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } + + async fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = await fetchGithubProjectsSomehow() + const filteredProjects = somePreprocessing(projects) + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + } +} +``` + +This code throws exceptions. We discuss various alternative approaches below to make it work again: separating out action methods, and `runInAction`. As an alternative +to `async` / `await` you can also use MobX's built-in replacement, `flow`. + +### Separate methods + +You can work around this in the same way as with promises -- call +another separate method that is an action after "await": + +```javascript +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } + + async fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = await fetchGithubProjectsSomehow() + this.fetchProjectsSuccess(projects) + } catch (error) { + this.fetchProjectsError(error) + } + } + + fetchProjectsSuccess(projects) { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + } + + fetchProjectsError(error) { + this.state = "error" + } +} +``` + +### runInAction again + +More more complicated async flow, you could instead use the `runInAction` +utility: + +```javascript +import { runInAction } from "mobx" + +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } - @action async fetchProjects() { this.githubProjects = [] this.state = "pending" @@ -176,23 +280,35 @@ class Store { } ``` -### flows +## flow instead of async/await + +An alternative approach is to use the built-in concept of `flow`. `flow` +works in the same way as `async` / `await` but is based around generators +instead. The rules are: + +- Wrap `flow` around your asynchronous function. -However, a nicer approach is to use the built-in concept of `flow`s. They use generators. Which might look scary in the beginning, but it works the same as `async` / `await`. Just use `function *` instead of `async` and `yield` instead of `await`. -The advantage of `flow` is that it is syntactically very close to async / await (with different keywords), and no manually action wrapping is needed for async parts, resulting in very clean code. +- Instead of `async` you use `function *` -`flow` can be used only as function and not as decorator. -`flow` integrates neatly with MobX development tools, so that it is easy to trace the process of the async function. +- Instead of `await` you use `yield`. + +The advantage of `flow` is that it is syntactically very close to `async` / `await` (with different keywords), and no manually action wrapping is required for async parts. + +`flow` also integrates neatly with MobX development tools, so that it is easy to trace the process of the async function. ```javascript -mobx.configure({ enforceActions: "observed" }) +import { flow } from "mobx" class Store { - @observable githubProjects = [] - @observable state = "pending" + githubProjects = [] + state = "pending" - fetchProjects = flow(function*() { - // <- note the star, this a generator function! + constructor() { + makeAutoObservable(this) + } + + // note the star, this a generator function! + fetchProjects = flow(function* () { this.githubProjects = [] this.state = "pending" try { @@ -208,6 +324,8 @@ class Store { } ``` -#### Flows can be cancelled +### Flows can be cancelled + +Flows are cancellable which means you can call `cancel()` on the returned promise. This stops the generator immediately, but any `finally` clause is still processed. The returned promise itself rejects with an instance of `FlowCancellationError` whose message is `FLOW_CANCELLED`. -Flows are cancellable, that means that you can call `cancel()` on the returned promise. This will stop the generator immediately, but any finally clause will still be processed. The returned promise itself will reject with an instance of `FlowCancellationError` (this error is exported from the package) whose message is `FLOW_CANCELLED`. Also exported is a `isFlowCancellationError(error)` helper that returns true if and only if the provided argument is a `FlowCancellationError`. +If you want to write code that catches `FlowCancellationError` you can import it from the `mobx` package. Also exported is a `isFlowCancellationError(error)` helper that returns `true` if and only if the provided argument is a `FlowCancellationError`. diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 35479daf2..91be72381 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -38,7 +38,7 @@ If you use `makeAutoObservable` you have to [exclude these methods explicitly fr ## Actions and async code There are some special rules you have to take into account when you have actions that -are asynchronous. See [Writing asynchronous actions](../best/actions.md). +are asynchronous. See [asynchronous actions](../best/actions.md). ## action.bound diff --git a/website/i18n/en.json b/website/i18n/en.json index d91ac2424..4ffb9da27 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -6,8 +6,8 @@ "tagline": "Simple, scalable state management", "docs": { "best/actions": { - "title": "Writing asynchronous actions", - "sidebar_label": "async actions & flows" + "title": "Asynchronous actions", + "sidebar_label": "Asynchronous actions" }, "best/decorators": { "title": "Decorators in MobX", From f3afd191d52e817605e3a70bca645a71549b69cf Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 14:55:23 +0200 Subject: [PATCH 0379/1043] Update todos. --- notes-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes-docs.md b/notes-docs.md index ad92904f7..df38904d4 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -31,7 +31,7 @@ Questions: Todo - [ ] Netlify preview for docs PR. -- [ ] Any code sandbox links need to be updated. jsfiddle as well. +- [ ] Any code sandbox links need to be updated. jsfiddle as well, move it to codesandbox. - [ ] Codemod might change to a new package to reduce size. Documentation needs to be updated. - [ ] There are a lot of references to external documentation resources. They can probably use a pruning. - [ ] We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? From 8955eef6ee3fff6867b3fca69e4192477e35d3b4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 14:59:29 +0200 Subject: [PATCH 0380/1043] Update this document preparing for merge. --- notes-docs.md | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index df38904d4..a477b6632 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -1,34 +1,50 @@ -Philosophy: one thing to do things +# MobX 6 docs -Questions: +I'm going through the documentation to modify it with MobX 6 changes in mind: + +- Philosophy: one way to do things. Have one through-line and have alternatives (if needed) described elsewhere. + +- Use makeObservable instead of decorators. Still document decorators, but in a separate optional section of the documentation. + +- Assume actions are enforced by default in the docs. + +- Since MobX6 brings back non-Proxy support, I also can clean up discussions of MobX 5 vs 4, assuming the old documentation will become less relevant. (of course it may need to still be available somewhere) + +There are a whole bunch of questions that arose when I was editing the docs, see +below. Writing documentation can also help clarify APIs, so hopefully my efforts can contribute to that as well. + +To see a live version of the docs, go here: + +https://deploy-preview-2382--mobx-docs.netlify.app/ + +(or click on the 'details' link in netlify/mobx-js/deploy-preview in the built status at the bottom) + +## Questions - "The props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component." - Does the props bit still apply to function component. Though computed doesn't apply anyhow, unless `useLocalStore` is in use. -- What to do about the egghead lessons? They have a reference the decorator - syntax. -> consolidate into a single page and explain the decorator story on it. - -- How to name "compatible property tracking" as opposed to proxy-based? +* How to name "compatible property tracking" as opposed to proxy-based? How does one configure it, or it is an automatic fallback? -- What to do about translations? They will be out of date. +* What to do about translations? They will be out of date. -- Is there a way to regenerate assets? flow.png for instance uses +* Is there a way to regenerate assets? flow.png for instance uses decorators and needs to be updated. -- When we introduce actions we need a link to an actions section that describes +* When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. -- How do we document `extendObservable` in the face of the existence of `makeObservable`? +* How do we document `extendObservable` in the face of the existence of `makeObservable`? -- Should peek() be brought back on arrays for non-decorator support? I have assumed +* Should peek() be brought back on arrays for non-decorator support? I have assumed it is still gone in the docs. -- The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. +* The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. -Todo +## Todo - [ ] Netlify preview for docs PR. - [ ] Any code sandbox links need to be updated. jsfiddle as well, move it to codesandbox. @@ -39,13 +55,14 @@ Todo - [ ] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. - [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar +- [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. -Fragments +## Fragments This fragment is from react-integration. I want to see about creating a new section on advanced interaction patterns. -#### Advanced interaction patterns with reactions, observables, props, etc +### Advanced interaction patterns with reactions, observables, props, etc In general we recommend to keep UI state and domain state clearly separated, and manage side effects etc either outside the components using the tools that MobX provides for them (`when`, `flow`, `reaction` etc), From be6dabc479102913ccf0b6b98bbbfee867652d32 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 15:16:53 +0200 Subject: [PATCH 0381/1043] Move the object API to utilities. --- website/sidebars.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/sidebars.json b/website/sidebars.json index 341fb1935..41d14b420 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -20,8 +20,7 @@ ], "Updating observables": [ "refguide/action", - "best/actions", - "refguide/object-api" + "best/actions" ], "Reacting to observables": [ "refguide/computed-decorator", @@ -41,6 +40,7 @@ "refguide/observe", "refguide/create-transformer", "refguide/expr", + "refguide/object-api", "refguide/mobx-utils" ], "Tips & Tricks": [ From f41557efe125afa7410cd782b40ca023ef542407 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 15:24:05 +0200 Subject: [PATCH 0382/1043] Rename computed-decorators document to computed. --- docs/refguide/action.md | 2 +- docs/refguide/api.md | 2 +- docs/refguide/{computed-decorator.md => computed.md} | 0 docs/refguide/modifiers.md | 2 +- docs/refguide/object.md | 2 +- website/i18n/en.json | 2 +- website/sidebars.json | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename docs/refguide/{computed-decorator.md => computed.md} (100%) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 91be72381..3f604fa4d 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -26,7 +26,7 @@ This ensures that intermediate or incomplete values produced during an action ar `action` also provides useful debugging information in combination with the devtools. -[setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) of [computed properties are automatically actions](computed-decorator.md). +[setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) of [computed properties are automatically actions](computed.md). ## When are functions and methods not actions? diff --git a/docs/refguide/api.md b/docs/refguide/api.md index e5b0ae61a..424424842 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -244,7 +244,7 @@ There are various `options` that can be used to control the behavior of `compute - **`set: (value) => void`** Override the setter for the computed property - **`keepAlive: boolean`** Set to true to automatically keep computed values alive, rather then suspending then when there are no observers. -[«details»](computed-decorator.md) +[«details»](computed.md) ## Actions diff --git a/docs/refguide/computed-decorator.md b/docs/refguide/computed.md similarity index 100% rename from docs/refguide/computed-decorator.md rename to docs/refguide/computed.md diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index a2b10cd03..c8c84fdc4 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -15,7 +15,7 @@ In MobX there is a set of decorators that defines how observable properties will - `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. - `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is. - `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value -- `computed`: Creates a derived property, see [`computed`](computed-decorator.md) +- `computed`: Creates a derived property, see [`computed`](computed.md) - `computed(options)`: Idem, sets additional options. - `computed.struct`: Same as `computed`, but will only notify any of it's observers when the value produced by the view is _structurally_ different from the previous value - `action`: Creates an action, see [`action`](action.md) diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 30645ba29..0ed3966d2 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -52,7 +52,7 @@ person.setAge(21) Some things to keep in mind when making objects observable: - Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties using [`makeObservable` or `makeAutoObservable`](make-observable.md). -- Property getters will be automatically turned into derived properties, just like declaring it [`computed`](computed-decorator) would do. +- Property getters will be automatically turned into derived properties, just like declaring it [`computed`](computed) would do. - `observable` is applied recursively to a whole object graph automatically. Both on instantiation and to any new values that will be assigned to observable properties in the future. Observable will not recurse into non-plain objects. - These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [modifiers](modifiers.md) section. - Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values. diff --git a/website/i18n/en.json b/website/i18n/en.json index 4ffb9da27..5ac6bfa25 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -96,7 +96,7 @@ "title": "Boxed Values", "sidebar_label": "boxed values" }, - "refguide/computed-decorator": { + "refguide/computed": { "title": "(@)computed", "sidebar_label": "(@)computed" }, diff --git a/website/sidebars.json b/website/sidebars.json index 41d14b420..fb3ac12c9 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -23,7 +23,7 @@ "best/actions" ], "Reacting to observables": [ - "refguide/computed-decorator", + "refguide/computed", "refguide/autorun", "refguide/when", "refguide/reaction", From f34cf197cdbdf3b16eac31eb0553b49c40b94aa4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 16:32:51 +0200 Subject: [PATCH 0383/1043] Update the computed document. --- docs/refguide/computed.md | 353 ++++++++++++++++++-------------------- notes-docs.md | 32 ++-- website/i18n/en.json | 4 +- 3 files changed, 184 insertions(+), 205 deletions(-) diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 4469546ce..8362a52fb 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -1,75 +1,69 @@ --- -title: (@)computed -sidebar_label: (@)computed +title: computed +sidebar_label: computed hide_title: true --- -# (@)computed - -
    - -
    - egghead.io lesson 3: computed values -
    -
    - -
    - Hosted on egghead.io -
    +# computed Computed values are values that can be derived from the existing state or other computed values. Conceptually, they are very similar to formulas in spreadsheets. Computed values can't be underestimated, as they help you to make your actual modifiable state as small as possible. Besides that they are highly optimized, so use them wherever possible. -Don't confuse `computed` with `autorun`. They are both reactively invoked expressions, -but use `@computed` if you want to reactively produce a _value_ that can be used by other observers and -`autorun` if you don't want to produce a new value but rather want to achieve an _effect_. -For example imperative side effects like logging, making network requests etc. - Computed values are automatically derived from your state if any value that affects them changes. -Computed values can be optimized away in many cases by MobX as they are assumed to be pure. -For example, a computed property won't re-run if none of the data used in the previous computation changed. -Nor will a computed property re-run if is not in use by some other computed property or reaction. -In such cases it will be suspended. +MobX can optimize the calculation of computed values away in many cases because +this calculation is assumed to be pure. +For example, a computed property won't re-run if no observable data used in the previous computation changed. +Nor will a computed property re-run if is not in use by some other computed property or a reaction. In such cases it is suspended. -This automatic suspension is very convenient. If a computed value is no longer observed, for example the UI in which it was used no longer exists, MobX can automatically garbage collect it. This differs from `autorun`'s values where you must dispose of them yourself. -It sometimes confuses people new to MobX, that if you create a computed property but don't use it anywhere in a reaction, it will not cache its value and recompute more often than seems necessary. -However, in real life situations this is by far the best default, and you can always forcefully keep a computed value awake if you need to, by using either [`observe`](observe.md) or [`keepAlive`](https://github.com/mobxjs/mobx-utils#keepalive). +If a computed value is no longer observed, for example because the UI in which it was used no longer exists, MobX automatically garbage collects it. -Note that `computed` properties are not enumerable. Nor can they be overwritten in an inheritance chain. +To create a `computed` property, you need to use a JavaScript [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get). `computed` +properties cannot use arguments (though see [computed with arguments](computed.md#computed-with-arguments)). -## `@computed` +Note that `computed` properties are not [enumerable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties). Nor can they be overwritten in an inheritance chain. -If you have [decorators enabled](../best/decorators.md) you can use the `@computed` decorator on any getter of a class property to declaratively create computed properties. +Don't confuse `computed` with [`autorun`](autorun.md). They are both reactively invoked expressions, but use `computed` if you want to reactively produce a _value_ that can be used by other observers and `autorun` if you don't want to produce a new value but rather want to achieve an _effect_. For example imperative side effects like logging, making network requests etc. + +## Declaring a getter as `computed` + +You can use `makeObservable` to declare a getter as computed: ```javascript -import { observable, computed } from "mobx" +import { makeObservable, observable, computed } from "mobx" class OrderLine { - @observable price = 0 - @observable amount = 1 + price = 0 + amount = 1 constructor(price) { + makeObservable(this, { + price: observable, + amount: observable, + total: computed + }) this.price = price } - @computed get total() { + get total() { return this.price * this.amount } } ``` -Otherwise, use `decorate` to introduce them: +If you use `makeAutoObservable`, all getters are automatically declared +computed: ```javascript -import { decorate, observable, computed } from "mobx" +import { makeAutoObservable } from "mobx" class OrderLine { price = 0 amount = 1 constructor(price) { + makeAutoObservable(this) this.price = price } @@ -77,14 +71,9 @@ class OrderLine { return this.price * this.amount } } -decorate(OrderLine, { - price: observable, - amount: observable, - total: computed -}) ``` -Both `observable.object` and `extendObservable` will automatically infer getter properties to be computed properties, so the following suffices: +Both `observable.object` and `extendObservable` will automatically infer getter properties to be computed properties as well, so the following suffices: ```javascript const orderLine = observable.object({ @@ -96,127 +85,189 @@ const orderLine = observable.object({ }) ``` -## Computed values are not getters +## Setters for computed values -The previous computed examples in the `OrderLine` class use the `get` keyword however, they generally should not be accessed directly as a getter. This can be a source of confusion to users new to Mobx from other derived cascading data layers like Reselect. The following code demonsrates the issue. +It is possible to define a [setter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) for computed values as well. Note that these setters cannot be used to alter the value of the computed property directly, +but they can be used as 'inverse' of the derivation. For example: -``` -const Ol = new OrderLine(2.00) +```javascript +class Foo { + length = 2 -// don't do this. -// avoid accessing Ol.total directly -// it will recompute everytime. -setInterval(() => { - console.log(Ol.total); -}, 60); + constructor() { + makeAutoObservable(this) + } + + get squared() { + return this.length * this.length + } + set squared(value) { + //this is automatically an action, no annotation necessary + this.length = Math.sqrt(value) + } +} ``` -As long as a computed value is not used by a reaction, it is not memoized and so it executes everytime it is accessed just like a normal eager evaluating function. This can cause performance degredation if a computed value is read high in a frequency loop like `requestAnimationFrame`. MobX can be configured to report an error when computeds are being access directly by using the `computedRequiresReaction` option +_Note: always define the setter *after* the getter, some TypeScript versions are known to declare two properties with the same name otherwise._ -```javascript -configure({ - computedRequiresReaction: true -}) -``` +## Options for `computed` + +You can pass an `options` argument to `computed`: + +- `name`: String, the debug name used in spy and the MobX devtools +- `context`: The `this` that should be used in the provided expression +- `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the options argument passed to `computed` is a function, this is assumed to be a setter. +- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). +- `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read its value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it causes the computed to throw, instead of doing an expensive re-evalution. +- `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ + +A shortcut to declare a computed for structural comparison is to use `computed.struct`. + +### Built-in comparers + +MobX provides four built-in `comparer`s which should cover most needs: + +- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. +- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. +- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. +- `comparer.shallow`: Performs shallow structural comparison to determine if two values are the same. -Though this restriction is confusing and contradictory Computeds can be altered to work in a direct access manner with some of the following methods... +## Error handling -### Computed memoization with reactions +If a computed value throws an exception during its computation, this exception is caught and rethrown each time its value is read. This is what you would expect. -A computed value should always be read by a reaction. Reading a computed value directly will cause it to recompute which can be expensive, depending on the how complex the derived result is. The following code uses the previous `OrderLine` class example and memoizes the `total` value so that it can be read directly. +It is strongly recommended to always throw `Error`'s, so that the original stack trace is preserved. E.g.: `throw new Error("Uhoh")` instead of `throw "Uhoh"`. +Throwing exceptions doesn't break tracking, so it is possible for computed values to recover from exceptions. + +Example: ```javascript -class OrderLine { - @observable price = 0 - @observable amount = 1 +class Divider { + constructor(x, y) { + this.x = x + this.y = y + makeAutoObservable(this) + } - constructor(price) { - this.price = price - // When computed total changes - // cache value to this.total - autorun(() => { - this.total = this.computedTotal - }) + recover() { + this.y = 1 } - @computed get computedTotal() { - return this.price * this.amount + divideByZero() { + this.y = 0 + } + + get divided() { + if (this.x === 0) { + throw new Error("Division by zero") + } + return x / y } } -const Ol = new OrderLine(2.0) +const divider = new Divider(3, 1) -// this is now ok -// because total will be cached from computeTotal -// when its dependencies are updated -setInterval(() => { - console.log(Ol.total) -}, 60) +divider.divided // returns 3 + +// trigger action that causes divided to throw +divider.divideByZero() + +divider.divided // Throws: Division by zero +divider.divided // Throws: Division by zero + +// trigger action that makes error go away +divider.recover() + +divided.divided // Recovered; Returns 1.5 ``` -### Computed KeepAlive +## Computed with arguments -A computed may be initalized with the `keepAlive` flag. `keepAlive` will cause the computed to act as though it is observed by a reaction. This is a convience method and `keepAlive` does the same as the autorun in example above, but it does it a lot more efficient (it can for example keep the computed alive, but defer computation until somebody actually reads the value, something the autorun can't do). +Sometimes you might want to have a computed value that takes one or more arguments. +In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: ```javascript -class OrderLine { - @observable price = 0 - @observable amount = 1 +import { observable } from "mobx" +import { computedFn } from "mobx-utils" - constructor(price) { - this.price = price - } +class Todos { + todos = [] - @computed({ keepAlive: true }) - get total() { - return this.price * this.amount + constructor() { + makeAutoObservable(this) } + + getAllTodosByUser = computedFn(function getAllTodosByUser(userId) { + return this.todos.filter(todo => todo.user === userId) + }) } ``` -### Autorun vs keepAlive +Note: don't use arrow functions as the `this` would be incorrect. -The only case where autorun would be more beneficial than a `keepAlive` computed, is during a manual managment case in which you call the returned disposer to nicely clean up the computed value if it is no longer used typically you would do that in a destructor of a class for example. +For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) -## Setters for computed values +## Accessing computed values outside of reactions -It is possible to define a setter for computed values as well. Note that these setters cannot be used to alter the value of the computed property directly, -but they can be used as 'inverse' of the derivation. For example: +The optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md)). + +Reading a computed value directly causes it to recompute which can be expensive, depending on the how complex the derived result is. + +It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. + +It works this way because you expect computed properties to work outside of reactions, but MobX also avoids unnecessarily updating computed values that are not in use. + +The following code demonstrates the issue. ```javascript -const orderLine = observable.object({ - price: 0, - amount: 1, - get total() { - return this.price * this.amount - }, - set total(total) { - this.price = total / this.amount // infer price from total - } +const line = new OrderLine(2.0) + +// if you access line.total directly it recomputed every time +// this is not ideal +setInterval(() => { + console.log(line.total) +}, 60) +``` + +This can cause performance degradation if a computed value is read in a high frequency loop like `requestAnimationFrame`. + +MobX can be configured to report an error when computeds are being access directly by using the `computedRequiresReaction` option + +```javascript +configure({ + computedRequiresReaction: true }) ``` -And similarly +You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](https://github.com/mobxjs/mobx-utils#keepalive) or by using [`observe`](observe.md). + +### Computed `keepAlive` + +A computed may be initalized with the `keepAlive` flag. `keepAlive` causes the computed to act as though it is observed by a reaction: ```javascript -class Foo { - @observable length = 2 - @computed get squared() { - return this.length * this.length +class OrderLine { + price = 0 + amount = 1 + + constructor(price) { + makeAutoObservable(this, { total: computed({ keepAlive: true }) }) + this.price = price } - set squared(value) { - //this is automatically an action, no annotation necessary - this.length = Math.sqrt(value) + + @computed({ keepAlive: true }) + get total() { + return this.price * this.amount } } ``` -_Note: always define the setter *after* the getter, some TypeScript versions are known to declare two properties with the same name otherwise._ +_Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ ## `computed(expression)` as function `computed` can also be invoked directly as function. -Just like `observable.box(primitive value)` creates a stand-alone observable. +Just like [`observable.box`](boxed.md) creates a stand-alone observable. Use `.get()` on the returned object to get the current value of the computation, or `.observe(callback)` to observe its changes. This form of `computed` is not used very often, but in some cases where you need to pass a "boxed" computed value around it might prove useful. @@ -234,80 +285,6 @@ name.set("Dave") // prints: 'DAVE' ``` -## Options for `computed` - -When using `computed` as modifier or as box, it accepts a second options argument with the following optional arguments: - -- `name`: String, the debug name used in spy and the MobX devtools -- `context`: The `this` that should be used in the provided expression -- `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the second argument passed to `computed` is a function, this is assumed to be a setter. -- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). -- `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read it's value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it will cause the computed to throw, instead of doing an expensive re-evalution. -- `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can easily lead to memory leaks as it will result in every observable used by this computed value, keeping the computed value in memory!_ - -## `@computed.struct` for structural comparison - -The `@computed` decorator does not take arguments. If you want to to create a computed property which does structural comparison, use `@computed.struct`. - -## Built-in comparers - -MobX provides four built-in `comparer`s which should cover most needs: - -- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. -- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. -- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. -- `comparer.shallow`: Performs shallow structural comparison to determine if two values are the same. - ## Computed values run more often than expected Please check the [`pitfalls`](https://mobx.js.org/best/pitfalls.html#computed-values-run-more-often-than-expected) section if you experience this. - -## Note on error handling - -If a computed value throws an exception during its computation, this exception will be caught and rethrown any time its value is read. -It is strongly recommended to always throw `Error`'s, so that the original stack trace is preserved. E.g.: `throw new Error("Uhoh")` instead of `throw "Uhoh"`. -Throwing exceptions doesn't break tracking, so it is possible for computed values to recover from exceptions. - -Example: - -```javascript -const x = observable(3) -const y = observable(1) -const divided = computed(() => { - if (y.get() === 0) throw new Error("Division by zero") - return x.get() / y.get() -}) - -divided.get() // returns 3 - -y.set(0) // OK -divided.get() // Throws: Division by zero -divided.get() // Throws: Division by zero - -y.set(2) -divided.get() // Recovered; Returns 1.5 -``` - -## Computeds with arguments - -Sometimes you might want to have a computed value that takes one or more arguments. -In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: - -```typescript -// Parameterized computed views: -// Create computed's and store them in a cache -import { observable } from "mobx" -import { computedFn } from "mobx-utils" - -class Todos { - @observable todos = [] - - getAllTodosByUser = computedFn(function getAllTodosByUser(userId) { - return this.todos.filter(todo => todo.user === userId) - }) -} -``` - -Note: don't use arrow functions as the `this` would be incorrect. - -For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) diff --git a/notes-docs.md b/notes-docs.md index a477b6632..232c03088 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -21,28 +21,29 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ ## Questions -- "The props object and the state object of an observer component are automatically - made observable to make it easier to create @computed properties that derive from props inside such a component." - Does the props bit still apply to function - component. Though computed doesn't apply anyhow, unless `useLocalStore` is in - use. +- "The props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component." Does the props bit still apply to function component. Though computed doesn't apply anyhow, unless `useLocalStore` is in use. -* How to name "compatible property tracking" as opposed to proxy-based? - How does one configure it, or it is an automatic fallback? +- How to name "compatible property tracking" as opposed to proxy-based? How does one configure it, or it is an automatic fallback? -* What to do about translations? They will be out of date. +- What to do about translations? They will be out of date. -* Is there a way to regenerate assets? flow.png for instance uses - decorators and needs to be updated. +- Is there a way to regenerate assets? flow.png for instance uses decorators and needs to be updated. -* When we introduce actions we need a link to an actions section that describes - how to turn off strict state reinforcing. +- When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. -* How do we document `extendObservable` in the face of the existence of `makeObservable`? +- How do we document `extendObservable` in the face of the existence of `makeObservable`? -* Should peek() be brought back on arrays for non-decorator support? I have assumed - it is still gone in the docs. +- Should peek() be brought back on arrays for non-decorator support? I have assumed it is still gone in the docs. -* The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. +- The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. + +- Should this `computedRequiresAction` be the default? Or not have it at all? + +- Can you configure `computed` with options when used with `makeObservable`? I assume yes. + +- I am unclear about the order of `makeObservable` / `makeAutoObservable` in the constructor. Does it matter? Is there a good convention? What happens if you don't set a prop and then already talk about it in `makeObservable`? What about `makeAutoObservable`? + +- Does 'makeAutoObservable' work with computedFn? Should we be able to declare this explicitly with `makeObservable`? ## Todo @@ -56,6 +57,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. - [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. +- [ ] Consider breaking up computed.md into a basic and "advanced" document. ## Fragments diff --git a/website/i18n/en.json b/website/i18n/en.json index 5ac6bfa25..b4687ccac 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -97,8 +97,8 @@ "sidebar_label": "boxed values" }, "refguide/computed": { - "title": "(@)computed", - "sidebar_label": "(@)computed" + "title": "computed", + "sidebar_label": "computed" }, "refguide/create-transformer": { "title": "createTransformer", From 42653a6f0a24a6e0a4efb698a8b80c2db2bcc02c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 1 Jul 2020 16:57:24 +0200 Subject: [PATCH 0384/1043] A plan for the structure. --- notes-docs.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/notes-docs.md b/notes-docs.md index 232c03088..374d1be00 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -58,6 +58,103 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. - [ ] Consider breaking up computed.md into a basic and "advanced" document. +- [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? + +## Structure thoughts + +I've made a start of introducing a new structure. Right now the directories +are rather flat and filenames don't always reflect the titles. This encourages people to add and modify documentation without regard to structure, which makes it easy to reference things that haven't been introduced yet. I think it would help to adjust the directory structure to reflect the content. + +The goal of this structure is: good flow that introduces the most important bits +first to a typical React developer. In each directory, have the most important +bits come earlier, the less important or advanced bits later. + +Here is a proposed structure: + +- Basics + + - Introduction + + - Installation + + - The gist of MobX (or quickstart?) + + - Concepts & Principles + + - FAQ + +- MobX and React + + - React integration + + - Optimizing React components + + - React class components + +- Making things observable + + - makeObservable / makeAutoObservable + + - observable + + - objects + + - arrays + + - maps + +- Updating observables + + - action + + - Asynchronous actions + +- Computed values + + - computed + + - Computed options + +- Organizing your application + + - Best practices + + - Defining data stores (mention mobx-state-tree, mobx-keystone) + +- Reacting to observables + + - Understanding what MobX reacts to + + - autorun + + - when + + - reaction + +- Debugging MobX + + - toJS + + - Common Pitfalls + + - Using trace for debugging + + - Spy + +- Advanced topics + + - Decorators in MobX + + - Limitations without Proxy Support + + - Boxed values + + - Object API + +Mine the API docs page to deduplicate content and move it into the +rest of the docs. + +API docs page (with one-liners and links) linked somewhere in the page layout. ## Fragments From d523576d3dcedd27caedb353c9aecb32470a7da3 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 16:49:53 +0100 Subject: [PATCH 0385/1043] Codemod fixes --- codemod/undecorate.spec.ts | 221 ++++++++++++++++++++++++++++++++++++- codemod/undecorate.ts | 104 ++++++++++++++--- notes.md | 13 ++- src/api/makeObservable.ts | 6 +- 4 files changed, 313 insertions(+), 31 deletions(-) diff --git a/codemod/undecorate.spec.ts b/codemod/undecorate.spec.ts index 23469b356..e0c22e9b2 100644 --- a/codemod/undecorate.spec.ts +++ b/codemod/undecorate.spec.ts @@ -2,8 +2,15 @@ import { applyTransform } from "jscodeshift/dist/testUtils" const dedent = require("dedent-js") import * as u from "./undecorate" -function convert(source: string): string { - return applyTransform(u, {}, { source: dedent(source), path: "unittest" }, {}) +function convert( + source: string, + options: { + ignoreImports?: boolean + keepDecorators?: boolean + decoratorsAfterExport?: boolean + } = {} +): string { + return applyTransform(u, options, { source: dedent(source), path: "unittest" }, {}) } describe("general", () => { @@ -34,6 +41,59 @@ describe("general", () => { `) }) + test("basic observable - skip imports", () => { + expect( + convert( + ` + class Box { + /*0*/ + @observable + /*1*/ + field /*2 */ = /*3*/ 1 /*4*/ + }`, + { ignoreImports: true } + ) + ).toMatchInlineSnapshot(` + "class Box { + /*0*/ + /*1*/ + field /*2 */ = /*3*/ 1; /*4*/ + + constructor() { + makeObservable(this, { + field: observable + }); + } + }" + `) + }) + + test("basic observable - skip imports - keepDecorators", () => { + expect( + convert( + ` + class Box { + /*0*/ + @observable + /*1*/ + field /*2 */ = /*3*/ 1 /*4*/ + }`, + { ignoreImports: true, keepDecorators: true } + ) + ).toMatchInlineSnapshot(` + "class Box { + /*0*/ + @observable + /*1*/ + field /*2 */ = /*3*/ 1 /*4*/ + + constructor() { + makeObservable(this); + } + }" + `) + }) + test("class with method and extends", () => { expect( convert(` @@ -765,7 +825,7 @@ describe("decorate", () => { `) }) - test("handle non-classes", () => { + test("handle non-classes - 1", () => { expect( convert(` import { observable, decorate, computed, action } from "mobx" @@ -793,7 +853,7 @@ describe("decorate", () => { `) }) - test("handle non-classes", () => { + test("handle non-classes - 2", () => { expect( convert(` import { observable, decorate, computed, action } from "mobx" @@ -813,3 +873,156 @@ describe("decorate", () => { `) }) }) + +test("handle privates in classes", () => { + expect( + convert( + ` + import { observable, decorate, computed, action } from "mobx" + +class TryToGetThis { + @observable + private privateField1: number = 1 + @observable + protected privateField2 = 1 + @observable + public publicField: string = "test" + } + ` + ) + ).toMatchInlineSnapshot(` + "import { observable, computed, action, makeObservable } from \\"mobx\\" + + class TryToGetThis { + private privateField1: number = 1; + protected privateField2 = 1; + public publicField: string = \\"test\\"; + + constructor() { + makeObservable(this, { + privateField1: observable, + privateField2: observable, + publicField: observable + }); + } + }" + `) +}) + +describe("@observer", () => { + test("class comp", () => { + expect( + convert(` + import {observer} from 'mobx-react' + + /* 1 */ + @observer /* 2 */ class X extends React.Component { + + } + + `) + ).toMatchInlineSnapshot(` + "import {observer} from 'mobx-react' + + /* 1 */ + const X = observer(class /* 2 */ X extends React.Component { + + });" + `) + }) + + test("class comp with export before", () => { + expect( + convert(` + import {observer} from 'mobx-react-lite' + + + /* 1 */ + @observer /* 2 */ export /* 3 */ class X extends React.Component { + + } + + `) + ).toMatchInlineSnapshot(` + "import {observer} from 'mobx-react-lite' + + + /* 1 */ + export const X = observer(class /* 2 */ /* 3 */ X extends React.Component { + + });" + `) + }) + + test("class comp with export after", () => { + expect( + convert( + ` + import {observer} from 'mobx-react-lite' + + + /* 1 */ + export /* 2 */ @observer /* 3 */ class X extends React.Component { + + } + + `, + { decoratorsAfterExport: true } + ) + ).toMatchInlineSnapshot(` + "import {observer} from 'mobx-react-lite' + + + /* 1 */ + export const X = observer(class /* 2 */ /* 3 */ X extends React.Component { + + });" + `) + }) + + test("class comp with inject", () => { + expect( + convert(` + import {observer, inject} from 'mobx-react' + + + /* 1 */ + @inject("test") /* 2 */ export /* 3 */ class X extends React.Component { + + } + + `) + ).toMatchInlineSnapshot(` + "import {observer, inject} from 'mobx-react' + + + /* 1 */ + export const X = inject(\\"test\\")(class /* 2 */ /* 3 */ X extends React.Component { + + });" + `) + }) + + test("class comp with inject and observer", () => { + expect( + convert(` + import {observer, inject} from 'mobx-react' + + + /* 1 */ + @inject("test") @observer /* 2 */ export /* 3 */ class X extends React.Component { + + } + + `) + ).toMatchInlineSnapshot(` + "import {observer, inject} from 'mobx-react' + + + /* 1 */ + export const X = inject(\\"test\\")(observer(class /* 2 */ /* 3 */ X extends React.Component { + + }));" + `) + }) +}) diff --git a/codemod/undecorate.ts b/codemod/undecorate.ts index 46eb5ec39..daf1ae92a 100644 --- a/codemod/undecorate.ts +++ b/codemod/undecorate.ts @@ -10,7 +10,8 @@ import { ObjectExpression } from "jscodeshift" -const validDecorators = ["action", "observable", "computed"] +const validPackages = ["mobx", "mobx-react", "mobx-react-lite"] +const validDecorators = ["action", "observable", "computed", "observer", "inject"] const babylon = require("@babel/parser") @@ -22,12 +23,12 @@ const defaultOptions = { tokens: true, plugins: [ // "estree", + ["decorators", { decoratorsBeforeExport: true }], "asyncGenerators", "bigInt", "classProperties", "classPrivateProperties", "classPrivateMethods", - ["decorators", { decoratorsBeforeExport: true }], "legacy-decorators", "doExpressions", "dynamicImport", @@ -50,15 +51,20 @@ const defaultOptions = { export const parser = { parse(code) { + // @ts-ignore + defaultOptions.plugins[0][1].decoratorsBeforeExport = !!decoratorsBeforeExport return babylon.parse(code, defaultOptions) } } +let decoratorsBeforeExport = true // hack to get the options into the parser + export default function tranform( fileInfo: FileInfo, api: API, - options?: { ignoreImports: boolean; keepDecorators: boolean } + options?: { ignoreImports?: boolean; keepDecorators?: boolean; decoratorsAfterExport?: boolean } ): any { + decoratorsBeforeExport = !options?.decoratorsAfterExport const j = api.jscodeshift const superCall = j.expressionStatement(j.callExpression(j.super(), [])) const source = j(fileInfo.source) @@ -69,7 +75,7 @@ export default function tranform( let usesDecorate = options?.ignoreImports ? true : false source.find(j.ImportDeclaration).forEach(im => { - if (im.value.source.value === "mobx") { + if (validPackages.includes(im.value.source.value as string)) { let decorateIndex = -1 im.value.specifiers.forEach((specifier, idx) => { // imported decorator @@ -112,8 +118,8 @@ export default function tranform( if (!j.Identifier.check(target)) { // not targetting a class, just swap it with makeObservable changed = true - // @ts-ignore - callPath.value.callee.name = "observable" + // @ts-ignore // TODO: or "observable" ? + callPath.value.callee.name = "makeObservable" return } const declarations = callPath.scope.getBindings()[target.name] @@ -128,13 +134,13 @@ export default function tranform( if (!j.ClassDeclaration.check(targetDeclaration)) { // not targetting a class, just swap it with makeObservable changed = true - // @ts-ignore - callPath.value.callee.name = "observable" + // @ts-ignore // TODO: or "observable" ? + callPath.value.callee.name = "makeObservable" return } const clazz: ClassDeclaration = targetDeclaration // @ts-ignore - createConstructor(clazz, decorators) + createConstructor(clazz, decorators, []) // Remove the callPath (and wrapping expressionStatement) if (canRemoveDecorateCall) { @@ -144,7 +150,7 @@ export default function tranform( }) } - // rewrite all class decorators + // rewrite all class proprty decorators source.find(j.ClassDeclaration).forEach(clazzPath => { const clazz = clazzPath.value const effects = { @@ -160,21 +166,63 @@ export default function tranform( if (effects.membersMap.length) { changed = true + let privates: string[] = [] const members = j.objectExpression( - effects.membersMap.map(([key, value, computed]) => { + effects.membersMap.map(([key, value, computed, isPrivate]) => { // loose the comments, as they are already in the field definition const { comments, ...k } = key const { comments: comments2, ...v } = value const prop = j.objectProperty(k, v) prop.computed = !!computed + if (isPrivate) privates.push(k.name) return prop }) ) - createConstructor(clazz, members) + createConstructor(clazz, members, privates) needsInitializeImport = true } }) - if (needsInitializeImport) { + + // rewrite all @observer / @inject + if (!options?.keepDecorators && decoratorsUsed.has("observer")) { + source.find(j.ClassDeclaration).forEach(clazzPath => { + const clazz = clazzPath.value + // find @observer + const observerDecorator = (clazz as any).decorators?.find( + dec => + j.Decorator.check(dec) && + j.Identifier.check(dec.expression) && + dec.expression.name === "observer" + ) + // find @inject + const injectDecorator = (clazz as any).decorators?.find( + dec => + j.Decorator.check(dec) && + j.CallExpression.check(dec.expression) && + j.Identifier.check(dec.expression.callee) && + dec.expression.callee.name === "inject" + ) + if (!observerDecorator && !injectDecorator) return + + // re-create the class + let newClassDefExpr: any = j.classExpression(clazz.id, clazz.body, clazz.superClass) + // wrap with observer + if (observerDecorator) + newClassDefExpr = j.callExpression(j.identifier("observer"), [newClassDefExpr]) + // wrap with inject + if (injectDecorator) + newClassDefExpr = j.callExpression(injectDecorator.expression, [newClassDefExpr]) + + changed = true + const decl = j.variableDeclaration("const", [ + j.variableDeclarator(j.identifier(clazz.id!.name), newClassDefExpr) + ]) + decl.comments = clazz.comments + clazzPath.replace(decl) + }) + } + + if (needsInitializeImport && !options?.ignoreImports) { // @ts-ignore const mobxImport = source .find(j.ImportDeclaration) @@ -200,9 +248,12 @@ export default function tranform( } function handleProperty( - property: ClassProperty & /* | or ClassMethod */ { decorators: Decorator[] }, + property: ClassProperty & /* | or ClassMethod */ { + decorators: Decorator[] + accessibility: "private" | "protected" | "public" + }, effects: { - membersMap: [[any, any, boolean]] + membersMap: [[any, any, boolean, boolean]] }, clazzPath: ASTPath ): ClassProperty | ClassMethod { @@ -230,11 +281,20 @@ export default function tranform( if (options?.keepDecorators !== true) property.decorators.splice(0) - effects.membersMap.push([property.key, expr, property.computed]) + effects.membersMap.push([ + property.key, + expr, + property.computed, + property.accessibility === "private" || property.accessibility === "protected" + ]) return property } - function createConstructor(clazz: ClassDeclaration, members: ObjectExpression) { + function createConstructor( + clazz: ClassDeclaration, + members: ObjectExpression, + privates: string[] + ) { // makeObservable(this, { members }) const initializeObservablesCall = j.expressionStatement( j.callExpression( @@ -242,6 +302,16 @@ export default function tranform( options?.keepDecorators ? [j.thisExpression()] : [j.thisExpression(), members] ) ) + if (privates.length) { + // @ts-ignore + initializeObservablesCall.expression.typeArguments = j.tsTypeParameterInstantiation([ + j.tsTypeReference(j.identifier(clazz.id!.name)), + j.tsUnionType( + // @ts-ignore + privates.map(member => j.tsLiteralType(j.stringLiteral(member))) + ) + ]) + } const needsSuper = !!clazz.superClass let constructorIndex = clazz.body.body.findIndex( diff --git a/notes.md b/notes.md index 8c319cef8..4194e7ba6 100644 --- a/notes.md +++ b/notes.md @@ -1,9 +1,9 @@ ## Feature work -- [ ] Build process +- [x] Build process - [x] kill v4 / v5 separation - [x] TSDX build process -- [ ] Smaller build +- [x] Smaller build - [x] fixup build, restore asset bundling - [x] ~create prod esm build?~ - [x] minimal dev errors @@ -19,10 +19,11 @@ - [x] codemod babel - [x] codemod leave decorators - [x] migrate decorate calls as well - - [ ] migrate privates correctly - - [ ] migrate `@observer` calls - - [ ] unit tests for `ignoreImports` - - [ ] unit tests for `keepDecorators` + - [x] migrate privates correctly + - [x] migrate `@observer` calls + - [c] migrate `@inject` calls + - [x] unit tests for `ignoreImports` + - [x] unit tests for `keepDecorators` - [ ] put in separate package - [ ] ES5 support - [x] combine with ES5? diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index 92962eab7..9dcce315a 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -148,9 +148,8 @@ export function makeProperty( default: if (__DEV__) die( - `invalid decorator '${ - annotation.annotationType_ ?? annotation - }' for '${key.toString()}'` + `invalid decorator '${annotation.annotationType_ ?? + annotation}' for '${key.toString()}'` ) } } @@ -187,7 +186,6 @@ export function makeObservable( target: T, excludes?: AnnotationsMap, From ec2f58ccf0f1743a6ee3f93c63c15146f6188b73 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 22:23:08 +0100 Subject: [PATCH 0386/1043] Moved undecorate to separate package --- .circleci/config.yml | 2 +- notes.md | 4 +- package.json | 4 +- packages/mobx-undecorate/LICENSE | 21 + packages/mobx-undecorate/README.md | 24 + .../__tests__}/undecorate.spec.ts | 2 +- packages/mobx-undecorate/cli.js | 17 + packages/mobx-undecorate/package.json | 67 + .../mobx-undecorate/src}/undecorate.ts | 0 packages/mobx-undecorate/yarn.lock | 2265 +++++++++++++++++ yarn.lock | 30 +- 11 files changed, 2400 insertions(+), 36 deletions(-) create mode 100644 packages/mobx-undecorate/LICENSE create mode 100644 packages/mobx-undecorate/README.md rename {codemod => packages/mobx-undecorate/__tests__}/undecorate.spec.ts (99%) create mode 100644 packages/mobx-undecorate/cli.js create mode 100644 packages/mobx-undecorate/package.json rename {codemod => packages/mobx-undecorate/src}/undecorate.ts (100%) create mode 100644 packages/mobx-undecorate/yarn.lock diff --git a/.circleci/config.yml b/.circleci/config.yml index 4eb06efa5..7c7d4e09e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -87,7 +87,7 @@ jobs: - attach_workspace: at: . - - run: yarn test:codemod + - run: cd packages/mobx-undecorate && yarn && yarn test test-size: executor: my-executor diff --git a/notes.md b/notes.md index 4194e7ba6..bced398f0 100644 --- a/notes.md +++ b/notes.md @@ -13,7 +13,7 @@ - [x] add **PURE** annotations? - [x] extract utils for getOwnPropertyDescriptor and defineProperty - [x] configure property mangling like in Immer. Will it save anything? -- [ ] code mod +- [x] code mod - [x] code mod, run on v4 tests? - [x] codemod TS - [x] codemod babel @@ -24,7 +24,7 @@ - [c] migrate `@inject` calls - [x] unit tests for `ignoreImports` - [x] unit tests for `keepDecorators` - - [ ] put in separate package + - [x] put in separate package - [ ] ES5 support - [x] combine with ES5? - [x] backport tests and code to v4(6) diff --git a/package.json b/package.json index 94ad0789d..5deb9a3f2 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test:coverage": "yarn test -i --coverage", "test:performance": "PERSIST=true time node --expose-gc test/perf/index.js", "test:size": "yarn build && yarn import-size --report . observable computed autorun action", - "test:codemod": "jest --testRegex 'codemod/.*spec' codemod/undecorate.spec.ts", + "test:codemod": "cd packages/mobx-undecorate && yarn test", "prettier": "prettier --write **/*.{js,ts,md}", "prebuild": "rimraf lib", "build": "tsdx build --name mobx --format esm,cjs,umd", @@ -65,14 +65,12 @@ "@babel/preset-typescript": "^7.9.0", "@babel/runtime": "^7.9.2", "@types/jest": "^25.2.1", - "@types/jscodeshift": "^0.7.0", "@types/node": "^11.15.12", "@typescript-eslint/eslint-plugin": "^2.29.0", "@typescript-eslint/parser": "^2.29.0", "babel-jest": "^25.4.0", "conditional-type-checks": "^1.0.5", "coveralls": "^3.1.0", - "dedent-js": "^1.0.1", "eslint": "^6.8.0", "flow-bin": "^0.123.0", "husky": "^4.2.5", diff --git a/packages/mobx-undecorate/LICENSE b/packages/mobx-undecorate/LICENSE new file mode 100644 index 000000000..b58becae8 --- /dev/null +++ b/packages/mobx-undecorate/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Michel Weststrate + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/mobx-undecorate/README.md b/packages/mobx-undecorate/README.md new file mode 100644 index 000000000..0345bed43 --- /dev/null +++ b/packages/mobx-undecorate/README.md @@ -0,0 +1,24 @@ +# mobx-undecorate + +Converts MobX 5 to MobX 6 code + +Running this code mod: + +Go to the folder with your source files and run `npx mobx-undecorate`. + +This package converts the following MobX 4/5 API's to their MobX 6 equivalent + +- `@computed` +- `@action` +- `@observable` +- `@observer` +- `@inject` +- `decorate + +### Options + +The following flags are accepted: + +- `--ignoreImports` Normally the codemod will only convert decorators if they are imported from a mobx package. This flag ignores checking for imports and converts all `@computed`, `@action`, `@observable`, `@observer` and `@inject` calls. +- `--keepDecorators` doesn't rewrite decorators but keeps them as is. But still does generate the required `makeObservable` calls. Use this option if you convert to MobX 6 but will keep using decorators. +- `--decoratorsAfterExport`: set this flag only if you have `decoratorsBeforeExport: false` in your Babel configuration. (Otherwise you will get an error like `SyntaxError: Decorators must be placed *before* the 'export' keyword. You can set the 'decoratorsBeforeExport' option to false`) diff --git a/codemod/undecorate.spec.ts b/packages/mobx-undecorate/__tests__/undecorate.spec.ts similarity index 99% rename from codemod/undecorate.spec.ts rename to packages/mobx-undecorate/__tests__/undecorate.spec.ts index e0c22e9b2..2ac1d179a 100644 --- a/codemod/undecorate.spec.ts +++ b/packages/mobx-undecorate/__tests__/undecorate.spec.ts @@ -1,6 +1,6 @@ import { applyTransform } from "jscodeshift/dist/testUtils" const dedent = require("dedent-js") -import * as u from "./undecorate" +import * as u from "../src/undecorate" function convert( source: string, diff --git a/packages/mobx-undecorate/cli.js b/packages/mobx-undecorate/cli.js new file mode 100644 index 000000000..193c11a06 --- /dev/null +++ b/packages/mobx-undecorate/cli.js @@ -0,0 +1,17 @@ +#!/usr/bin/env node +import { spawn } from "child_process" + +// this is pretty lame, probably better make a .cmd and .sh file... +spawn( + "node_modules/.bin/codeshift", + [ + "-t", + "src/undecorate.ts", + process.cwd(), + ...process.argv.filter(arg => arg.startsWith("--")).join(" ") + ], + { + cwd: __dirname, + stdio: "inherit" + } +) diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json new file mode 100644 index 000000000..fa9429f95 --- /dev/null +++ b/packages/mobx-undecorate/package.json @@ -0,0 +1,67 @@ +{ + "name": "mobx-undecorate", + "version": "0.0.1", + "description": "Migrate MobX 4/5 to MobX 6", + "bin": "cli.js", + "scripts": { + "test": "../../node_modules/.bin/jest" + }, + "repository": { + "type": "git", + "url": "https://github.com/mobxjs/mobx.git" + }, + "author": "Michel Weststrate", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "bugs": { + "url": "https://github.com/mobxjs/mobx/issues" + }, + "files": [ + "cli.js", + "src", + "LICENSE", + "README.md" + ], + "homepage": "https://mobx.js.org/", + "dependencies": { + "@babel/core": "^7.9.0", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.9.0", + "@babel/preset-env": "^7.9.5", + "@babel/preset-typescript": "^7.9.0", + "@babel/runtime": "^7.9.2", + "@types/jest": "^25.2.1", + "@types/jscodeshift": "^0.7.0", + "@types/node": "^11.15.12", + "dedent-js": "^1.0.1", + "jscodeshift": "^0.7.0" + }, + "keywords": [ + "mobx" + ], + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest", + "^.+\\.jsx?$": "babel-jest" + }, + "testRegex": "__tests__/.*\\.(t|j)sx?$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json" + ], + "testPathIgnorePatterns": [ + "/node_modules/", + "/\\./" + ], + "watchPathIgnorePatterns": [ + "/node_modules/" + ] + } +} diff --git a/codemod/undecorate.ts b/packages/mobx-undecorate/src/undecorate.ts similarity index 100% rename from codemod/undecorate.ts rename to packages/mobx-undecorate/src/undecorate.ts diff --git a/packages/mobx-undecorate/yarn.lock b/packages/mobx-undecorate/yarn.lock new file mode 100644 index 000000000..2f6708750 --- /dev/null +++ b/packages/mobx-undecorate/yarn.lock @@ -0,0 +1,2265 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/compat-data@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241" + integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== + dependencies: + browserslist "^4.12.0" + invariant "^2.2.4" + semver "^5.5.0" + +"@babel/core@^7.1.6", "@babel/core@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" + integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" + integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== + dependencies: + "@babel/types" "^7.10.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" + integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-compilation-targets@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" + integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== + dependencies: + "@babel/compat-data" "^7.10.4" + browserslist "^4.12.0" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/helper-create-class-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.4.tgz#2d4015d0136bd314103a70d84a7183e4b344a355" + integrity sha512-9raUiOsXPxzzLjCXeosApJItoMnX3uyT4QdM2UldffuGApNrF8e938MwNpDCK9CPoyxrEoCgT+hObJc3mZa6lQ== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + +"@babel/helper-create-regexp-features-plugin@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" + integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + regexpu-core "^4.7.0" + +"@babel/helper-define-map@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.4.tgz#f037ad794264f729eda1889f4ee210b870999092" + integrity sha512-nIij0oKErfCnLUCWaCaHW0Bmtl2RO9cN7+u2QT8yqTywgALKlyUVOvHDElh+b5DwVC6YB1FOYFOTWcN/+41EDA== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/types" "^7.10.4" + lodash "^4.17.13" + +"@babel/helper-explode-assignable-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" + integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== + dependencies: + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-hoist-variables@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" + integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" + integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" + integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.4.tgz#59b373daaf3458e5747dece71bbaf45f9676af6d" + integrity sha512-inWpnHGgtg5NOF0eyHlC0/74/VkdRITY9dtTpB2PrxKKn+AkVMRiZz/Adrx+Ssg+MLDesi2zohBW6MVq6b4pOQ== + dependencies: + lodash "^4.17.13" + +"@babel/helper-remap-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" + integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-wrap-function" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" + integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helper-wrap-function@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" + integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.6", "@babel/parser@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" + integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== + +"@babel/plugin-proposal-async-generator-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.4.tgz#4b65abb3d9bacc6c657aaa413e56696f9f170fc6" + integrity sha512-MJbxGSmejEFVOANAezdO39SObkURO5o/8b6fSH6D1pi9RZQt+ldppKPXfqgUWpSQ9asM6xaSaSJIaeWMDRP0Zg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" + integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.4.tgz#fe20ef10cc73f386f70910fca48798041cd357c7" + integrity sha512-JHTWjQngOPv+ZQQqOGv2x6sCCr4IYWy7S1/VH6BE9ZfkoLrdQ2GpEP3tfb5M++G9PwvqjhY8VC/C3tXm+/eHvA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-decorators" "^7.10.4" + +"@babel/plugin-proposal-dynamic-import@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" + integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + +"@babel/plugin-proposal-json-strings@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" + integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" + integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + +"@babel/plugin-proposal-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" + integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0" + integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.10.4" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" + integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + +"@babel/plugin-proposal-optional-chaining@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" + integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + +"@babel/plugin-proposal-private-methods@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" + integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" + integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-decorators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz#6853085b2c429f9d322d02f5a635018cdeb2360c" + integrity sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-dynamic-import@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-flow@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz#53351dd7ae01995e567d04ce42af1a6e0ba846a6" + integrity sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" + integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz#2f55e770d3501e83af217d782cb7517d7bb34d25" + integrity sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-arrow-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" + integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-async-to-generator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" + integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.10.4" + +"@babel/plugin-transform-block-scoped-functions@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" + integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-block-scoping@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.4.tgz#a670d1364bb5019a621b9ea2001482876d734787" + integrity sha512-J3b5CluMg3hPUii2onJDRiaVbPtKFPLEaV5dOPY5OeAbDi1iU/UbbFFTgwb7WnanaDy7bjU35kc26W3eM5Qa0A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" + integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-define-map" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" + integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-destructuring@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" + integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" + integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-duplicate-keys@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" + integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-exponentiation-operator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" + integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-flow-strip-types@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz#c497957f09e86e3df7296271e9eb642876bf7788" + integrity sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-flow" "^7.10.4" + +"@babel/plugin-transform-for-of@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" + integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" + integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== + dependencies: + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" + integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" + integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-modules-amd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.4.tgz#cb407c68b862e4c1d13a2fc738c7ec5ed75fc520" + integrity sha512-3Fw+H3WLUrTlzi3zMiZWp3AR4xadAEMv6XRCYnd5jAlLM61Rn+CRJaZMaNvIpcJpQ3vs1kyifYvEVPFfoSkKOA== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" + integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.4.tgz#8f576afd943ac2f789b35ded0a6312f929c633f9" + integrity sha512-Tb28LlfxrTiOTGtZFsvkjpyjCl9IoaRI52AEU/VIwOwvDQWtbNJsAqTXzh+5R7i74e/OZHH2c2w2fsOqAfnQYQ== + dependencies: + "@babel/helper-hoist-variables" "^7.10.4" + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" + integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== + dependencies: + "@babel/helper-module-transforms" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" + integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + +"@babel/plugin-transform-new-target@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" + integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-object-super@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" + integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + +"@babel/plugin-transform-parameters@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.4.tgz#7b4d137c87ea7adc2a0f3ebf53266871daa6fced" + integrity sha512-RurVtZ/D5nYfEg0iVERXYKEgDFeesHrHfx8RT05Sq57ucj2eOYAP6eu5fynL4Adju4I/mP/I6SO0DqNWAXjfLQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-property-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" + integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-regenerator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" + integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" + integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-runtime@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.4.tgz#594fb53453ea1b6f0779cceb48ce0718a447feb7" + integrity sha512-8ULlGv8p+Vuxu+kz2Y1dk6MYS2b/Dki+NO6/0ZlfSj5tMalfDL7jI/o/2a+rrWLqSXvnadEqc2WguB4gdQIxZw== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" + integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-spread@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff" + integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-sticky-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" + integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-regex" "^7.10.4" + +"@babel/plugin-transform-template-literals@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.4.tgz#e6375407b30fcb7fcfdbba3bb98ef3e9d36df7bc" + integrity sha512-4NErciJkAYe+xI5cqfS8pV/0ntlY5N5Ske/4ImxAVX7mk9Rxt2bwDTGv1Msc2BRJvWQcmYEC+yoMLdX22aE4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typeof-symbol@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" + integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-typescript@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.4.tgz#8b01cb8d77f795422277cc3fcf45af72bc68ba78" + integrity sha512-3WpXIKDJl/MHoAN0fNkSr7iHdUMHZoppXjf2HJ9/ed5Xht5wNIsXllJXdityKOxeA3Z8heYRb1D3p2H5rfCdPw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-typescript" "^7.10.4" + +"@babel/plugin-transform-unicode-escapes@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" + integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-transform-unicode-regex@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" + integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/preset-env@^7.1.6", "@babel/preset-env@^7.9.5": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f" + integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw== + dependencies: + "@babel/compat-data" "^7.10.4" + "@babel/helper-compilation-targets" "^7.10.4" + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-proposal-async-generator-functions" "^7.10.4" + "@babel/plugin-proposal-class-properties" "^7.10.4" + "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" + "@babel/plugin-proposal-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.10.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.10.4" + "@babel/plugin-proposal-private-methods" "^7.10.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.10.4" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.10.4" + "@babel/plugin-transform-arrow-functions" "^7.10.4" + "@babel/plugin-transform-async-to-generator" "^7.10.4" + "@babel/plugin-transform-block-scoped-functions" "^7.10.4" + "@babel/plugin-transform-block-scoping" "^7.10.4" + "@babel/plugin-transform-classes" "^7.10.4" + "@babel/plugin-transform-computed-properties" "^7.10.4" + "@babel/plugin-transform-destructuring" "^7.10.4" + "@babel/plugin-transform-dotall-regex" "^7.10.4" + "@babel/plugin-transform-duplicate-keys" "^7.10.4" + "@babel/plugin-transform-exponentiation-operator" "^7.10.4" + "@babel/plugin-transform-for-of" "^7.10.4" + "@babel/plugin-transform-function-name" "^7.10.4" + "@babel/plugin-transform-literals" "^7.10.4" + "@babel/plugin-transform-member-expression-literals" "^7.10.4" + "@babel/plugin-transform-modules-amd" "^7.10.4" + "@babel/plugin-transform-modules-commonjs" "^7.10.4" + "@babel/plugin-transform-modules-systemjs" "^7.10.4" + "@babel/plugin-transform-modules-umd" "^7.10.4" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" + "@babel/plugin-transform-new-target" "^7.10.4" + "@babel/plugin-transform-object-super" "^7.10.4" + "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/plugin-transform-property-literals" "^7.10.4" + "@babel/plugin-transform-regenerator" "^7.10.4" + "@babel/plugin-transform-reserved-words" "^7.10.4" + "@babel/plugin-transform-shorthand-properties" "^7.10.4" + "@babel/plugin-transform-spread" "^7.10.4" + "@babel/plugin-transform-sticky-regex" "^7.10.4" + "@babel/plugin-transform-template-literals" "^7.10.4" + "@babel/plugin-transform-typeof-symbol" "^7.10.4" + "@babel/plugin-transform-unicode-escapes" "^7.10.4" + "@babel/plugin-transform-unicode-regex" "^7.10.4" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.10.4" + browserslist "^4.12.0" + core-js-compat "^3.6.2" + invariant "^2.2.2" + levenary "^1.1.1" + semver "^5.5.0" + +"@babel/preset-flow@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.10.4.tgz#e0d9c72f8cb02d1633f6a5b7b16763aa2edf659f" + integrity sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-flow-strip-types" "^7.10.4" + +"@babel/preset-modules@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" + integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.1.0", "@babel/preset-typescript@^7.9.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz#7d5d052e52a682480d6e2cc5aa31be61c8c25e36" + integrity sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-typescript" "^7.10.4" + +"@babel/register@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.4.tgz#53004ba8b04c4af3cbd84508e03ad150669746e4" + integrity sha512-whHmgGiWNVyTVnYTSawtDWhaeYsc+noeU8Rmi+MPnbGhDYmr5QpEDMrQcIA07D2RUv0BlThPcN89XcHCqq/O4g== + dependencies: + find-cache-dir "^2.0.0" + lodash "^4.17.13" + make-dir "^2.1.0" + pirates "^4.0.0" + source-map-support "^0.5.16" + +"@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" + integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" + integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.10.4" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.10.4", "@babel/types@^7.4.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" + integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@^25.2.1": + version "25.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" + integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== + dependencies: + jest-diff "^25.2.1" + pretty-format "^25.2.1" + +"@types/jscodeshift@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@types/jscodeshift/-/jscodeshift-0.7.1.tgz#8afcda6c8ca2ce828c3b192f8a1ba0245987ac12" + integrity sha512-4jkASx74qGl2OUK8NNFEq10QP0MXriOIqeBeNb1IdevHP8k8VDqS5Uv6nIixAA6ZUjjF6/SwOvecrjXkbcaFzw== + dependencies: + ast-types "0.12.1" + recast "0.17.2" + +"@types/node@^11.15.12": + version "11.15.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.15.16.tgz#0d7072715d51bb0f1dced2a7749db77b61b7a8e6" + integrity sha512-QUb2Wgrw0aq7Pfk9LhjOXrnm8E7CmwHSa5fy0IYvxWSujNVV0wDkaGxnAsu2WZcdYRBerYqnf6e6Qiq1FkBxGw== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== + dependencies: + "@types/yargs-parser" "*" + +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.1.tgz#55d3737a8a68e1ccde131067005ce7ee3dd42b99" + integrity sha512-H2izJAyT2xwew4TxShpmxe6f9R5hHgJQy1QloLiUC2yrJMtyraBWNJL7903rpeCY9keNUipORR/zIUC2XcYKng== + +ast-types@0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" + integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browserslist@^4.12.0, browserslist@^4.8.5: + version "4.12.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.2.tgz#76653d7e4c57caa8a1a28513e2f4e197dc11a711" + integrity sha512-MfZaeYqR8StRZdstAK9hCKDd2StvePCYp5rHzQCPicUjfFliDgmuaBNPHYUTpAywBN8+Wc/d7NYVFkO0aqaBUw== + dependencies: + caniuse-lite "^1.0.30001088" + electron-to-chromium "^1.3.483" + escalade "^3.0.1" + node-releases "^1.1.58" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caniuse-lite@^1.0.30001088: + version "1.0.30001091" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001091.tgz#84908c67b98e02c2a56d4afa51e6458b53fb5321" + integrity sha512-ECd8gfBBpv0GKsEYY5052+8PBjExiugDoi3dfkJcxujh2mf7kiuDvb1o27GXlOOGopKiIPYEX8XDPYj7eo3E9w== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js-compat@^3.6.2: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== + dependencies: + browserslist "^4.8.5" + semver "7.0.0" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305" + integrity sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU= + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +diff-sequences@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" + integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== + +electron-to-chromium@^1.3.483: + version "1.3.483" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" + integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== + +escalade@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.1.tgz#52568a77443f6927cd0ab9c73129137533c965ed" + integrity sha512-DR6NO3h9niOT+MZs7bjxlj2a1k+POu5RN8CLTPX2+i78bRi9eLe7+0zXgUHMnGXWybYcL61E9hGhPKqedy8tQA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flow-parser@0.*: + version "0.128.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.128.0.tgz#6bee9bc4f578c8b66f59ad52dd769464a36a029d" + integrity sha512-BOqwccrxdGQjR09H9/YvmgrY6xCyhfRqqZ6HOiDuPBYkSVd5rKamCLs2S4D7Yd0ltwBtnP3rp7vzaBTIJK1+Iw== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.11: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-diff@^25.2.1: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== + dependencies: + chalk "^3.0.0" + diff-sequences "^25.2.6" + jest-get-type "^25.2.6" + pretty-format "^25.5.0" + +jest-get-type@^25.2.6: + version "25.2.6" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877" + integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jscodeshift@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.7.1.tgz#0236ad475d6f0770ca998a0160925d62b57d2507" + integrity sha512-YMkZSyoc8zg5woZL23cmWlnFLPH/mHilonGA7Qbzs7H6M4v4PH0Qsn4jeDyw+CHhVoAnm9UxQyB0Yw1OT+mktA== + dependencies: + "@babel/core" "^7.1.6" + "@babel/parser" "^7.1.6" + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/preset-env" "^7.1.6" + "@babel/preset-flow" "^7.0.0" + "@babel/preset-typescript" "^7.1.0" + "@babel/register" "^7.0.0" + babel-core "^7.0.0-bridge.0" + colors "^1.1.2" + flow-parser "0.*" + graceful-fs "^4.1.11" + micromatch "^3.1.10" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.18.1" + temp "^0.8.1" + write-file-atomic "^2.3.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash@^4.17.13: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +neo-async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU= + dependencies: + minimatch "^3.0.2" + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-releases@^1.1.58: + version "1.1.58" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" + integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + +private@^0.1.8, private@~0.1.5: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +react-is@^16.12.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +recast@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.2.tgz#f18f18cf20bf3fad4522621a7f9c2ada37276814" + integrity sha512-YHFvn4rBXl8eIjALjUiOV/AP3xFpyGNGNHDw9mAncAWuIdgnBKjbZQ9+P3VlsKcNaNapRVFlTEX1dvDRlYwyxg== + dependencies: + ast-types "0.12.1" + esprima "~4.0.0" + private "~0.1.5" + source-map "~0.6.1" + +recast@^0.18.1: + version "0.18.10" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.10.tgz#605ebbe621511eb89b6356a7e224bff66ed91478" + integrity sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ== + dependencies: + ast-types "0.13.3" + esprima "~4.0.0" + private "^0.1.8" + source-map "~0.6.1" + +regenerate-unicode-properties@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" + integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== + +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" + integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.2.0" + regjsgen "^0.5.1" + regjsparser "^0.6.4" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.2.0" + +regjsgen@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" + integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.3.2, resolve@^1.8.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.16: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + +temp@^0.8.1: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" diff --git a/yarn.lock b/yarn.lock index d767ec512..18516de81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1362,14 +1362,6 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/jscodeshift@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@types/jscodeshift/-/jscodeshift-0.7.0.tgz#796bf05a420c5d3e95b196b1fa01cc75f10c41b2" - integrity sha512-W59Y/fnztfJ/5gP4m2ZSWHvb4JPl9SXXn5ne3/6kYP5twRek9DTyKB6xbPIeg0RXbcNTHPBXHNLcKw3AlCrjTw== - dependencies: - ast-types "0.12.1" - recast "0.17.2" - "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" @@ -1891,11 +1883,6 @@ ast-types-flow@0.0.7, ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -ast-types@0.12.1: - version "0.12.1" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.1.tgz#55d3737a8a68e1ccde131067005ce7ee3dd42b99" - integrity sha512-H2izJAyT2xwew4TxShpmxe6f9R5hHgJQy1QloLiUC2yrJMtyraBWNJL7903rpeCY9keNUipORR/zIUC2XcYKng== - ast-types@0.13.3: version "0.13.3" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" @@ -3391,11 +3378,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -dedent-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dedent-js/-/dedent-js-1.0.1.tgz#bee5fb7c9e727d85dffa24590d10ec1ab1255305" - integrity sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU= - dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -7731,7 +7713,7 @@ pretty-quick@2.0.1: mri "^1.1.4" multimatch "^4.0.0" -private@^0.1.8, private@~0.1.5: +private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -7975,16 +7957,6 @@ realpath-native@^2.0.0: resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" integrity sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q== -recast@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.2.tgz#f18f18cf20bf3fad4522621a7f9c2ada37276814" - integrity sha512-YHFvn4rBXl8eIjALjUiOV/AP3xFpyGNGNHDw9mAncAWuIdgnBKjbZQ9+P3VlsKcNaNapRVFlTEX1dvDRlYwyxg== - dependencies: - ast-types "0.12.1" - esprima "~4.0.0" - private "~0.1.5" - source-map "~0.6.1" - recast@^0.18.1: version "0.18.10" resolved "https://registry.yarnpkg.com/recast/-/recast-0.18.10.tgz#605ebbe621511eb89b6356a7e224bff66ed91478" From ddf55adecb7fa9da6e6f5dc4639f5187e72b7121 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 22:30:19 +0100 Subject: [PATCH 0387/1043] Fixed ci config --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7c7d4e09e..ef303a136 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -137,7 +137,7 @@ workflows: - test-size: requires: - build - + - test-codemod: - upload-coveralls: requires: - test-coverage From b839cf182ba996c4acb81ce623a64527f2917432 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 22:40:15 +0100 Subject: [PATCH 0388/1043] v0.0.2 --- .circleci/config.yml | 2 +- packages/mobx-undecorate/cli.js | 12 ++++-------- packages/mobx-undecorate/package.json | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) mode change 100644 => 100755 packages/mobx-undecorate/cli.js diff --git a/.circleci/config.yml b/.circleci/config.yml index ef303a136..0bb9c21b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -137,7 +137,7 @@ workflows: - test-size: requires: - build - - test-codemod: + - test-codemod - upload-coveralls: requires: - test-coverage diff --git a/packages/mobx-undecorate/cli.js b/packages/mobx-undecorate/cli.js old mode 100644 new mode 100755 index 193c11a06..eb617af77 --- a/packages/mobx-undecorate/cli.js +++ b/packages/mobx-undecorate/cli.js @@ -1,15 +1,11 @@ #!/usr/bin/env node -import { spawn } from "child_process" +const { spawn } = require("child_process") +const { resolve } = require("path") // this is pretty lame, probably better make a .cmd and .sh file... spawn( - "node_modules/.bin/codeshift", - [ - "-t", - "src/undecorate.ts", - process.cwd(), - ...process.argv.filter(arg => arg.startsWith("--")).join(" ") - ], + "node_modules/.bin/jscodeshift", + [...process.argv.filter(arg => arg.startsWith("--")), "-t", "src/undecorate.ts", process.cwd()], { cwd: __dirname, stdio: "inherit" diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json index fa9429f95..bb847532d 100644 --- a/packages/mobx-undecorate/package.json +++ b/packages/mobx-undecorate/package.json @@ -1,6 +1,6 @@ { "name": "mobx-undecorate", - "version": "0.0.1", + "version": "0.0.2", "description": "Migrate MobX 4/5 to MobX 6", "bin": "cli.js", "scripts": { From 95f0f37036052ee9535a3faf3c2d12982155f767 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 1 Jul 2020 22:45:12 +0100 Subject: [PATCH 0389/1043] More build fixes --- .circleci/config.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0bb9c21b1..94f41e94b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -86,8 +86,12 @@ jobs: steps: - attach_workspace: at: . - - - run: cd packages/mobx-undecorate && yarn && yarn test + - run: + name: run codemod + command: | + cd packages/mobx-undecorate + yarn + yarn test test-size: executor: my-executor @@ -137,7 +141,9 @@ workflows: - test-size: requires: - build - - test-codemod + - test-codemod: + requires: + - build - upload-coveralls: requires: - test-coverage From b0104c855f2b81ea7f833dc83663099c893bf6ff Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 10:36:05 +0200 Subject: [PATCH 0390/1043] Update this documentation for mobx-undecorate. --- docs/best/decorators.md | 46 ++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 53b3c9d02..23084eb28 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -6,11 +6,9 @@ hide_title: true # Decorators in MobX -MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend -the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. +MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. -But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. The rule is that anything you can -use as an annotation to `makeObservable`, such as `observable`, `action` and `computed`, you can also use as a decorator. So let's examine what that looks like: +But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. The rule is that anything you can use as an annotation to `makeObservable`, such as `observable`, `action` and `computed`, you can also use as a decorator. So let's examine what that looks like: ```javascript import { makeObservable, observable, computed, action } from "mobx" @@ -44,45 +42,41 @@ class TodoList { } ``` -MobX before version 6 did not require the `makeObservable(this)` call in the constructor, but because it makes the implementation of decorator simpler and more compatible, MobX now does. This instructs MobX to make the instances observable following the information in the decorators -- the decorators take the place of the second argument to `makeObservable`. +MobX before version 6 did not require the `makeObservable(this)` call in the constructor, but because it makes the implementation of decorator simpler and more compatible, it now does. This instructs MobX to make the instances observable following the information in the decorators -- the decorators take the place of the second argument to `makeObservable`. -## Upgrading using the `undecorate` codemod +We intend to continue to support decorators in this form. -If you are a MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. +## Upgrading your code with the `mobx-undecorate` codemod -You can convert your project using [jscodeshift](https://github.com/facebook/jscodeshift), which -is a dev dependency of MobX. +If you are an existing MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. -Convert all files in directory `src`. This gets rid of all uses of MobX decorators and -replaces them with the equivalent `makeObservable(this, {...})` invocation: +The [`mobx-undecorate`](https://www.npmjs.com/package/mobx-undecorate) package provides a codemod that can automatically update your code to be conformant to MobX 6. There is no need to install it; instead you download and execute it using the [`npx`](https://www.npmjs.com/package/npx) tool which you do need to install if you haven't already. + +To get rid of all uses of MobX decorators and replace them with the equivalent `makeObservable` calls, go to the directory that contains your source code and run: ```shell -yarn jscodeshift -t mobx/codemod/undecorator.ts --extensions=js,jsx,ts,tsx src +npx mobx-undecorate ``` -If you want to retain decorators and only introduce `makeObservable(this)` where you -required, you can use the `--keepDecorators` option: +MobX will continue to support decorators -- so if you want to retain them +and only introduce `makeObservable(this)` where required, you can use the `--keepDecorators` option: ```shell -yarn jscodeshift -t mobx/codemod/undecorate.ts --extensions=js,jsx,ts,tsx src --keepDecorators=true +npx mobx-undecorate --keepDecorators ``` -Convert single file and everything it imports: +### limitations of `mobx-undecorate` -```shell -yarn jscodeshift -t mobx/codemod/undecorate.ts myfile.js -``` +The `mobx-undecorate` command has to introduce a constructor in classes that do not yet have one. If base class of the constructor expects arguments, the codemod cannot introduce these arguments for the subclass being upgraded, and the `super` call won't pass them either. You have to fix these manually. -Convert an individual file, leaving any imports unchanged using `--ignoreImports`: +`mobx-undecorate` outputs warnings for these cases when it's run. -```shell -yarn jscodeshift -t mobx/codemod/undecorate.ts myfile.js --ignoreImports=true -``` +We do have a special case for React class components to do the right thing and +pass along `props` to the superclass. ## How to enable decorator support -We do not recommend new codebases that use MobX use decorators until such point as they become -an official part of the language, but you can still use them. It does require setup for transpilation: you have to use Babel or TypeScript. +We do not recommend new codebases that use MobX use decorators until the point when they become an official part of the language, but you can still use them. It does require setup for transpilation: you have to use Babel or TypeScript. ### TypeScript @@ -105,7 +99,7 @@ Note that the `legacy` mode is important (as is putting the decorators proposal ### Decorator syntax and Create React App (v2) -- Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1` and newer. In older versions or when using vanilla JavaScript use eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. +Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1` and newer. In older versions or when using vanilla JavaScript use eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. ### Using `observer` from `mobx-react` From 0bcb1363e34348164b0866d1959b366c1c388e5f Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 11:02:21 +0200 Subject: [PATCH 0391/1043] Introduce the computed section. Break up computed document. --- docs/best/decorators.md | 4 + docs/refguide/api.md | 10 +- docs/refguide/computed-behavior.md | 114 ++++++++++++++++++++++ docs/refguide/computed-options.md | 55 +++++++++++ docs/refguide/computed.md | 150 +---------------------------- website/i18n/en.json | 9 ++ website/sidebars.json | 6 +- 7 files changed, 195 insertions(+), 153 deletions(-) create mode 100644 docs/refguide/computed-behavior.md create mode 100644 docs/refguide/computed-options.md diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 23084eb28..1e93a2340 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -46,6 +46,10 @@ MobX before version 6 did not require the `makeObservable(this)` call in the con We intend to continue to support decorators in this form. +## Decorator differences + +- You cannot pass (options)[../refguide/computed-options] into `@computed` when `computed` is used as a decorator. `computed.struct` is available to enable strucural comparison. + ## Upgrading your code with the `mobx-undecorate` codemod If you are an existing MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 424424842..507a3da99 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -54,18 +54,18 @@ These rules might seem complicated at first sight, but you will notice that in p **Some notes:** -- To use the `@observable` decorator, make sure that [decorators are enabled](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) in your transpiler (babel or typescript). +- To use the `@observable` decorator, make sure that [decorators are enabled](observable.md) in your transpiler (babel or typescript). - By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [_decorators_](#decorators). - _[MobX 4 and below]_ To create dynamically keyed objects, always use maps! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. -[«`observable`»](observable.md) — [«`@observable`»](observable-decorator.md) +[«`observable`»](observable.md) — [«`@observable`»](observable.md) ### `@observable property = value` `observable` can also be used as property decorator. It requires [decorators to be enabled](../best/decorators.md) and is syntactic sugar for `extendObservable(this, { property: value })`. -[«`details`»](observable-decorator.md) +[«`details`»](observable.md) ### `observable.box(value, options?)` @@ -134,7 +134,7 @@ The following decorators are available: - **`observable.deep`**: This is the default decorator, used by any observable. It converts any assigned, non-primitive value into an observable if it isn't one yet. - **`observable.ref`**: Disables automatic observable conversion, just creates an observable reference instead. - **`observable.shallow`**: Can only be used in combination with collections. Turns any assigned collection into a collection, which is shallowly observable (instead of deep). In other words; the values inside the collection won't become observables automatically. -- **`computed`**: Creates a derived property, see [`computed`](computed-decorator.md) +- **`computed`**: Creates a derived property, see [`computed`](computed.md) - **`action`**: Creates an action, see [`action`](action.md) - **`action.bound`**: Creates a bound action, see [`action`](action.md) @@ -348,7 +348,7 @@ Can be used as higher order component around a React component. The component will then automatically re-render if any of the observables used in the `render` function of the component has changed. Note that `observer` is provided by the `"mobx-react"` package and not by `"mobx"` itself. -[«details»](../react/reactintegration.md) +[«details»](../react/react-integration.md) Usage: diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md new file mode 100644 index 000000000..3ab5d42ec --- /dev/null +++ b/docs/refguide/computed-behavior.md @@ -0,0 +1,114 @@ +--- +title: How computed works +sidebar_label: How computed works +hide_title: true +--- + +# How `computed` works + +Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, +but is useful to know if something unexpected happens. + +## Error handling + +If a computed value throws an exception during its computation, this exception is caught and rethrown each time its value is read. This is what you would expect. + +It is strongly recommended to always throw `Error`'s, so that the original stack trace is preserved. E.g.: `throw new Error("Uhoh")` instead of `throw "Uhoh"`. +Throwing exceptions doesn't break tracking, so it is possible for computed values to recover from exceptions. + +Example: + +```javascript +class Divider { + constructor(x, y) { + this.x = x + this.y = y + makeAutoObservable(this) + } + + recover() { + this.y = 1 + } + + divideByZero() { + this.y = 0 + } + + get divided() { + if (this.x === 0) { + throw new Error("Division by zero") + } + return x / y + } +} + +const divider = new Divider(3, 1) + +divider.divided // returns 3 + +// trigger action that causes divided to throw +divider.divideByZero() + +divider.divided // Throws: Division by zero +divider.divided // Throws: Division by zero + +// trigger action that makes error go away +divider.recover() + +divided.divided // Recovered; Returns 1.5 +``` + +## Accessing computed values outside of reactions + +The optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md)). + +Reading a computed value directly causes it to recompute which can be expensive, depending on the how complex the derived result is. + +It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. + +It works this way because you expect computed properties to work outside of reactions, but MobX also avoids unnecessarily updating computed values that are not in use. + +The following code demonstrates the issue. + +```javascript +const line = new OrderLine(2.0) + +// if you access line.total directly it recomputed every time +// this is not ideal +setInterval(() => { + console.log(line.total) +}, 60) +``` + +This can cause performance degradation if a computed value is read in a high frequency loop like `requestAnimationFrame`. + +MobX can be configured to report an error when computeds are being access directly by using the `computedRequiresReaction` option + +```javascript +configure({ + computedRequiresReaction: true +}) +``` + +You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](computed-options.md#computed-keepalive) or by using [`observe`](observe.md). + +## `computed(expression)` as function + +`computed` can also be invoked directly as function. +Just like [`observable.box`](boxed.md) creates a stand-alone observable. +Use `.get()` on the returned object to get the current value of the computation, or `.observe(callback)` to observe its changes. +This form of `computed` is not used very often, but in some cases where you need to pass a "boxed" computed value around it might prove useful. + +Example: + +```javascript +import { observable, computed } from "mobx" +var name = observable.box("John") + +var upperCaseName = computed(() => name.get().toUpperCase()) + +var disposer = upperCaseName.observe(change => console.log(change.newValue)) + +name.set("Dave") +// prints: 'DAVE' +``` diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md new file mode 100644 index 000000000..4e742b2bb --- /dev/null +++ b/docs/refguide/computed-options.md @@ -0,0 +1,55 @@ +--- +title: Options for computed +sidebar_label: Options for computed +hide_title: true +--- + +# Options for computed + +Usually `computed` behaves the way you want it to out of the box, but +it's possible to customize its behavior by passing in an `options` argument: + +- `name`: String, the debug name used in spy and the MobX devtools +- `context`: The `this` that should be used in the provided expression +- `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the options argument passed to `computed` is a function, this is assumed to be a setter. +- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). +- `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read its value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it causes the computed to throw, instead of doing an expensive re-evalution. +- `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ + +A shortcut to declare a computed for structural comparison is to use `computed.struct`. + +## Built-in comparers + +MobX provides four built-in `comparer`s which should cover most needs: + +- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. +- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. +- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. +- `comparer.shallow`: Performs shallow structural comparison to determine if two values are the same. + +You can import `comparer` from `mobx` to access these. + +## Computed `keepAlive` + +A computed may be initalized with the `keepAlive` flag. `keepAlive` causes the computed to act as though it is observed by a reaction: + +```javascript +class OrderLine { + price = 0 + amount = 1 + + constructor(price) { + makeAutoObservable(this, { total: computed({ keepAlive: true }) }) + this.price = price + } + + @computed({ keepAlive: true }) + get total() { + return this.price * this.amount + } +} +``` + +See also [accessing computed values outside of reactions](computed-behavior.md#accessing-computed-values-outside-of-reactions). + +_Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 8362a52fb..0d149182d 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -110,77 +110,6 @@ class Foo { _Note: always define the setter *after* the getter, some TypeScript versions are known to declare two properties with the same name otherwise._ -## Options for `computed` - -You can pass an `options` argument to `computed`: - -- `name`: String, the debug name used in spy and the MobX devtools -- `context`: The `this` that should be used in the provided expression -- `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the options argument passed to `computed` is a function, this is assumed to be a setter. -- `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). -- `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read its value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it causes the computed to throw, instead of doing an expensive re-evalution. -- `keepAlive`: don't suspend this computed value if it is not observed by anybody. _Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ - -A shortcut to declare a computed for structural comparison is to use `computed.struct`. - -### Built-in comparers - -MobX provides four built-in `comparer`s which should cover most needs: - -- `comparer.identity`: Uses the identity (`===`) operator to determine if two values are the same. -- `comparer.default`: The same as `comparer.identity`, but also considers `NaN` to be equal to `NaN`. -- `comparer.structural`: Performs deep structural comparison to determine if two values are the same. -- `comparer.shallow`: Performs shallow structural comparison to determine if two values are the same. - -## Error handling - -If a computed value throws an exception during its computation, this exception is caught and rethrown each time its value is read. This is what you would expect. - -It is strongly recommended to always throw `Error`'s, so that the original stack trace is preserved. E.g.: `throw new Error("Uhoh")` instead of `throw "Uhoh"`. -Throwing exceptions doesn't break tracking, so it is possible for computed values to recover from exceptions. - -Example: - -```javascript -class Divider { - constructor(x, y) { - this.x = x - this.y = y - makeAutoObservable(this) - } - - recover() { - this.y = 1 - } - - divideByZero() { - this.y = 0 - } - - get divided() { - if (this.x === 0) { - throw new Error("Division by zero") - } - return x / y - } -} - -const divider = new Divider(3, 1) - -divider.divided // returns 3 - -// trigger action that causes divided to throw -divider.divideByZero() - -divider.divided // Throws: Division by zero -divider.divided // Throws: Division by zero - -// trigger action that makes error go away -divider.recover() - -divided.divided // Recovered; Returns 1.5 -``` - ## Computed with arguments Sometimes you might want to have a computed value that takes one or more arguments. @@ -207,83 +136,10 @@ Note: don't use arrow functions as the `this` would be incorrect. For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) -## Accessing computed values outside of reactions - -The optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md)). - -Reading a computed value directly causes it to recompute which can be expensive, depending on the how complex the derived result is. - -It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. - -It works this way because you expect computed properties to work outside of reactions, but MobX also avoids unnecessarily updating computed values that are not in use. - -The following code demonstrates the issue. - -```javascript -const line = new OrderLine(2.0) +## More about computed -// if you access line.total directly it recomputed every time -// this is not ideal -setInterval(() => { - console.log(line.total) -}, 60) -``` - -This can cause performance degradation if a computed value is read in a high frequency loop like `requestAnimationFrame`. - -MobX can be configured to report an error when computeds are being access directly by using the `computedRequiresReaction` option - -```javascript -configure({ - computedRequiresReaction: true -}) -``` - -You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](https://github.com/mobxjs/mobx-utils#keepalive) or by using [`observe`](observe.md). - -### Computed `keepAlive` - -A computed may be initalized with the `keepAlive` flag. `keepAlive` causes the computed to act as though it is observed by a reaction: - -```javascript -class OrderLine { - price = 0 - amount = 1 - - constructor(price) { - makeAutoObservable(this, { total: computed({ keepAlive: true }) }) - this.price = price - } - - @computed({ keepAlive: true }) - get total() { - return this.price * this.amount - } -} -``` - -_Be aware, this can lead to memory leaks as it will result in every observable used by this computed value to keep the computed value in memory!_ - -## `computed(expression)` as function - -`computed` can also be invoked directly as function. -Just like [`observable.box`](boxed.md) creates a stand-alone observable. -Use `.get()` on the returned object to get the current value of the computation, or `.observe(callback)` to observe its changes. -This form of `computed` is not used very often, but in some cases where you need to pass a "boxed" computed value around it might prove useful. - -Example: - -```javascript -import { observable, computed } from "mobx" -var name = observable.box("John") - -var upperCaseName = computed(() => name.get().toUpperCase()) - -var disposer = upperCaseName.observe(change => console.log(change.newValue)) - -name.set("Dave") -// prints: 'DAVE' -``` +You can pass [options into `computed`](computed-options.md). You can also +read more about the [detailed behavior of `computed`](computed-behavior.md). ## Computed values run more often than expected diff --git a/website/i18n/en.json b/website/i18n/en.json index b4687ccac..ae15622fa 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -96,6 +96,14 @@ "title": "Boxed Values", "sidebar_label": "boxed values" }, + "refguide/computed-behavior": { + "title": "How computed works", + "sidebar_label": "How computed works" + }, + "refguide/computed-options": { + "title": "Options for computed", + "sidebar_label": "Options for computed" + }, "refguide/computed": { "title": "computed", "sidebar_label": "computed" @@ -178,6 +186,7 @@ "MobX and React": "MobX and React", "Making things observable": "Making things observable", "Updating observables": "Updating observables", + "Computed values": "Computed values", "Reacting to observables": "Reacting to observables", "Utilities": "Utilities", "Tips & Tricks": "Tips & Tricks" diff --git a/website/sidebars.json b/website/sidebars.json index fb3ac12c9..9ebfa541b 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -22,8 +22,12 @@ "refguide/action", "best/actions" ], + "Computed values": [ + "refguide/computed", + "refguide/computed-options", + "refguide/computed-behavior" + ], "Reacting to observables": [ - "refguide/computed", "refguide/autorun", "refguide/when", "refguide/reaction", From fb52169cb92143a9d9f71b2e9244b26136c035ff Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 11:04:52 +0200 Subject: [PATCH 0392/1043] Rethink a little. --- notes-docs.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index 374d1be00..be8ef5cf2 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -115,22 +115,16 @@ Here is a proposed structure: - Computed options -- Organizing your application - - - Best practices - - - Defining data stores (mention mobx-state-tree, mobx-keystone) - - Reacting to observables - - Understanding what MobX reacts to - - autorun - when - reaction + - Understanding what MobX reacts to + - Debugging MobX - toJS @@ -141,7 +135,13 @@ Here is a proposed structure: - Spy -- Advanced topics +- Organizing your application + + - Best practices + + - Defining data stores (mention mobx-state-tree, mobx-keystone) + +- Additional topics - Decorators in MobX From f346a1c02d628b19c1364a92de91b7919140df06 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 12:40:10 +0200 Subject: [PATCH 0393/1043] Formatting. --- docs/intro/installation.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 4540141b4..341f72806 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -31,5 +31,4 @@ enableES5() ## Modern JavaScript environments -The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it -works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` +The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` From 5da92b1e60c9a21321128bb8df205313ef3a5629 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 12:40:36 +0200 Subject: [PATCH 0394/1043] Change TOC ideas. --- notes-docs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes-docs.md b/notes-docs.md index be8ef5cf2..b5c93bc28 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -115,7 +115,7 @@ Here is a proposed structure: - Computed options -- Reacting to observables +- Effects for observables - autorun From baf705f7008af27dd460a98bcdcc929c8cdb11e6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 12:40:49 +0200 Subject: [PATCH 0395/1043] Edit autorun and add an example for clarity. --- docs/refguide/autorun.md | 164 ++++++++++++++++++++++++++++----------- 1 file changed, 118 insertions(+), 46 deletions(-) diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index a1b29f831..5caf519bc 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -6,65 +6,128 @@ hide_title: true # Autorun -
    - -
    - egghead.io lesson 9: custom reactions -
    -
    - -
    - Hosted on egghead.io -
    - -`mobx.autorun` can be used in those cases where you want to create a reactive function that will never have observers itself. -This is usually the case when you need to bridge from reactive to imperative code, for example for logging, persistence, or UI-updating code. -When `autorun` is used, the provided function will always be triggered once immediately and then again each time one of its dependencies changes. -In contrast, `computed(function)` creates functions that only re-evaluate if it has -observers on its own, otherwise its value is considered to be irrelevant. +You pass a function into `autorun` that should run each time anything it observes changes. It also runs once when you create the `autorun`. It only responds to changes in observable state -- so things you marked `observable` or `computed`. It won't +respond if other observable state changes that it does not in any refer refer +to in the function. + +Here's an example: + +```javascript +import { makeAutoObservable, autorun } from "mobx" + +class Animal { + constructor(name) { + this.name = name + this.energyLevel = 100 + makeAutoObservable(this) + } + + reduceEnergy() { + this.energyLevel -= 10 + } + + get isHungry() { + return this.energyLevel < 50 + } +} + +const giraffe = new Animal("Gary") + +autorun(() => { + console.log("Energy level: ", giraffe.energyLevel) +}) + +autorun(() => { + if (giraffe.isHungry) { + console.log("Now I'm hungry!") + } else { + console.log("I'm not hungry!") + } +}) + +console.log("Now let's change state!") +for (let i = 0; i < 10; i++) { + giraffe.reduceEnergy() +} +``` + +When you run this code, you get the following output: + +``` +Energy level: 100 +I'm not hungry! +Now let's change state! +Energy level: 90 +Energy level: 80 +Energy level: 70 +Energy level: 60 +Energy level: 50 +Energy level: 40 +Now I'm hungry! +Energy level: 30 +Energy level: 20 +Energy level: 10 +Energy level: 0 +``` + +As you can see, both `autorun` functions run once when they are initialized -- +this is all you would see without the `for` loop. This accounts for the +first two lines of the output. + +Once we run the `for` loop to change the `energyLevel` with the `reduceEnergy` +action we see a new log entry each time an `autorun` function observes a +change to its observable state: + +- For the "Energy level" function this is each time the observable property `energyLevel` changes, so 10 times. + +- For the "Now I'm hungry" function it's each time the `isHungry` computed + changes; so only once. + +## When to use `autorun` + +`autorun` is useful when you need to bridge from reactive to imperative code, for +example for logging, persistence, or UI-updating code. It should not be used to update state that can be derived from other observables; use [`computed`](computed.md) for that. + +If you use React, it's like the [`observer` function](../react/react-integration.md); `autorun` only observes data that is used during the execution of the provided function. + +It can be used in those cases where you want to create a reactive function that will never have observers itself. + +In contrast, [`computed`](computed.md) creates a function that only re-evaluates if it it itself being observed, otherwise its value is considered to be irrelevant. As a rule of thumb: use `autorun` if you have a function that should run automatically but that doesn't result in a new value. Use `computed` for everything else. Autoruns are about initiating _effects_, not about producing new values. + +## Debug name + If a string is passed as first argument to `autorun`, it will be used as debug name. -The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it. The reaction itself will also be passed as the only argument to the function given to autorun, which allows you to manipulate it from within the autorun function. This means there are two ways you can dispose of the reaction when you no longer need it: +## Disposing autorun + +The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it: ```javascript const disposer = autorun(reaction => { /* do some stuff */ }) disposer() +``` -// or +The reaction itself is also passed as the only argument to the function given to autorun, which allows you to manipulate it from within the autorun function. This +gives you another way to dispose of the autorun: +```javascript autorun(reaction => { /* do some stuff */ reaction.dispose() }) ``` -Just like the [`@observer` decorator/function](../react/react-integration.md), `autorun` will only observe data that is used during the execution of the provided function. - -```javascript -var numbers = observable([1, 2, 3]) -var sum = computed(() => numbers.reduce((a, b) => a + b, 0)) - -var disposer = autorun(() => console.log(sum.get())) -// prints '6' -numbers.push(4) -// prints '10' - -disposer() -numbers.push(5) -// won't print anything, nor is `sum` re-evaluated -``` - ## Options -Autorun accepts as the second argument an options object with the following optional options: +Autorun accepts an object as the last argument with the following optional options: -- `delay`: Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling will happen. +- `delay`: Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling happens. - `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -- `onError`: function that will handle the errors of this reaction, rather then propagating them. +- `onError`: function that will handle the errors of this reaction, rather than propagating them. - `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` ## The `delay` option @@ -84,20 +147,29 @@ autorun( ## The `onError` option Exceptions thrown in autorun and all other types reactions are caught and logged to the console, but not propagated back to the original causing code. -This is to make sure that a reaction in one exception does not prevent the scheduled execution of other, possibly unrelated, reactions. -This also allows reactions to recover from exceptions; throwing an exception does not break the tracking done by MobX, -so as subsequent run of a reaction might complete normally again if the cause for the exception is removed. +This is to make sure that an exception in one reaction does not prevent the scheduled execution of other, possibly unrelated, reactions. +This also allows reactions to recover from exceptions; throwing an exception does not break the tracking done by MobX, so as subsequent run of a reaction might complete normally again if the cause for the exception is removed. -It is possible to override the default logging behavior of Reactions by providing the `onError` option -Example: +It is possible to override the default logging behavior of Reactions by providing the `onError` option. For example: ```javascript -const age = observable.box(10) +import { makeAutoObservable, autorun } from "mobx" + +class Person { + constructor(age) { + this.age = age + makeAutoObservable(this) + } +} + +const person = new Person(10) const dispose = autorun( () => { - if (age.get() < 0) throw new Error("Age should not be negative") - console.log("Age", age.get()) + if (person.age. < 0) { + throw new Error("Age should not be negative") + } + console.log("Age", person.age) }, { onError(e) { @@ -107,4 +179,4 @@ const dispose = autorun( ) ``` -A global onError handler can be set as well, use `onReactionError(handler)`. This can be useful in tests or for client side error monitoring. +A global `onError` handler can be set as well with `onReactionError(handler)`. This can be useful in tests or for client side error monitoring. From f4ec2b8fa2d409ebdd2d049feef59a63576188c6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 13:09:25 +0200 Subject: [PATCH 0396/1043] Update the reaction document. --- docs/refguide/autorun.md | 30 +++---- docs/refguide/reaction.md | 171 +++++++++++++++++++++----------------- website/sidebars.json | 4 +- 3 files changed, 113 insertions(+), 92 deletions(-) diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 5caf519bc..ad15f38fc 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -34,7 +34,7 @@ class Animal { const giraffe = new Animal("Gary") autorun(() => { - console.log("Energy level: ", giraffe.energyLevel) + console.log("Energy level:", giraffe.energyLevel) }) autorun(() => { @@ -54,20 +54,20 @@ for (let i = 0; i < 10; i++) { When you run this code, you get the following output: ``` -Energy level: 100 +Energy level: 100 I'm not hungry! Now let's change state! -Energy level: 90 -Energy level: 80 -Energy level: 70 -Energy level: 60 -Energy level: 50 -Energy level: 40 +Energy level: 90 +Energy level: 80 +Energy level: 70 +Energy level: 60 +Energy level: 50 +Energy level: 40 Now I'm hungry! -Energy level: 30 -Energy level: 20 -Energy level: 10 -Energy level: 0 +Energy level: 30 +Energy level: 20 +Energy level: 10 +Energy level: 0 ``` As you can see, both `autorun` functions run once when they are initialized -- @@ -83,6 +83,8 @@ change to its observable state: - For the "Now I'm hungry" function it's each time the `isHungry` computed changes; so only once. +Compare this with [reaction](reaction.md), which offers more fine-grained control over when the effect runs. + ## When to use `autorun` `autorun` is useful when you need to bridge from reactive to imperative code, for @@ -100,12 +102,12 @@ Use `computed` for everything else. Autoruns are about initiating _effects_, not If a string is passed as first argument to `autorun`, it will be used as debug name. -## Disposing autorun +## Disposing of autorun The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it: ```javascript -const disposer = autorun(reaction => { +const disposer = autorun(() => { /* do some stuff */ }) disposer() diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 2d34b0efd..5c439e77c 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -6,109 +6,128 @@ hide_title: true # Reaction -
    - Usage: `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. -A variation on `autorun` that gives more fine grained control on which observables will be tracked. +`reaction` is like [`autorun`](autorun.md) but gives more fine grained control on which observables will be tracked. It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. +It is important to notice that the side effect _only_ reacts to data that was _accessed_ in the data expression, which might be less than the data that is actually used in the effect. In other words: only observables accessed by the _data_ function are tracked; observables that are accessed while executing the _effect_ function are not. + Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. -Any observables that are accessed while executing the side effect will not be tracked. -`reaction` returns a disposer function. +The _effect_ function passed to `reaction` receives the value returned by the _data_ function as its first argument. -The second function (the _effect_ function) passed to `reaction` will receive two arguments when invoked. -The first argument is the value returned by the _data_ function. The second argument is the current reaction, -which can be used to dispose the `reaction` during execution. +The typical pattern is that you produce the things you need in your side effect +in the _data_ function, because is only be triggered when the data returned by the expression has changed. -It is important to notice that the side effect will _only_ react to data that was _accessed_ in the data expression, which might be less than the data that is actually used in the effect. -Also, the side effect will only be triggered when the data returned by the expression has changed. -In other words: reaction requires you to produce the things you need in your side effect. +Here is an example: -## Options +```javascript +import { makeAutoObservable, reaction } from "mobx" -Reaction accepts a third argument as an options object with the following optional options: +class Animal { + constructor(name) { + this.name = name + this.energyLevel = 100 + makeAutoObservable(this) + } -- `fireImmediately`: Boolean that indicates that the effect function should immediately be triggered after the first run of the data function. `false` by default. -- `delay`: Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling will happen. -- `equals`: `comparer.default` by default. If specified, this comparer function will be used to compare the previous and next values produced by the _data_ function. The _effect_ function will only be invoked if this function returns false. If specified, this will override `compareStructural`. -- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -- `onError`: function that will handle the errors of this reaction, rather then propagating them. -- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled + reduceEnergy() { + this.energyLevel -= 10 + } -## Example + get isHungry() { + return this.energyLevel < 50 + } +} + +const giraffe = new Animal("Gary") + +reaction( + () => giraffe.isHungry, + isHungry => { + if (isHungry) { + console.log("Now I'm hungry!") + } else { + console.log("I'm not hungry!") + } + console.log("Energy level:", giraffe.energyLevel) + } +) -In the following example both `reaction1`, `reaction2` and `autorun1` will react to the addition, removal or replacement of todo's in the `todos` array. -But only `reaction2` and `autorun` will react to the change of a `title` in one of the todo items, because `title` is used in the data expression of reaction 2, while it isn't in the data expression of reaction 1. -`autorun` tracks the complete side effect, hence it will always trigger correctly, but is also more suspectible to accidentally accessing unrelevant data. -See also [what will MobX React to?](../best/react). +console.log("Now let's change state!") +for (let i = 0; i < 10; i++) { + giraffe.reduceEnergy() +} +``` -```javascript -const todos = observable([ - { - title: "Make coffee", - done: true - }, - { - title: "Find biscuit", - done: false - } -]) +The output of this example is: -// wrong use of reaction: reacts to length changes, but not to title changes! -const reaction1 = reaction( - () => todos.length, - length => console.log("reaction 1:", todos.map(todo => todo.title).join(", ")) -) +``` +Now let's change state! +Now I'm hungry! +Energy level: 40 +``` -// correct use of reaction: reacts to length and title changes -const reaction2 = reaction( - () => todos.map(todo => todo.title), - titles => console.log("reaction 2:", titles.join(", ")) -) +As you can see, this reaction is only triggered once, when `isHungry` changes. +Changes to `giraffe.energyLevel`, which the _effect_ function only uses, do not cause the _effect_ function to be executed. If you wanted `reaction` to respond to this +as well, you would have to also access it in the _data_ function and return it. -// autorun reacts to just everything that is used in its function -const autorun1 = autorun(() => console.log("autorun 1:", todos.map(todo => todo.title).join(", "))) +Compare this with the example given for [autorun](autorun.md). -todos.push({ title: "explain reactions", done: false }) -// prints: -// reaction 1: Make coffee, find biscuit, explain reactions -// reaction 2: Make coffee, find biscuit, explain reactions -// autorun 1: Make coffee, find biscuit, explain reactions +## Disposing of reaction -todos[0].title = "Make tea" -// prints: -// reaction 2: Make tea, find biscuit, explain reactions -// autorun 1: Make tea, find biscuit, explain reactions +Like with `autorun`, the return value is a disposer function: + +```javascript +const disposer = reaction( + () => { + /* return data */ + }, + data => { + /* do some stuff */ + } +) +disposer() ``` -In the following example `reaction3`, will react to the change in the `counter` count. -When invoked `reaction`, second argument can use as disposer. -The following example shows a `reaction` that is invoked only once. +You can also access the reaction itself as the second argument: -```javascript -const counter = observable({ count: 0 }) +The reaction itself is also passed as the second argument to the _effect_ function, +so this gives you another way to dispose of the reaction: -// invoke once of and dispose reaction: reacts to observable value. -const reaction3 = reaction( - () => counter.count, - (count, reaction) => { - console.log("reaction 3: invoked. counter.count = " + count) +```javascript +const disposer = reaction( + () => { + /* return data */ + }, + (data, reaction) => { + /* do some stuff */ reaction.dispose() } ) +``` + +## Options + +Reaction accepts a third argument as an options object with the following optional options: + +- `fireImmediately`: Boolean that indicates that the _effect_ function should immediately be triggered after the first run of the _data_ function. `false` by default. +- `delay`: Number in milliseconds that can be used to throttle the _effect_ function. If zero (the default), no throttling happens. +- `equals`: `comparer.default` by default. If specified, this comparer function is used to compare the previous and next values produced by the _data_ function. The _effect_ function is only invoked if this function returns false. If specified, this overrides `compareStructural`. +- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. +- `onError`: function that handles the errors of this reaction, rather than propagating them. +- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled -counter.count = 1 -// prints: -// reaction 3: invoked. counter.count = 1 +## Behavior -counter.count = 2 -// prints: -// (There are no logging, because of reaction disposed. But, counter continue reaction) +Reaction is roughly speaking sugar for: -console.log(counter.count) -// prints: -// 2 +```javascript +computed(expression).observe(action(sideEffect)) ``` -Reaction is roughly speaking sugar for: `computed(expression).observe(action(sideEffect))` or `autorun(() => action(sideEffect)(expression))` +or + +```javascript +autorun(() => action(sideEffect)(expression)) +``` diff --git a/website/sidebars.json b/website/sidebars.json index 9ebfa541b..88ada0b76 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -27,10 +27,10 @@ "refguide/computed-options", "refguide/computed-behavior" ], - "Reacting to observables": [ + "Effects for observables": [ "refguide/autorun", - "refguide/when", "refguide/reaction", + "refguide/when", "best/react" ], "Utilities": [ From 542de6bd9cc0e9c03c621af57ad32bb4e07d235a Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 13:27:20 +0200 Subject: [PATCH 0397/1043] More editing of this section. --- docs/refguide/autorun.md | 4 ++++ docs/refguide/reaction.md | 4 +++- docs/refguide/when.md | 31 +++++++++++++++---------------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index ad15f38fc..b9da5f7b5 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -6,6 +6,10 @@ hide_title: true # Autorun +Usage: + +- `autorun(effect: (reaction) => void)` + You pass a function into `autorun` that should run each time anything it observes changes. It also runs once when you create the `autorun`. It only responds to changes in observable state -- so things you marked `observable` or `computed`. It won't respond if other observable state changes that it does not in any refer refer to in the function. diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 5c439e77c..fb6f4ae5a 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -6,7 +6,9 @@ hide_title: true # Reaction -Usage: `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. +Usage: + +- `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. `reaction` is like [`autorun`](autorun.md) but gives more fine grained control on which observables will be tracked. It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. diff --git a/docs/refguide/when.md b/docs/refguide/when.md index dd84fd2d0..1497058ec 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -6,29 +6,23 @@ hide_title: true # when -
    +Usage: -
    - egghead.io lesson 9: custom reactions -
    -
    - -
    - Hosted on egghead.io -
    +- `when(predicate: () => boolean, effect?: () => void, options?)` +- `when(predicate: () => boolean): Promise -`when(predicate: () => boolean, effect?: () => void, options?)` - -`when` observes & runs the given `predicate` until it returns true. -Once that happens, the given `effect` is executed and the autorunner is disposed. -The function returns a disposer to cancel the autorunner prematurely. +`when` observes and runs the given _predicate_ function until it returns `true`. +Once that happens, the given _effect_ function is executed and the autorunner is disposed. This function is really useful to dispose or cancel stuff in a reactive way. For example: ```javascript +import { when, makeAutoObservable } from "mobx" + class MyResource { constructor() { + makeAutoObservable(this, { dispose: false }) when( // once... () => !this.isVisible, @@ -37,7 +31,7 @@ class MyResource { ) } - @computed get isVisible() { + get isVisible() { // indicate whether this item is visible } @@ -47,9 +41,14 @@ class MyResource { } ``` +As soon as `isVisible` becomes `false`, the `dispose` method is called that +then does some cleanup for `MyResource`. + +`when` returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. + ## when-promise -If there is no `effect` function provided, `when` will return a `Promise`. This combines nicely with `async / await` +If no `effect` function is provided, `when` returns a `Promise`. This combines nicely with `async / await` to let you wait for changes in observable state: ```javascript async function() { From 604a820bc8e7d783b5cc1b41e734c3c283f8c6d8 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 13:27:36 +0200 Subject: [PATCH 0398/1043] Evolving table of contents. --- notes-docs.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index b5c93bc28..b02fd002e 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -89,6 +89,8 @@ Here is a proposed structure: - Optimizing React components + - React pitfalls + - React class components - Making things observable @@ -123,14 +125,16 @@ Here is a proposed structure: - reaction - - Understanding what MobX reacts to +- Understanding MobX + + - What does MobX react to? + + - Common Pitfalls - Debugging MobX - toJS - - Common Pitfalls - - Using trace for debugging - Spy From b5207ee60267763566d1d8974f321e416c756cd9 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 13:27:46 +0200 Subject: [PATCH 0399/1043] Update to translation. --- website/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/i18n/en.json b/website/i18n/en.json index ae15622fa..b97eb4146 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -187,7 +187,7 @@ "Making things observable": "Making things observable", "Updating observables": "Updating observables", "Computed values": "Computed values", - "Reacting to observables": "Reacting to observables", + "Effects for observables": "Effects for observables", "Utilities": "Utilities", "Tips & Tricks": "Tips & Tricks" } From a12f61fea8b10c950fc025bbe6aef400f1e8ca30 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 13:31:03 +0200 Subject: [PATCH 0400/1043] Rename this document. 'react.md' just screams React but it's not about React (mostly). --- docs/best/{react.md => what-does-mobx-react-to.md} | 0 docs/intro/concepts.md | 2 +- docs/react/react-integration.md | 4 ++-- website/i18n/en.json | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) rename docs/best/{react.md => what-does-mobx-react-to.md} (100%) diff --git a/docs/best/react.md b/docs/best/what-does-mobx-react-to.md similarity index 100% rename from docs/best/react.md rename to docs/best/what-does-mobx-react-to.md diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 5ae92669c..d56ec82be 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -166,7 +166,7 @@ Why does a new message get printed each time the `unfinishedTodoCount` is change _MobX reacts to any existing observable property that is read during the execution of a tracked function._ -For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](../best/react.md). +For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](../best/what-does-mobx-react-to.md). ## Principles diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index 9e603a084..abde9c834 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -203,11 +203,11 @@ In this snippet only the current value of `myTimer.secondsPassed` is passed to ` That number value won't change anymore in the future, so `TimerView` will never update. It is the property `secondsPassed` that will change in the future, so we need to access it _inside_ the component. One could also say: values need to be passed _by reference_ and not by value. -If the problem is not entirely clear, make sure to study [what does MobX react to?](../best/react.md) first! +If the problem is not entirely clear, make sure to study [what does MobX react to?](../best/what-does-mobx-react-to.md) first! ## Troubleshooting 1. Make sure you didn't forget `observer` (yes, this is the most common mistake) -2. Make sure you grok how tracking works in general: [what will MobX react to](../best/react.md) +2. Make sure you grok how tracking works in general: [what does MobX react to](../best/what-does-mobx-react-to.md) 3. Read the [common mistakes](../best/pitfalls.md) section 4. Use [trace](../best/trace.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](../refguide/spy.md) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. diff --git a/website/i18n/en.json b/website/i18n/en.json index b97eb4146..2aa0bff98 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -25,10 +25,6 @@ "title": "Common pitfalls & best practices", "sidebar_label": "Common Pitfalls & Best Practices" }, - "best/react": { - "title": "What does MobX react to?", - "sidebar_label": "Understanding what MobX reacts to" - }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", "sidebar_label": "Hot Module Reloading with Stateless Components" @@ -41,6 +37,10 @@ "title": "Using `trace` for debugging", "sidebar_label": "Using trace for debugging" }, + "best/what-does-mobx-react-to": { + "title": "What does MobX react to?", + "sidebar_label": "Understanding what MobX reacts to" + }, "faq/faq": { "title": "FAQ", "sidebar_label": "Frequently Asked Questions" From 99e8b6a6507ccd582b8c44e4abe1e81212f2def2 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 14:15:21 +0200 Subject: [PATCH 0401/1043] Modify the non-React bits to this document. --- docs/best/what-does-mobx-react-to.md | 192 ++++++++++++++++----------- 1 file changed, 116 insertions(+), 76 deletions(-) diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 5496c9d5f..751195dd9 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -6,18 +6,16 @@ hide_title: true # What does MobX react to? -
    - MobX usually reacts to exactly the things you expect it to. Which means that in 90% of your use cases mobx "just works". -However, at some point you will encounter a case where it might not do what you expected. +However, at some point you will encounter a case where it does not do what you expected. At that point it is invaluable to understand how MobX determines what to react to. > MobX reacts to any _existing_ **observable** _property_ that is read during the execution of a tracked function. -- _"reading"_ is dereferencing an object's property, which can be done through "dotting into" it (eg. `user.name`) or using the bracket notation (eg. `user['name']`). -- _"tracked functions"_ are the expression of `computed`, the `render()` method of an observer component, and the functions that are passed as the first param to `when`, `reaction` and `autorun`. -- _"during"_ means that only those observables that are being read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. +- _"reading"_ is dereferencing an object's property, which can be done through "dotting into" it (eg. `user.name`) or using the bracket notation (eg. `user['name']`, `todos[3]`). +- _"tracked functions"_ are the expression of `computed`, the function of an observer React function component, the `render()` method of an observer React class component, and the functions that are passed as the first param to `autorun`, `reaction` and `when`. +- _"during"_ means that only those observables that are read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. In other words, MobX will not react to: @@ -26,23 +24,30 @@ In other words, MobX will not react to: ## MobX tracks property access, not values -To elaborate on the above rules with an example, suppose that you have the following observable data structure (`observable` applies itself recursively by default, so all fields in this example are observable): +To elaborate on the above rules with an example, suppose that you have the following observable instance: ```javascript -let message = observable({ - title: "Foo", - author: { - name: "Michel" - }, - likes: ["John", "Sara"] -}) +class Message { + constructor(title, author, likes) { + this.title = title + this.author = author + this.likes = likes + makeAutoObservable(this) + } + + updateTitle(title) { + this.title = title + } +} + +let message = new Message("Foo", { name: "Michel" }, ["John", "Sara"]) ``` In memory that looks as follows. The green boxes indicate _observable_ properties. Note that the _values_ themselves are not observable! ![MobX reacts to changing references](../assets/observed-refs.png) -Now what MobX basically does is recording which _arrows_ you use in your function. After that, it will re-run whenever one of these _arrows_ changes; when they start to refer to something else. +What MobX basically does is recording which _arrows_ you use in your function. After that, it will re-run whenever one of these _arrows_ changes; when they start to refer to something else. ## Examples @@ -54,32 +59,38 @@ Let's show that with a bunch of examples (based on the `message` variable define autorun(() => { console.log(message.title) }) -message.title = "Bar" +message.updateTitle("Bar") ``` This will react as expected, the `.title` property was dereferenced by the autorun, and changed afterwards, so this change is detected. -You can verify what MobX will track by calling [`trace()`](../reguide/trace) inside the tracked function. In the case of the above function it will output the following: +You can verify what MobX will track by calling [`trace()`](../refguide/trace) inside the tracked function. In the case of the above function it outputs the following: ```javascript +import { trace } from "mobx" + const disposer = autorun(() => { console.log(message.title) trace() }) - // Outputs: // [mobx.trace] 'Autorun@2' tracing enabled -message.title = "Hello" -// [mobx.trace] 'Autorun@2' is invalidated due to a change in: 'ObservableObject@1.title' +message.updateTitle("Hello") +// Outputs: +// [mobx.trace] 'Autorun@2' is invalidated due to a change in: 'Message@1.title' +Hello ``` -It is also possible to get the internal dependency (or observer) tree by using the designated utilities for that: +It is also possible to get the internal dependency (or observer) tree by using `getDependencyTree`: ```javascript -getDependencyTree(disposer) // prints the dependency tree of the reaction coupled to the disposer -// { name: 'Autorun@4', -// dependencies: [ { name: 'ObservableObject@1.title' } ] } +import { getDependencyTree } from "mobx" + +// prints the dependency tree of the reaction coupled to the disposer +console.log(getDependencyTree(disposer)) +// Outputs: +// { name: 'Autorun@2', dependencies: [ { name: 'Message@1.title' } ] } ``` #### Incorrect: changing a non-observable reference @@ -88,24 +99,22 @@ getDependencyTree(disposer) // prints the dependency tree of the reaction couple autorun(() => { console.log(message.title) }) -message = observable({ title: "Bar" }) +message = new Message("Bar", { name: "Martijn" }, ["Felicia", "Marcus"]) ``` -This will **not** react. `message` was changed, but `message` is not an observable, just a variable which _refers to_ an observable, -but the variable (reference) itself is not observable. +This will **not** react. `message` was changed, but `message` is not an observable, just a variable which _refers to_ an observable, but the variable (reference) itself is not observable. #### Incorrect: dereference outside a tracked function ```javascript -var title = message.title +let title = message.title autorun(() => { console.log(title) }) -message.title = "Bar" +message.updateMessage("Bar") ``` -This will **not** react. `message.title` was dereferenced outside the `autorun`, and just contains the value of `message.title` at the moment of dereferencing (the string `"Foo"`). -`title` is not an observable so `autorun` will never react. +This will **not** react. `message.title` was dereferenced outside the `autorun`, and just contains the value of `message.title` at the moment of dereferencing (the string `"Foo"`). `title` is not an observable so `autorun` will never react. #### Correct: dereference inside the tracked function @@ -113,11 +122,19 @@ This will **not** react. `message.title` was dereferenced outside the `autorun`, autorun(() => { console.log(message.author.name) }) -message.author.name = "Sara" -message.author = { name: "John" } + +runInAction(() => { + message.author.name = "Sara" +}) +runInAction(() => { + message.author = { name: "John" } +}) ``` -This will react to both changes. Both `author` and `author.name` are dotted into, allowing MobX to track these references. +This reacts to both changes. Both `author` and `author.name` are dotted into, allowing MobX to track these references. + +Note that we had to use `runInAction` here to be allowed to make changes outside +of an `action`. #### Incorrect: store a local reference to an observable object without tracking @@ -126,32 +143,36 @@ const author = message.author autorun(() => { console.log(author.name) }) -message.author.name = "Sara" -message.author = { name: "John" } + +runInAction(() => { + message.author.name = "Sara" +}) +runInAction(() => { + message.author = { name: "John" } +}) ``` The first change will be picked up, `message.author` and `author` are the same object, and the `.name` property is dereferenced in the autorun. -However the second change will **not** be picked up, the `message.author` relation is not tracked by the `autorun`. Autorun is still using the "old" `author`. +However the second change is **not** picked up, because the `message.author` relation is not tracked by the `autorun`. Autorun is still using the "old" `author`. #### Common pitfall: console.log ```javascript -const message = observable({ title: "hello" }) - autorun(() => { console.log(message) }) // Won't trigger a re-run -message.title = "Hello world" +message.updateTitle("Hello world") ``` In the above example, the updated message title won't be printed, because it is not used inside the autorun. -The autorun only depends on `message`, which is not an observable, but a constant. In other words, as far as MobX is concerned, `title` is not used in- and hence not relevant for the `autorun` +The autorun only depends on `message`, which is not an observable, but a variable. In other words, as far as MobX is concerned, `title` is not used in the `autorun`. -The fact that `console.log` will print the message title is misleading here; `console.log` is an asynchronous api that only will format its parameters later in time, for which reason the autorun won't be tracking what data the console.log is accessing. For that reason make sure to always pass immutable data or defensive copies to `console.log`. +If you use this in a web browser debugging tool, you may be able to find the +updated value of `title` after all, but this is misleading -- autorun run after all has run once when it was first called. This happens because `console.log` is an asynchronous function and the object is only formatted later in time. This means that if you follow the title in the debugging toolbar, you can find the updated value. But the `autorun` does not track any updates. -The following solutions however, will all react to `message.title`: +The way to make this work is to make sure to always pass immutable data or defensive copies to `console.log`. So the following solutions all react to chnages in `message.title`: ```javascript autorun(() => { @@ -193,8 +214,8 @@ autorun(() => { message.likes.push("Jennifer") ``` -This will react with the above sample data, array indexers count as property access. But **only** if the provided `index < length`. -MobX will not track not-yet-existing indices or object properties (except when using maps). +This will react with the above sample data because array indexers count as property access. But **only** if the provided `index < length`. +MobX does not track not-yet-existing array indices. So always guard your array index based access with a `.length` check. #### Correct: access array functions in tracked function @@ -235,42 +256,45 @@ So in contrast, `messages.likes = ["Jennifer"]` would be picked up; that stateme ```javascript autorun(() => { - console.log(message.postDate) + console.log(message.author.age) +}) + +runInAction(() => { + message.author.age = 10 }) -message.postDate = new Date() ``` -_MobX 4_ +This **will** react if you run React in an environment that supports Proxy. +Note that this is only done for objects created with `observable` or `observable.object`. New properties on class instances will not be made observable automatically. + +_Environments without Proxy support_ + +This will **not** react. MobX can only track observable properties, and 'age' has not been defined as observable property above. -This will **not** react. MobX can only track observable properties, and 'postDate' has not been defined as observable property above. However, it is possible to use the `get` and `set` methods as exposed by MobX to work around this: ```javascript +import { get, set } from "mobx" + autorun(() => { - console.log(get(message, "postDate")) + console.log(get(message.author, "age")) }) -set(message, "postDate", new Date()) +set(message.author, "age", 10) ``` -_MobX 5_ - -In MobX 5 this **will** react, as MobX 5 can track not-yet existing properties. -Note that this is only done for objects created with `observable` or `observable.object`. -New properties on class instances will not be made observable automatically. - -#### [MobX 4 and lower] Incorrect: using not yet existing observable object properties +#### [Without Proxy support] Incorrect: using not yet existing observable object properties ```javascript autorun(() => { - console.log(message.postDate) + console.log(message.author.age) }) -extendObservable(message, { - postDate: new Date() +extendObservable(message.author, { + age: 10 }) ``` This will **not** react. MobX will not react to observable properties that did not exist when tracking started. -If the two statements are swapped, or if any other observable causes the `autorun` to re-run, the `autorun` will start tracking the `postDate` as well. +If the two statements are swapped, or if any other observable causes the `autorun` to re-run, the `autorun` will start tracking the `age` as well. #### Correct: using not yet existing map entries @@ -282,17 +306,25 @@ const twitterUrls = observable.map({ autorun(() => { console.log(twitterUrls.get("Sara")) }) -twitterUrls.set("Sara", "twitter.com/horsejs") + +runInAction(() => { + twitterUrls.set("Sara", "twitter.com/horsejs") +}) ``` This **will** react. Observable maps support observing entries that may not exist. Note that this will initially print `undefined`. You can check for the existence of an entry first by using `twitterUrls.has("Sara")`. -So for dynamically keyed collections, always use observable maps. +So in an environment without Proxy support for dynamically keyed collections always use observable maps. If you do have Proxy support you can use observable maps as well, +but you also have the option to use plain objects. + +#### [Without Proxy support] Correct: using MobX utilities to read / write to objects -#### Correct: using MobX utilities to read / write to objects +If you are in an environment without proxy support and still want to use observable +objects as a dynamic collection, you can handle them using the MobX `get` and `set` +API. -Since MobX 4 it is also possible to use observable objects as dynamic collection, if they are read / updated by using the mobx apis, so that mobx can keep track of the property changes. The following will react as well: +The following will react as well: ```javascript import { get, set, observable } from "mobx" @@ -304,12 +336,15 @@ const twitterUrls = observable.object({ autorun(() => { console.log(get(twitterUrls, "Sara")) // get can track not yet existing properties }) -set(twitterUrls, { Sara: "twitter.com/horsejs" }) + +runInAction(() => { + set(twitterUrls, { Sara: "twitter.com/horsejs" }) +}) ``` -See the [object manipulation api](https://mobx.js.org/refguide/api.html#direct-observable-manipulation) for more details +See the [object manipulation api](../refguide/api.md#direct-observable-manipulation) for more details -## MobX only tracks synchronously accessed data +## MobX does not track asynchronously accessed data ```javascript function upperCaseAuthorName(author) { @@ -319,12 +354,13 @@ function upperCaseAuthorName(author) { autorun(() => { console.log(upperCaseAuthorName(message.author)) }) -message.author.name = "Chesterton" + +runInAction(() => { + message.author.name = "Chesterton" +}) ``` -This will react. Even though `author.name` is not dereferenced by the thunk passed to `autorun` itself, -MobX will still track the dereferencing that happens in `upperCaseAuthorName`, -because it happens _during_ the execution of the autorun. +This will react. Even though `author.name` is not dereferenced by the the function passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. --- @@ -332,11 +368,15 @@ because it happens _during_ the execution of the autorun. autorun(() => { setTimeout(() => console.log(message.likes.join(", ")), 10) }) -message.likes.push("Jennifer") + +runInAction(() => { + message.likes.push("Jennifer") +}) ``` -This will **not** react, during the execution of the `autorun` no observables where accessed, only during the `setTimeout`. -In general this is quite obvious and rarely causes issues. +This will **not** react because during the execution of the `autorun` no observables were accessed, only during the `setTimeout`, which is an asynchronous function. + +Also see [Asynchronous actions](actions.md). ## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` From 0c9126b000fd1eb42fe6e07921584c5c31fab588 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 2 Jul 2020 14:20:55 +0200 Subject: [PATCH 0402/1043] Tweak to make non-Proxy stuff come lower. Also include in sidebar again. --- docs/best/what-does-mobx-react-to.md | 112 +++++++++++++-------------- website/sidebars.json | 2 +- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 751195dd9..bd6b9390f 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -252,6 +252,62 @@ message.likes.push("Jennifer") This will **not** react. Simply because the `likes` array itself is not being used by the `autorun`, only the reference to the array. So in contrast, `messages.likes = ["Jennifer"]` would be picked up; that statement does not modify the array, but the `likes` property itself. +#### Correct: using not yet existing map entries + +```javascript +const twitterUrls = observable.map({ + John: "twitter.com/johnny" +}) + +autorun(() => { + console.log(twitterUrls.get("Sara")) +}) + +runInAction(() => { + twitterUrls.set("Sara", "twitter.com/horsejs") +}) +``` + +This **will** react. Observable maps support observing entries that may not exist. +Note that this will initially print `undefined`. +You can check for the existence of an entry first by using `twitterUrls.has("Sara")`. +So in an environment without Proxy support for dynamically keyed collections always use observable maps. If you do have Proxy support you can use observable maps as well, +but you also have the option to use plain objects. + +#### MobX does not track asynchronously accessed data + +```javascript +function upperCaseAuthorName(author) { + const baseName = author.name + return baseName.toUpperCase() +} +autorun(() => { + console.log(upperCaseAuthorName(message.author)) +}) + +runInAction(() => { + message.author.name = "Chesterton" +}) +``` + +This will react. Even though `author.name` is not dereferenced by the the function passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. + +--- + +```javascript +autorun(() => { + setTimeout(() => console.log(message.likes.join(", ")), 10) +}) + +runInAction(() => { + message.likes.push("Jennifer") +}) +``` + +This will **not** react because during the execution of the `autorun` no observables were accessed, only during the `setTimeout`, which is an asynchronous function. + +Also see [Asynchronous actions](actions.md). + #### Using non-observable object properties ```javascript @@ -296,28 +352,6 @@ extendObservable(message.author, { This will **not** react. MobX will not react to observable properties that did not exist when tracking started. If the two statements are swapped, or if any other observable causes the `autorun` to re-run, the `autorun` will start tracking the `age` as well. -#### Correct: using not yet existing map entries - -```javascript -const twitterUrls = observable.map({ - John: "twitter.com/johnny" -}) - -autorun(() => { - console.log(twitterUrls.get("Sara")) -}) - -runInAction(() => { - twitterUrls.set("Sara", "twitter.com/horsejs") -}) -``` - -This **will** react. Observable maps support observing entries that may not exist. -Note that this will initially print `undefined`. -You can check for the existence of an entry first by using `twitterUrls.has("Sara")`. -So in an environment without Proxy support for dynamically keyed collections always use observable maps. If you do have Proxy support you can use observable maps as well, -but you also have the option to use plain objects. - #### [Without Proxy support] Correct: using MobX utilities to read / write to objects If you are in an environment without proxy support and still want to use observable @@ -344,40 +378,6 @@ runInAction(() => { See the [object manipulation api](../refguide/api.md#direct-observable-manipulation) for more details -## MobX does not track asynchronously accessed data - -```javascript -function upperCaseAuthorName(author) { - const baseName = author.name - return baseName.toUpperCase() -} -autorun(() => { - console.log(upperCaseAuthorName(message.author)) -}) - -runInAction(() => { - message.author.name = "Chesterton" -}) -``` - -This will react. Even though `author.name` is not dereferenced by the the function passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. - ---- - -```javascript -autorun(() => { - setTimeout(() => console.log(message.likes.join(", ")), 10) -}) - -runInAction(() => { - message.likes.push("Jennifer") -}) -``` - -This will **not** react because during the execution of the `autorun` no observables were accessed, only during the `setTimeout`, which is an asynchronous function. - -Also see [Asynchronous actions](actions.md). - ## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` A common mistake made with `observer` is that it doesn't track data that syntactically seems parent of the `observer` component, diff --git a/website/sidebars.json b/website/sidebars.json index 88ada0b76..1c8242351 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -31,7 +31,7 @@ "refguide/autorun", "refguide/reaction", "refguide/when", - "best/react" + "best/what-does-mobx-react-to" ], "Utilities": [ "refguide/api", From b64a58d4d3594094212b4733c0dc620d076f58b0 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 3 Jul 2020 15:19:12 +0200 Subject: [PATCH 0403/1043] Break up pitfalls & best practices and move stuff into relevant documents. There is still a bit left I haven't found a proper place for yet. --- docs/best/dispose-reactions.md | 60 +++++++ docs/best/pitfalls.md | 251 --------------------------- docs/react/react-class-components.md | 121 +++++++++++++ docs/react/react-integration.md | 74 ++++++-- docs/refguide/array.md | 5 +- docs/refguide/autorun.md | 2 + docs/refguide/computed-behavior.md | 85 +++++---- docs/refguide/computed.md | 8 +- docs/refguide/reaction.md | 2 + docs/refguide/when.md | 2 + notes-docs.md | 9 +- website/i18n/en.json | 4 + website/sidebars.json | 1 + 13 files changed, 319 insertions(+), 305 deletions(-) create mode 100644 docs/best/dispose-reactions.md diff --git a/docs/best/dispose-reactions.md b/docs/best/dispose-reactions.md new file mode 100644 index 000000000..b72f07565 --- /dev/null +++ b/docs/best/dispose-reactions.md @@ -0,0 +1,60 @@ +--- +title: Always dispose reactions +sidebar_label: Always dispose reactions +hide_title: true +--- + +# Always dispose reactions + +All forms of `autorun`, `reaction`, `when`, `observe` and `intercept` are only garbage collected if all objects they observe are garbage collected themselves. + +So we recommend you use the disposer function that is returned from these functions to stop them when you no longer need them. If you don't do this it can lead to performance +degradation due to unnecessary recomputation. You may also end up with duplicate registrations of the same reaction, which again can lead to performance degradation as well as unintended behavior. + +Reactions like `autorun`, `reaction` and `when` might observe many different observables, and as long as one of them is still in scope, the reaction remains in scope. This means that all other observables it uses are also kept alive to support future recomputions. + +For `observe` and `intercept` it is not strictly necessary to dispose them if they target `this`. `when` disposes itself, unless you cancel it manually. + +To avoid these issues, make sure to dispose of reactions when they are no longer +needed. + +Example: + +```javascript +class Vat { + constructor() { + this.value = 1.2 + makeAutoObservable(this) + } +} + +const vat = new Vat() + +class OrderLine { + price = 10 + amount = 1 + constructor() { + makeAutoObservable(this) + + // this autorun will be GC-ed together with the current orderline instance + // as it only uses observables from `this`. It's not strictly necessary + // to dispose of it once an OrderLine instance is deleted. + this.disposer1 = autorun(() => { + doSomethingWith(this.price * this.amount) + }) + // this autorun won't be GC-ed together with the current orderline instance + // since vat keeps a reference to notify this autorun, which in turn keeps + // 'this' in scope + this.disposer2 = autorun(() => { + doSomethingWith(this.price * this.amount * vat.value) + }) + } + + dispose() { + // So, to avoid subtle memory issues, always call the + // disposers when the reaction is no longer needed + this.disposer1() + this.disposer2() + } +} +``` diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md index 7e5209077..2baebbbfc 100644 --- a/docs/best/pitfalls.md +++ b/docs/best/pitfalls.md @@ -6,8 +6,6 @@ hide_title: true # Common pitfalls & best practices -
    - Stuck with MobX? This section contains a list of common issues people new to MobX might run into. #### Importing from wrong location @@ -26,28 +24,6 @@ This is incorrect but will not always immediately lead to runtime errors. So be import { observable } from "mobx" ``` -#### Issues with decorators? - -For setup tips and limitations on decorators, check the [decorators](decorators.md) page - -#### `Array.isArray(observable([1,2,3])) === false` - -If your environment does not support Proxies, then MobX cannot make its observable -array be a real JS Array. - -For more information see (../best/limitations-without-proxies.md). - -#### `object.someNewProp = value` is not picked up - -If your environment does not support Proxies, then MobX cannot observe detect or react to properties that weren't declared observable before. For more information see (../best/limitations-without-proxies.md). - -If your environment **does** support Proxies, then MobX can detect this if and only if you create the class instance or object using `observable()` / `observable.object()`. - -### Use `@observer` on all components that render `@observable`s. - -`@observer` only enhances the component you are decorating, not the components used inside it. -So usually all your components should be decorated. Don't worry, this is not inefficient, in contrast, more `observer` components make rendering more efficient. - ### `@inject('store')` before `@observer` will cause MobX to not trigger The effect with React is that the it will never render on observable changes. @@ -72,234 +48,7 @@ You'll notice a warning Mobx observer: You are trying to use 'observer' on a component that already has 'inject'. Please apply 'observer' before applying 'inject' ``` -### Don't copy observables properties and store them locally - -Observer components only track data that is accessed _during_ the render method. A common mistake is that data plucked of from an observable property and stored will for that reason not be tracked: - -```javascript -class User { - @observable name -} - -class Profile extends React.Component { - name - - componentWillMount() { - // Wrong - // This dereferences user.name and just copies the value once! Future updates will not be tracked, as lifecycle hooks are not reactive - // assignments like these create redundant data - this.name = this.props.user.name - } - - render() { - return
    {this.name}
    - } -} -``` - -The correct approach is either by not storing the values of observables locally (obviously, the above example is simple but contrived), or by defining them as computed property: - -```javascript -class User { - @observable name -} - -class Profile extends React.Component { - @computed get name() { - // correct; computed property will track the `user.name` property - return this.props.user.name - } - - render() { - return
    {this.name}
    - } -} -``` - -### Render callbacks are _not_ part of the render method - -Because `observer` only applies to exactly the `render` function of the current component; passing a render callback or component to a child component doesn't become reactive automatically. -For more details, see the [what will Mobx react to](https://mobx.js.org/best/react.html#what-does-mobx-react-to) guide. - -### Dereference values as late as possible - -MobX can do a lot, but it cannot make primitive values observable (although it can wrap them in an object see [boxed observables](../refguide/boxed.md)). -So it is not the _values_ that are observable, but the _properties_ of an object. This means that `@observer` actually reacts to the fact that you dereference a value. -So in our above example, the `Timer` component would **not** react if it was initialized as follows: - -```javascript -ReactDOM.render(, document.body) -``` - -In this snippet just the current value of `secondsPassed` is passed to the `Timer`, which is the immutable value `0` (all primitives are immutable in JS). -That number won't change anymore in the future, so `Timer` will never update. It is the property `secondsPassed` that will change in the future, -so we need to access it _in_ the component. Or in other words: always try to pass the owning object of an observable property. -For more info see [what will MobX react to?](https://mobx.js.org/best/react.html#what-does-mobx-react-to). - -#### Computed values run more often than expected - -If a computed property is _not_ in use by some reaction (`autorun`, `observer` etc), computed expressions will be evaluated lazily; each time their value is requested (so they just act as normal property). -Computed values will only track their dependencies if they are observed. -This allows MobX to automatically suspend computations that are not actively in use. -See this [blog](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254) or [issue #356](https://github.com/mobxjs/mobx/issues/356) for an explanation. -So if you fiddle arounds, computed properties might not seem efficient. But when applied in a project that uses `observer`, `autorun` etc, they become very efficient. - -MobX `computed`s will automatically be kept alive during transactions as well, see PRs: [#452](https://github.com/mobxjs/mobx/pull/452) and [#489](https://github.com/mobxjs/mobx/pull/489) - -To force computed values to stay alive one can use the `keepAlive: true` option, but note that this can potentially create memory leaks. - -#### Always dispose reactions - -All forms of `autorun`, `observe` and `intercept` will only be garbage collected if all objects they observe are garbage collected themselves. -So it is recommend to use the disposer function that is returned from these methods to stop them when you no longer need them. -Usually for `observe` and `intercept` it is not strictly necessary to dispose them if when targed `this`. -For reactions like `autorun` it is more tricky, as they might observe many different observables, and as long as one of them is still in scope, -the reaction will remain in scope which means that all other observables it uses are also kept alive to support future recomputions. -So make sure to always dispose your reactions when you no longer need them! - -Example: - -```javascript -const VAT = observable(1.2) - -class OrderLine { - @observable price = 10 - @observable amount = 1 - constructor() { - // this autorun will be GC-ed together with the current orderline instance - this.handler = autorun(() => { - doSomethingWith(this.price * this.amount) - }) - // this autorun won't be GC-ed together with the current orderline instance - // since VAT keeps a reference to notify this autorun, - // which in turn keeps 'this' in scope - this.handler = autorun(() => { - doSomethingWith(this.price * this.amount * VAT.get()) - }) - // So, to avoid subtle memory issues, always call.. - this.handler() - // When the reaction is no longer needed! - } -} -``` - #### I have a weird exception when using `@observable` in a React component. The following exception: `Uncaught TypeError: Cannot assign to read only property '__mobxLazyInitializers' of object` occurs when using a `react-hot-loader` that does not support decorators. Either use `extendObservable` in `componentWillMount` instead of `@observable`, or upgrade to `react-hot-loader` `"^3.0.0-beta.2"` or higher. - -#### The display name of react components is not set - -If you use `export const MyComponent = observer(props =>
    hi
    )`, no display name will be visible in the devtools. -The following approaches can be used to fix this: - -```javascript -// 1 (set displayName explicitly) -export const MyComponent = observer(props =>
    hi
    ) -myComponent.displayName = "MyComponent" - -// 2 (MobX infers component name from function name) -export const MyComponent = observer(function MyComponent(props) { - return
    hi
    -}) - -// 3 (transpiler will infer component name from variable name) -const _MyComponent = props =>
    hi
    -export const MyComponent = observer(_MyComponent) - -// 4 (with default export) -const MyComponent = props =>
    hi
    -export default observer(MyComponent) -``` - -See also: http://mobxjs.github.io/mobx/best/stateless-HMR.html or [#141](https://github.com/mobxjs/mobx/issues/141#issuecomment-228457886). - -#### The propType of an observable array is object - -Observable arrays are actually objects, so they comply to `propTypes.object` instead of `array`. -`mobx-react` provides its explicit `PropTypes` for observable data structures. - -#### Rendering ListViews in React Native - -`ListView.DataSource` in React Native expects real arrays. Observable arrays are actually objects, make sure to `.slice()` them first before passing to list views. Furthermore, `ListView.DataSource` itself can be moved to the store and have it automatically updated with a `@computed`, this step can also be done on the component level. - -```javascript -class ListStore { - @observable list = ["Hello World!", "Hello React Native!", "Hello MobX!"] - - ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 }) - - @computed get dataSource() { - return this.ds.cloneWithRows(this.list.slice()) - } -} - -const listStore = new ListStore() - -@observer -class List extends Component { - render() { - return ( - {row}} - enableEmptySections={true} - /> - ) - } -} -``` - -For more info see [#476](https://github.com/mobxjs/mobx/issues/476) - -#### Declaring propTypes might cause unnecessary renders in dev mode - -See: https://github.com/mobxjs/mobx-react/issues/56 - -#### Don't decorate (some) React lifecycle methods as `action.bound` on `Observer` React components - -As mentioned above, all React components which used observable data should be marked as `@observer` Additionally, if you are going to be modifying any observable data in a function in your React component, that function should be marked as `@action`. Additionally, if you want `this` to refer to the instance of your component class, you should use `@action.bound`. Consider the following class: - -```js -class ExampleComponent extends React.Component { - @observable disposer // <--- this value is disposed in addActed - - @action.bound - addActed() { - this.dispose() - } - - @action.bound - componentDidMount() { - this.disposer = this.observe(....) //<-- details don't matter - } -} -``` - -If you call `addActed()` on a mounted `ExampleComponent`, the disposer is called. - -On the other hand, consider the following: - -```js -class ExampleComponent extends React.Component { - @observable disposer // <--- this value is disposed in addActed - - @action.bound - componentWillUnmount() { - this.dispose() - } - - @action.bound - componentDidMount() { - this.disposer = this.observe(....) //<-- details don't matter - } -} -``` - -In this case, your `disposer` will never be called! The reason is that the mixin for making the `ExampleComponent` an `observer`, the modifies the `componentWillUnmount` function which changes `this` to an unexpected `React.Component` instance (don't know which one). To work around this, declare`componentWillUnmount()` as follows: - -```js -componentWillUnmount() { - runInAction(() => this.dispose()) -} -``` diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index d2a1988c4..e6a73d04e 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -66,6 +66,51 @@ For more advantages of using observable local component state, for class based c The props object and the state object of an observer class component are automatically made observable to make it easier to create `computed` properties that derive from props inside such a component. +### Don't copy observable properties and store them locally + +Observer components only track data that is accessed _during_ the render method. A common mistake is that data plucked of from an observable property and stored will for that reason not be tracked: + +```javascript +import React from "React" +import { makeAutoObservable, makeObservable, observable, action } from "mobx" +import { observer } from "mobx-react" + +class User { + constructor(name) { + this.name = name + makeAutoObservable(this) + } +} + +class Profile extends React.Component { + componentWillMount() { + // Wrong + this.name = this.props.user.name + } + + render() { + return
    {this.name}
    + } +} +``` + +This code won't work correctly, as you deference `user.name` and just copy the value once. Future updates will not be tracked, as lifecycle hooks are not reactive Assignments like these create redundant data. + +The correct approach is either by not storing the values of observables locally (obviously, the above example is simple but contrived), or by defining them as computed property: + +```javascript +class Profile extends React.Component { + @computed get name() { + // correct; computed property will track the `user.name` property + return this.props.user.name + } + + render() { + return
    {this.name}
    + } +} +``` + ## Using decorators The previous example looks a bit cumbersome. We recommended switching class @@ -105,3 +150,79 @@ class TimerView extends React.Component { You can read more about [decorator support in MobX][../best/decorators.md], including how to enable them. + +### Don't decorate (some) React lifecycle methods as `action.bound` on `observer` React components + +If you modify any observable data in method in your React component, that method +should be marked as an `action`. For event handlers, `action.bound` is handy, +as `this` then refers to the instance your component class. + +Now consider the following class: + +```javascript +const ExampleComponent = observer( + class ExampleComponent extends React.Component { + disposer // <--- this value is disposed in addActed + + constructor(props) { + super(props) + makeObservable(this, { + disposer: observable, + addActed: action.bound, + componentDidMount: action.bound + }) + } + + addActed() { + this.dispose() + } + + componentDidMount() { + this.disposer = this.observe() + } + + observe() { + return autoRun() // <-- details don't matter + } + } +) +``` + +If you call `addActed()` on a mounted `ExampleComponent`, the disposer is called. + +On the other hand, consider the following: + +```javascript +const ExampleComponent = observer( + class ExampleComponent extends React.Component { + disposer // <--- this value is disposed in componentWillMount + + constructor(props) { + super(props) + makeObservable(this, { + disposer: observable, + componentWillMOunt: action.bound, + componentDidMount: action.bound + }) + } + + @action.bound + componentWillUnmount() { + this.dispose() + } + + @action.bound + componentDidMount() { + this.disposer = this.observe() + } + } +) +``` + +In this case, your `disposer` will never be called! The reason is that the mixin for making the `ExampleComponent` an `observer` modifies the `componentWillUnmount` method which changes `this` to an unexpected `React.Component` instance. To work around this, declare `componentWillUnmount()` as follows: + +```js +componentWillUnmount() { + runInAction(() => this.dispose()) +} +``` diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index abde9c834..bbde9dd15 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -125,10 +125,11 @@ In general we recommend not to resort to using MobX observables for local compon ## When to apply `observer`? -The simple rule of thumb is: _all components that render observable data_. If -you are in doubt, apply `observer` as using it is cheap. +The simple rule of thumb is: _all components that render observable data_. -If you don't want to mark a component as observer, for example to reduce the dependencies of a generic component package, make sure you only pass it plain data, for example by converting it to plain data in a parent component, that is an `observer`, using `toJS`. +`observer` only enhances the component you are decorating, not the components used inside it. So usually all your components should be wrapped by `observer`. Don't worry, this is not inefficient, in contrast, more `observer` components make rendering more efficient. + +If you don't want to mark a component as `observer`, for example to reduce the dependencies of a generic component package, make sure you only pass it plain data, for example by converting it to plain data in a parent component, that is an `observer`, using `toJS`. ## Characteristics of observer components @@ -160,7 +161,50 @@ See [React class components](react-class-components.md) for more information. ## Tips -#### Use the `` component in cases where you can't use observer +### React DevTools support + +[React DevTools](https://reactjs.org/blog/2019/08/15/new-react-devtools.html) uses the display name information of components to properly display the component hierarchy. + +If you use: + +```javascript +export const MyComponent = observer(props =>
    hi
    ) +``` + +then no display name will be visible in the DevTools. + +The following approaches can be used to fix this: + +- set `displayName` explicitly: + + ```javascript + export const MyComponent = observer(props =>
    hi
    ) + MyComponent.displayName = "MyComponent" + ``` + +- use `function` with a name instead of an arrow function. `mobx-react` infers component name from function name: + + ```javascript + export const MyComponent = observer(function MyComponent(props) { + return
    hi
    + }) + ``` + +- The transpiler (like Babel or TypeScript) infers component name from variable name: + + ```javascript + const _MyComponent = props =>
    hi
    + export const MyComponent = observer(_MyComponent) + ``` + +- Infer from variable name again, using default export: + + ```javascript + const MyComponent = props =>
    hi
    + export default observer(MyComponent) + ``` + +### Use the `` component in cases where you can't use observer Sometimes it is hard to apply `observer` to a part of the rendering, for example because you are rendering inside a callback, and you don't want to extract a new component to be able to mark it as `observer`. In those cases [``](https://github.com/mobxjs/mobx-react#observer) comes in handy. It takes a callback render function, that is automatically rendered again every time an observable used is changed: @@ -176,16 +220,12 @@ const TimerView = ({ timer }) => ( ) ``` -#### How can I further optimize my React components? - -See the relevant [React performance section](react-performance.md). - -#### When combining `observer` with other higher-order-components, apply `observer` first +### When combining `observer` with other higher-order-components, apply `observer` first When `observer` needs to be combined with other decorators or higher-order-components, make sure that `observer` is the innermost (first applied) decorator; otherwise it might do nothing at all. -#### Gotcha: dereference values _inside_ your components +### Dereference values _inside_ your components MobX can do a lot, but it cannot make primitive values observable (although it can wrap them in an object; see [boxed observables](../refguide/boxed.md)). So it is not the _values_ that are observable, but the _properties_ of an object. This means that `observer` actually reacts to the fact that you dereference a value. @@ -205,6 +245,20 @@ so we need to access it _inside_ the component. One could also say: values need If the problem is not entirely clear, make sure to study [what does MobX react to?](../best/what-does-mobx-react-to.md) first! +### Render callbacks are _not_ part of the render method + +Because `observer` only applies to exactly the `render` function of the current component; passing a render callback or component to a child component doesn't become reactive automatically. + +For more details, see the [what does Mobx react to](https://mobx.js.org/best/react.html#what-does-mobx-react-to) guide. + +### Declaring propTypes might cause unnecessary renders in dev mode + +See: https://github.com/mobxjs/mobx-react/issues/56 + +### How can I further optimize my React components? + +See the relevant [React performance section](react-performance.md). + ## Troubleshooting 1. Make sure you didn't forget `observer` (yes, this is the most common mistake) diff --git a/docs/refguide/array.md b/docs/refguide/array.md index dcbff364d..f4138b3ee 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -67,4 +67,7 @@ The `name` option can be used to give the array a friendly debug name, to be use ## Array limitations in environments without Proxy support -In environments with Proxy support, there are some [limitations](../best/limitations-without-proxies.md) with arrays that you should be aware about. +If your environment does not support Proxies, then MobX cannot make its observable +array be a real JS Array. + +[More information](../best/limitations-without-proxies.md). diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index b9da5f7b5..80163eda9 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -127,6 +127,8 @@ autorun(reaction => { }) ``` +[Read more about why it's important to dispose](../best/dispose-reactions). + ## Options Autorun accepts an object as the last argument with the following optional options: diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index 3ab5d42ec..d7d1e043b 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -9,6 +9,53 @@ hide_title: true Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. +## Computed values run more often than expected + +It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. + +This is because the caching optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md), or if they are used during a transaction (such as in an action). + +This allows MobX to automatically suspend computations that are not actively in use, +to avoid unnecessary updates to computed values that are not being accessed. But if a computed property is _not_ in use by some reaction, computed expressions are evaluated each time their value is requested, so they just behave like a normal property. + +So if you fiddle around, computed properties might not seem efficient. But when applied in a project that uses `observer`, `autorun` etc, they become very efficient. + +The following code demonstrates the issue. + +```javascript +// OrderLine has a computed property `total` +const line = new OrderLine(2.0) + +// if you access line.total outside of a reaction it is recomputed every time +setInterval(() => { + console.log(line.total) +}, 60) +``` + +This can cause performance degradation if a computed value is read in a high frequency loop like `requestAnimationFrame`. + +You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](computed-options.md#computed-keepalive) or by using [`observe`](observe.md), but note that this can potentially create memory leaks. + +MobX can be configured to report an error when computeds are accessed directly with the `computedRequiresReaction` option: + +```javascript +configure({ + computedRequiresReaction: true +}) +``` + +## Accessing computed values outside of reactions + +The optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md)). + +Reading a computed value directly causes it to recompute which can be expensive, depending on the how complex the derived result is. + +It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. + +It works this way because you expect computed properties to work outside of reactions, but MobX also avoids unnecessarily updating computed values that are not in use. + +You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](computed-options.md#computed-keepalive) or by using [`observe`](observe.md). + ## Error handling If a computed value throws an exception during its computation, this exception is caught and rethrown each time its value is read. This is what you would expect. @@ -58,40 +105,6 @@ divider.recover() divided.divided // Recovered; Returns 1.5 ``` -## Accessing computed values outside of reactions - -The optimization of `computed` only works if it is observed by some type of reaction, such as [`autorun`](autorun.md), the [`reaction` function](reaction.md) or a [React `observer` component](../react/react-integration.md)). - -Reading a computed value directly causes it to recompute which can be expensive, depending on the how complex the derived result is. - -It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. - -It works this way because you expect computed properties to work outside of reactions, but MobX also avoids unnecessarily updating computed values that are not in use. - -The following code demonstrates the issue. - -```javascript -const line = new OrderLine(2.0) - -// if you access line.total directly it recomputed every time -// this is not ideal -setInterval(() => { - console.log(line.total) -}, 60) -``` - -This can cause performance degradation if a computed value is read in a high frequency loop like `requestAnimationFrame`. - -MobX can be configured to report an error when computeds are being access directly by using the `computedRequiresReaction` option - -```javascript -configure({ - computedRequiresReaction: true -}) -``` - -You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](computed-options.md#computed-keepalive) or by using [`observe`](observe.md). - ## `computed(expression)` as function `computed` can also be invoked directly as function. @@ -112,3 +125,7 @@ var disposer = upperCaseName.observe(change => console.log(change.newValue)) name.set("Dave") // prints: 'DAVE' ``` + +``` + +``` diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 0d149182d..291b8450f 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -138,9 +138,5 @@ For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx- ## More about computed -You can pass [options into `computed`](computed-options.md). You can also -read more about the [detailed behavior of `computed`](computed-behavior.md). - -## Computed values run more often than expected - -Please check the [`pitfalls`](https://mobx.js.org/best/pitfalls.html#computed-values-run-more-often-than-expected) section if you experience this. +You can pass [options into `computed`](computed-options.md). If you experience +unexpected behavior, you can also read more about the [detailed behavior of `computed`](computed-behavior.md). diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index fb6f4ae5a..b49a82ee3 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -109,6 +109,8 @@ const disposer = reaction( ) ``` +[Read more about why it's important to dispose](../best/dispose-reactions). + ## Options Reaction accepts a third argument as an options object with the following optional options: diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 1497058ec..9bc6dc3cc 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -46,6 +46,8 @@ then does some cleanup for `MyResource`. `when` returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. +[Read more about why it's important to dispose](../best/dispose-reactions). + ## when-promise If no `effect` function is provided, `when` returns a `Promise`. This combines nicely with `async / await` to let you wait for changes in observable state: diff --git a/notes-docs.md b/notes-docs.md index b02fd002e..4fc74fc7f 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -45,6 +45,9 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - Does 'makeAutoObservable' work with computedFn? Should we be able to declare this explicitly with `makeObservable`? +- Should we use `mobx-react-lite` in examples primarily? What's up with the + observer batching story though? + ## Todo - [ ] Netlify preview for docs PR. @@ -59,6 +62,8 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. - [ ] Consider breaking up computed.md into a basic and "advanced" document. - [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? +- [ ] There seems to a bug so that displayName is not picked up for functional components for the devtools, and the docs do recommend it. Create an issue that reproduces this behavior for mobx-react. +- [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. ## Structure thoughts @@ -125,12 +130,10 @@ Here is a proposed structure: - reaction -- Understanding MobX + - always dispose reactions - What does MobX react to? - - Common Pitfalls - - Debugging MobX - toJS diff --git a/website/i18n/en.json b/website/i18n/en.json index 2aa0bff98..559f41534 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -17,6 +17,10 @@ "title": "MobX + React DevTools", "sidebar_label": "MobX + React DevTools" }, + "best/dispose-reactions": { + "title": "Always dispose reactions", + "sidebar_label": "Always dispose reactions" + }, "best/limitations-without-proxies": { "title": "Limitations without Proxy support", "sidebar_label": "Limitations without Proxy support" diff --git a/website/sidebars.json b/website/sidebars.json index 1c8242351..2101582d9 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -31,6 +31,7 @@ "refguide/autorun", "refguide/reaction", "refguide/when", + "best/dispose-reactions", "best/what-does-mobx-react-to" ], "Utilities": [ From 26b17cf4b3b3eeb4dd1121f05ca1d1cbc6bcd1e5 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 2 Jul 2020 08:56:21 +0100 Subject: [PATCH 0404/1043] v0.0.3 --- packages/mobx-undecorate/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json index bb847532d..cf2885edd 100644 --- a/packages/mobx-undecorate/package.json +++ b/packages/mobx-undecorate/package.json @@ -1,6 +1,6 @@ { "name": "mobx-undecorate", - "version": "0.0.2", + "version": "0.0.3", "description": "Migrate MobX 4/5 to MobX 6", "bin": "cli.js", "scripts": { From 2cf7f0eb6ff801e90c239f107b500ebfe3d206df Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 2 Jul 2020 08:58:16 +0100 Subject: [PATCH 0405/1043] v0.0.4 --- notes.md | 115 +++++++++++++++----------- packages/mobx-undecorate/cli.js | 9 +- packages/mobx-undecorate/package.json | 2 +- 3 files changed, 74 insertions(+), 52 deletions(-) diff --git a/notes.md b/notes.md index bced398f0..da5ed5cde 100644 --- a/notes.md +++ b/notes.md @@ -13,7 +13,7 @@ - [x] add **PURE** annotations? - [x] extract utils for getOwnPropertyDescriptor and defineProperty - [x] configure property mangling like in Immer. Will it save anything? -- [x] code mod +- [ ] code mod - [x] code mod, run on v4 tests? - [x] codemod TS - [x] codemod babel @@ -25,6 +25,8 @@ - [x] unit tests for `ignoreImports` - [x] unit tests for `keepDecorators` - [x] put in separate package + - [ ] special case constuctor of React components + - [ ] print // TODO about super calls - [ ] ES5 support - [x] combine with ES5? - [x] backport tests and code to v4(6) @@ -39,6 +41,8 @@ - [ ] Optimize: cache meta data - [x] observable / extendObservable use decorators args - [x] observable; support `false` as argument + - [ ] makeObservable don't warn about missing fields? + - [ ] test late initialization (after declaring props) - [ ] misc - [x] revisit safety model - [x] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! @@ -54,60 +58,73 @@ - [ ] default observable requires reaction? - [x] kill globalstate options? - [ ] no auto lifting? https://twitter.com/getify/status/1258137826241241088 - - [ ] flow types + - [ ] kill / fix flow types + - [ ] enable search on docs - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. ## Docs / migration guide Philosophy: one way to do things -- [ ] Host old docs somewhere? Figure out how docusaurus can support a second version -- [ ] Using the codemod -- [ ] update tsconfig, no decorators, yes define -- [ ] update docs for non-default decorators -- [ ] instruct using TS / Babel decorators -- [ ] Breaking: can no longer re-decorate fields already decorated by a superclass -- [ ] Breaking: methods will be actions by default in `extendObservable` / `observable` -- [ ] Breaking: `decorate` has been removed -- [ ] Breaking: `observableRequiresReaction` is now the default -- [ ] Breaking: `enforceActions` is now defaulted to `observed`, but now generates a warning rather than an error -- [ ] Breaking: `runInAction` now longer supports a name as first argument. Use an action or named function instead -- [ ] Breaking: `computed` does not accept setter function as second argument anymore, use `options.set` instead -- [ ] Breaking: the `findIndex` / `find` offset argument (third) on observable arrays is no longer supported, to be consistent with ES arrays -- [ ] Breaking: option `computedConfigurable` was dropped and is the default now -- [ ] Breaking: a setter function as second argument to `computed` is no longer supported, use `computed(getter, { set: setter })` instead -- [ ] Breaking: toJS no longer supports the `recurseEverything` option -- [ ] optimization tip: hoist the mapping constant -- [ ] document: unconditional map -- [ ] document `true` and `false` as annotations -- [ ] how to enable ES5 support -- [ ] observable.array now supports proxy:false option -- [ ] migration: migrate mobx4 to mobx5 first, don't test on old browsers, then go to 6 -- [ ] Breaking: no generic decorators or lists anymore for extendObservable? -- [ ] Breaking: dropped `intercept` and `observe` as array & map methods, use the mobx utilities instead -- [ ] Breaking: dropped array.toJS, use .slice() instead -- [ ] Breaking dropped Map.toPOJO / toJS / toJSON , use new Map(map) instead -- [ ] Breaking: Map.toJSON now returns the entries array -- [ ] Breaking dropped Set.toJS, use new Set(observableSet) instead -- [ ] Breaking Set.toJSON returns an array now -- [ ] Breaking: dropped Array.toJS, use .toJSON instead -- [ ] Breaking: dropped .observe and .intercept on types, use the {observe, intercept} from 'mobx' instead -- [ ] Running codemod: yarn jscodeshift -t codemod/undecorate.ts test/v5/base/typescript-tests.ts --ignoreImports=true -- [ ] killed: IGNORE_MOBX_MINIFY_WARNING -- [ ] Document: recommended settings for prod versus experimentation -- [ ] Migration: document switching from 4 to 5: configure( ) with proxies, requiresReqction, enforceActions -- [ ] makeObservable + private members in TypeScript (second call? computed name? tsignore?) -- [ ] print deprecation warnings for all old apis in mobx 4/5 -- [ ] Breaking: it is no longer safe to call action from autorun. Use effect or reaction instead. -- [ ] \_allowStateChangesINComputation is no longer needed, us `runInAction` instead. -- [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. -- [ ] Breaking: `toJS` no longer takes action, and no longer converts Maps and Sets to plain data structures. Serializing data structures is out of scope for the MobX project, and write custom serialization methods are much more sustainable. You might even leverage @computed to serialize state. -- [ ] Breaking: directly calling .get() / .set() on an observable array is no longer supported -- [ ] Breaking: killed IObservableObject interface. -- [ ] Breaking: sorting or reversing an array in an derivation will now throw rather than warn. -- [ ] Breaking: sorting or reversing an array in an actino will no sort or reverse the source array rather than shallow copy. -- Fixed #2326 -- Fixed #2379 +Why classes + +- shared funcs +- fixed shape, well optimized +- better debug info + +Why declare fields + +- optimized by JS engines +- autocompletion in IDE +- detect misspellings in makeObservable early + +* [ ] Host old docs somewhere? Figure out how docusaurus can support a second version +* [ ] Using the codemod +* [ ] update tsconfig, no decorators, yes define +* [ ] update docs for non-default decorators +* [ ] instruct using TS / Babel decorators +* [ ] Breaking: can no longer re-decorate fields already decorated by a superclass +* [ ] Breaking: methods will be actions by default in `extendObservable` / `observable` +* [ ] Breaking: `decorate` has been removed +* [ ] Breaking: `observableRequiresReaction` is now the default +* [ ] Breaking: `enforceActions` is now defaulted to `observed`, but now generates a warning rather than an error +* [ ] Breaking: `runInAction` now longer supports a name as first argument. Use an action or named function instead +* [ ] Breaking: `computed` does not accept setter function as second argument anymore, use `options.set` instead +* [ ] Breaking: the `findIndex` / `find` offset argument (third) on observable arrays is no longer supported, to be consistent with ES arrays +* [ ] Breaking: option `computedConfigurable` was dropped and is the default now +* [ ] Breaking: a setter function as second argument to `computed` is no longer supported, use `computed(getter, { set: setter })` instead +* [ ] Breaking: toJS no longer supports the `recurseEverything` option +* [ ] optimization tip: hoist the mapping constant +* [ ] document: unconditional map +* [ ] document `true` and `false` as annotations +* [ ] how to enable ES5 support +* [ ] observable.array now supports proxy:false option +* [ ] migration: migrate mobx4 to mobx5 first, don't test on old browsers, then go to 6 +* [ ] Breaking: no generic decorators or lists anymore for extendObservable? +* [ ] Breaking: dropped `intercept` and `observe` as array & map methods, use the mobx utilities instead +* [ ] Breaking: dropped array.toJS, use .slice() instead +* [ ] Breaking dropped Map.toPOJO / toJS / toJSON , use new Map(map) instead +* [ ] Breaking: Map.toJSON now returns the entries array +* [ ] Breaking dropped Set.toJS, use new Set(observableSet) instead +* [ ] Breaking Set.toJSON returns an array now +* [ ] Breaking: dropped Array.toJS, use .toJSON instead +* [ ] Breaking: dropped .observe and .intercept on types, use the {observe, intercept} from 'mobx' instead +* [ ] Running codemod: yarn jscodeshift -t codemod/undecorate.ts test/v5/base/typescript-tests.ts --ignoreImports=true +* [ ] killed: IGNORE_MOBX_MINIFY_WARNING +* [ ] Document: recommended settings for prod versus experimentation +* [ ] Migration: document switching from 4 to 5: configure( ) with proxies, requiresReqction, enforceActions +* [ ] makeObservable + private members in TypeScript (second call? computed name? tsignore?) +* [ ] print deprecation warnings for all old apis in mobx 4/5 +* [ ] Breaking: it is no longer safe to call action from autorun. Use effect or reaction instead. +* [ ] \_allowStateChangesINComputation is no longer needed, us `runInAction` instead. +* [ ] Breaking: in computed, the when predicate, and reaction predicate it is never allowed to directly change state. State changes should be wrapped in action. +* [ ] Breaking: `toJS` no longer takes action, and no longer converts Maps and Sets to plain data structures. Serializing data structures is out of scope for the MobX project, and write custom serialization methods are much more sustainable. You might even leverage @computed to serialize state. +* [ ] Breaking: directly calling .get() / .set() on an observable array is no longer supported +* [ ] Breaking: killed IObservableObject interface. +* [ ] Breaking: sorting or reversing an array in an derivation will now throw rather than warn. +* [ ] Breaking: sorting or reversing an array in an actino will no sort or reverse the source array rather than shallow copy. +* Fixed #2326 +* Fixed #2379 ## NOTES diff --git a/packages/mobx-undecorate/cli.js b/packages/mobx-undecorate/cli.js index eb617af77..08d0e95ea 100755 --- a/packages/mobx-undecorate/cli.js +++ b/packages/mobx-undecorate/cli.js @@ -1,11 +1,16 @@ #!/usr/bin/env node const { spawn } = require("child_process") -const { resolve } = require("path") // this is pretty lame, probably better make a .cmd and .sh file... spawn( "node_modules/.bin/jscodeshift", - [...process.argv.filter(arg => arg.startsWith("--")), "-t", "src/undecorate.ts", process.cwd()], + [ + "--extensions=js,jsx,ts,tsx", + ...process.argv.filter(arg => arg.startsWith("--")), + "-t", + "src/undecorate.ts", + process.cwd() + ], { cwd: __dirname, stdio: "inherit" diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json index cf2885edd..2cdd4edb5 100644 --- a/packages/mobx-undecorate/package.json +++ b/packages/mobx-undecorate/package.json @@ -1,6 +1,6 @@ { "name": "mobx-undecorate", - "version": "0.0.3", + "version": "0.0.4", "description": "Migrate MobX 4/5 to MobX 6", "bin": "cli.js", "scripts": { From f4f87dc80932af70d7d6a000c97da9d248003bb3 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 3 Jul 2020 16:25:55 +0200 Subject: [PATCH 0406/1043] Further updates and reorganization. --- docs/react/react-integration.md | 16 ++++++----- docs/refguide/boxed.md | 14 ++++++---- docs/refguide/extend-observable.md | 44 +++++++++++++++++++----------- docs/refguide/object.md | 4 ++- notes-docs.md | 14 ++++++---- website/i18n/en.json | 1 + website/sidebars.json | 30 ++++++++++---------- 7 files changed, 73 insertions(+), 50 deletions(-) diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index bbde9dd15..436c58a28 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -175,13 +175,6 @@ then no display name will be visible in the DevTools. The following approaches can be used to fix this: -- set `displayName` explicitly: - - ```javascript - export const MyComponent = observer(props =>
    hi
    ) - MyComponent.displayName = "MyComponent" - ``` - - use `function` with a name instead of an arrow function. `mobx-react` infers component name from function name: ```javascript @@ -204,6 +197,15 @@ The following approaches can be used to fix this: export default observer(MyComponent) ``` +- [**Broken**] Set `displayName` explicitly: + + ```javascript + export const MyComponent = observer(props =>
    hi
    ) + MyComponent.displayName = "MyComponent" + ``` + + This is broken in React at the time of writing; mobx-react `observer` uses a React.memo and runs into this bug: https://github.com/facebook/react/issues/18026 + ### Use the `` component in cases where you can't use observer Sometimes it is hard to apply `observer` to a part of the rendering, for example because you are rendering inside a callback, and you don't want to extract a new component to be able to mark it as `observer`. diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index 78e4e62b0..bace1a0c5 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -4,17 +4,19 @@ sidebar_label: boxed values hide_title: true --- -## Primitive values and references +# Boxed values -
    +Usage: + +- `observable.boxed(value, options?)` All primitive values in JavaScript are immutable and hence per definition not observable. Usually that is fine, as MobX usually can just make the _property_ that contains the value observable. See also [observable objects](object.md). In rare cases it can be convenient to have an observable "primitive" that is not owned by an object. -For these cases it is possible to create an observable box that manages such a primitive. +For these cases it is possible to create an observable _box_ that manages such a primitive. -### `observable.box(value)` +## `observable.box(value)` So `observable.box(value)` accepts any value and stores it inside a box. The current value can be accessed through `.get()` and updated using `.set(newValue)`. @@ -29,11 +31,11 @@ So the signature of object returned by `observable.box(scalar)` is: - `intercept(interceptor)`. Can be used to intercept changes before they are applied. See [observe & intercept](observe.md) - `.observe(callback: (change) => void, fireImmediately = false): disposerFunction`. Registers an observer function that will fire each time the stored value is replaced. Returns a function to cancel the observer. See [observe & intercept](observe.md). The `change` parameter is an object containing both the `newValue` and `oldValue` of the observable. -### `observable.box(value, { deep: false })` +## `observable.box(value, { deep: false })` Creates a box based on the [`ref`](modifiers.md) decorator. This means that any (future) value of box wouldn't be converted into an observable automatically. -### Example +## Example ```javascript import { observable } from "mobx" diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 05e52c305..2b8f37afc 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -5,20 +5,41 @@ hide_title: true # extendObservable -
    +Usage: -`extendObservable(target, properties, decorators?, options?)` +- `extendObservable(target, properties, annotions?, options?)` -ExtendObservable can be used to add observable properties to the existing target objects. -All key / value pairs in the properties map will result in new observable properties on the target initialized to the given value. -Any getters in the properties map will be turned into computed properties. +ExtendObservable can be used to add observable properties to an existing target object. +All key / value pairs in the `properties` object result in new observable properties on the target initialized to the given value. Any getters in the properties map are turned into computed properties. -The `decorators` param can be used to override the decorator that will be used for a specific property, similar to `decorate` and `observable.object`. +The `annotations` param can be used to override the declaration that is used for a specific property, similar to [`makeObservable` and `makeAutoObservable`](make-observable.md). The difference between `extendObservable` and `makeAutoObservable` is that `extendObservable` sets properties and declares information about them at the same time. Use the `deep: false` option to make the new properties _shallow_. That is, prevent auto conversion of their _values_ to observables. +Here we add a new observable property to an alread observable instance: + ```javascript -var Person = function (firstName, lastName) { +class Person { + constructor(firstName, lastName) { + this.firstName = firstName + this.lastName = lastName + makeAutoObservable(this) + } +} + +const matthew = new Person("Matthew", "Henry") + +// add a new observable property to an already observable object +extendObservable(matthew, { + age: 353 +}) +``` + +Here is an example of how you could make factory function that constructs +observable instances, though normally you would use a class with `makeObservable` or `makeAutoObservable` for this purpose: + +```javascript +class Person = function (firstName, lastName) { // initialize observable properties on a new instance extendObservable( this, @@ -37,17 +58,8 @@ var Person = function (firstName, lastName) { } ) } - -var matthew = new Person("Matthew", "Henry") - -// add an observable property to an already observable object -extendObservable(matthew, { - age: 353 -}) ``` Note: `observable.object(object)` is actually an alias for `extendObservable({}, object)`. -Note: `decorate` could be used to introduce observable properties to an object, similar to `extendObservable`. The difference is that `extendObservable` is designed to introduce properties directly on the target instance, where `decorate` introduces them on prototypes; you can either pass it a constructor function (class) directly, or an object that will act as prototype for others. - Note: `extendObservable` can not be used to introduce new properties on observable arrays or objects diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 0ed3966d2..bb5f00f59 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -8,12 +8,14 @@ hide_title: true Usage: -- `observable.object(props, decorators?, options?)` +- `observable.object(props, annotations?, options?)` If a plain JavaScript object is passed to `observable` all properties inside will be copied into a clone and made observable. (A plain object is an object that wasn't created using a constructor function / but has `Object` as its prototype, or no prototype at all.) `observable` is by default applied recursively, so if one of the encountered values is an object or array, that value will be passed through `observable` as well. +The `annotations` param can be used to override the declaration that is used for a specific property, similar to [`makeObservable` and `makeAutoObservable`](make-observable.md). + ```javascript import { observable, autorun, action } from "mobx" diff --git a/notes-docs.md b/notes-docs.md index 4fc74fc7f..b3ae44f75 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -110,6 +110,8 @@ Here is a proposed structure: - maps + - Boxed values + - Updating observables - action @@ -136,12 +138,16 @@ Here is a proposed structure: - Debugging MobX - - toJS - - Using trace for debugging +- Utilities + + - toJS + - Spy + - Object API + - Organizing your application - Best practices @@ -154,10 +160,6 @@ Here is a proposed structure: - Limitations without Proxy Support - - Boxed values - - - Object API - Mine the API docs page to deduplicate content and move it into the rest of the docs. diff --git a/website/i18n/en.json b/website/i18n/en.json index 559f41534..d376dc6bf 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -192,6 +192,7 @@ "Updating observables": "Updating observables", "Computed values": "Computed values", "Effects for observables": "Effects for observables", + "Debugging MobX": "Debugging MobX", "Utilities": "Utilities", "Tips & Tricks": "Tips & Tricks" } diff --git a/website/sidebars.json b/website/sidebars.json index 2101582d9..41a630a8e 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -16,16 +16,18 @@ "refguide/observable", "refguide/object", "refguide/array", - "refguide/map" + "refguide/map", + "refguide/extend-observable", + "refguide/boxed" ], "Updating observables": [ "refguide/action", "best/actions" ], "Computed values": [ - "refguide/computed", - "refguide/computed-options", - "refguide/computed-behavior" + "refguide/computed", + "refguide/computed-options", + "refguide/computed-behavior" ], "Effects for observables": [ "refguide/autorun", @@ -34,28 +36,28 @@ "best/dispose-reactions", "best/what-does-mobx-react-to" ], + "Debugging MobX": [ + "best/trace" + ], "Utilities": [ "refguide/api", - "refguide/boxed", - "refguide/modifiers", "refguide/tojson", + "refguide/spy", + "refguide/observe", "refguide/inject", - "refguide/extend-observable", + "refguide/object-api", + "refguide/mobx-utils", + "refguide/modifiers", "refguide/extending", - "refguide/observe", "refguide/create-transformer", - "refguide/expr", - "refguide/object-api", - "refguide/mobx-utils" + "refguide/expr" ], "Tips & Tricks": [ "faq/faq", "best/pitfalls", "best/limitations-without-proxies", "best/decorators", - "best/trace", - "best/store", - "refguide/spy" + "best/store" ] } } From 603f5e63a43575d6cb08845d10ff7dd3dba61fa4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 3 Jul 2020 16:27:26 +0200 Subject: [PATCH 0407/1043] Update docs notes. --- notes-docs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index b3ae44f75..4d0b48a16 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -62,8 +62,8 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. - [ ] Consider breaking up computed.md into a basic and "advanced" document. - [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? -- [ ] There seems to a bug so that displayName is not picked up for functional components for the devtools, and the docs do recommend it. Create an issue that reproduces this behavior for mobx-react. -- [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. +- [ ] The broken displayName issue with React.memo and thus with observer. Now marked as broken in the docs, but should be updated once fixed. +- [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. It does seem to work as intended according to the issue though. ## Structure thoughts From 5cf384b89d6310fa6cdf70e990c87db0199ae231 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 3 Jul 2020 16:35:16 +0200 Subject: [PATCH 0408/1043] Move this documentation to "effects for observables". --- docs/refguide/observe.md | 4 +--- website/sidebars.json | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index 99ac21bf7..d25e1b655 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -6,8 +6,6 @@ hide_title: true # Intercept & Observe -
    - `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). `intercept` can be used to detect and modify mutations before they are applied to the observable. `observe` allows you to intercept changes after they have been made. @@ -18,7 +16,7 @@ Usage: `intercept(target, propertyName?, interceptor)` - `target`: the observable to guard - `propertyName`: optional parameter to specify a specific property to intercept. Note that `intercept(user.name, interceptor)` is fundamentally different from `intercept(user, "name", interceptor)`. The first tries to add an interceptor to the _current_ `value` inside `user.name` (which might not be an observable at all), the latter intercepts changes to the `name` _property_ of `user`. -- `interceptor`: callback that will be invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation. +- `interceptor`: callback that is invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation. The `intercept` should tell MobX what needs to happen with the current change. Therefore it should do one of the following things: diff --git a/website/sidebars.json b/website/sidebars.json index 41a630a8e..116ffe3e8 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -21,20 +21,21 @@ "refguide/boxed" ], "Updating observables": [ - "refguide/action", - "best/actions" + "refguide/action", + "best/actions" ], "Computed values": [ - "refguide/computed", - "refguide/computed-options", - "refguide/computed-behavior" + "refguide/computed", + "refguide/computed-options", + "refguide/computed-behavior" ], "Effects for observables": [ - "refguide/autorun", - "refguide/reaction", - "refguide/when", - "best/dispose-reactions", - "best/what-does-mobx-react-to" + "refguide/autorun", + "refguide/reaction", + "refguide/when", + "refguide/observe", + "best/dispose-reactions", + "best/what-does-mobx-react-to" ], "Debugging MobX": [ "best/trace" @@ -43,7 +44,6 @@ "refguide/api", "refguide/tojson", "refguide/spy", - "refguide/observe", "refguide/inject", "refguide/object-api", "refguide/mobx-utils", From c4348082533b61832c413036392449eadd6309b1 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 3 Jul 2020 16:40:05 +0200 Subject: [PATCH 0409/1043] Update. --- docs/best/trace.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/docs/best/trace.md b/docs/best/trace.md index 123faf807..782ee5f66 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -6,8 +6,6 @@ hide_title: true # Using `trace` for debugging -
    - Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. It can be used by simply importing `import { trace } from "mobx"`, and then put it inside a reaction or computed value. @@ -37,20 +35,17 @@ There are different ways of calling `trace()`, some examples: import { observer } from "mobx-react" import { trace } from "mobx" -@observer -class MyComponent extends React.Component { - render() { - trace(true) // enter the debugger whenever an observable value causes this component to re-run - return
    {this.props.user.name} - } -} +const MyComponent = observer(() => { + trace(true) // enter the debugger whenever an observable value causes this component to re-run + return
    {this.props.user.name} +}) ``` Enable trace by using the `reaction` argument of an reaction / autorun: ```javascript -mobx.autorun("loggerzz", r => { - r.trace() +mobx.autorun("loggerzz", reaction => { + reaction.trace() console.log(user.fullname) }) ``` From 2d92ca775fc1a0f57fa2a3bc4b711fc1fed68cfa Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 4 Jul 2020 20:55:00 +0100 Subject: [PATCH 0410/1043] Added sup --- notes.md | 7 +- .../__tests__/undecorate.spec.ts | 138 +++++++++++++++--- packages/mobx-undecorate/package.json | 2 +- packages/mobx-undecorate/src/undecorate.ts | 116 +++++++++------ test/v5/base/make-observable.ts | 74 +++++++++- 5 files changed, 272 insertions(+), 65 deletions(-) diff --git a/notes.md b/notes.md index da5ed5cde..cdc2768a9 100644 --- a/notes.md +++ b/notes.md @@ -35,14 +35,14 @@ - [x] compare mobx.configure options between v4 and v5 - [ ] two or 3 modes for configure useProxies? If two, kill `deep` option to observable? - [ ] annotations instead of decorators - - [ ] update typings for makeObservable with private keys + - [x] update typings for makeObservable with private keys - [x] get rid of all that pending decorators shizzle - [x] Todo: check how important array of decorators is, see original issue -> This will be breaking issue, as we are going to treat action etc different? - [ ] Optimize: cache meta data - [x] observable / extendObservable use decorators args - [x] observable; support `false` as argument - - [ ] makeObservable don't warn about missing fields? - - [ ] test late initialization (after declaring props) + - [x] ~makeObservable don't warn about missing fields?~ use extendObservable instead + - [x] test late initialization (after declaring props) - [ ] misc - [x] revisit safety model - [x] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! @@ -61,6 +61,7 @@ - [ ] kill / fix flow types - [ ] enable search on docs - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. + - [ ] displayname for observer components facebook/react#18026 ## Docs / migration guide diff --git a/packages/mobx-undecorate/__tests__/undecorate.spec.ts b/packages/mobx-undecorate/__tests__/undecorate.spec.ts index 2ac1d179a..595f6ea26 100644 --- a/packages/mobx-undecorate/__tests__/undecorate.spec.ts +++ b/packages/mobx-undecorate/__tests__/undecorate.spec.ts @@ -109,25 +109,26 @@ describe("general", () => { } `) ).toMatchInlineSnapshot(` - "import { observable, makeObservable } from \\"mobx\\"; - - class ExtendsHasMethod extends Box { - x = 1; - - constructor() { - super(); - - makeObservable(this, { - x: observable - }); - } - - // test - method() { - console.log(\\"hi\\") - } - }" - `) + "import { observable, makeObservable } from \\"mobx\\"; + + class ExtendsHasMethod extends Box { + x = 1; + + constructor() { + // TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call + super(); + + makeObservable(this, { + x: observable + }); + } + + // test + method() { + console.log(\\"hi\\") + } + }" + `) }) test("class with constructor", () => { @@ -1025,4 +1026,103 @@ describe("@observer", () => { }));" `) }) + + test("class comp with local fields - 1", () => { + expect( + convert( + ` + import {observer, inject} from 'mobx-react' + import {observable} from "mobx" + import {Component} from "react" + + @observer class X extends React.Component { + @observable field = 1 + } + + `, + { keepDecorators: false } + ) + ).toMatchInlineSnapshot(` + "import {observer, inject} from 'mobx-react' + import { observable, makeObservable } from \\"mobx\\"; + import {Component} from \\"react\\" + + const X = observer(class X extends React.Component { + field = 1; + + constructor(props) { + super(props); + + makeObservable(this, { + field: observable + }); + } + });" + `) + }) + + test("class comp with local fields preserves Props generic", () => { + expect( + convert( + ` + import {observer, inject} from 'mobx-react' + import {observable} from "mobx" + import {PureComponent} from "react" + + @observer class X extends PureComponent<{x: boolean}> { + @observable field = 1 + } + + `, + { keepDecorators: false } + ) + ).toMatchInlineSnapshot(` + "import {observer, inject} from 'mobx-react' + import { observable, makeObservable } from \\"mobx\\"; + import {PureComponent} from \\"react\\" + + const X = observer(class X extends PureComponent<{x: boolean}> { + field = 1; + + constructor(props: {x: boolean}) { + super(props); + + makeObservable(this, { + field: observable + }); + } + });" + `) + }) + + test("class comp with local fields preserves Props generic", () => { + expect( + convert( + ` + import {observer, inject} from 'mobx-react' + import {observable} from "mobx" + import {PureComponent} from "react" + + @observer class X extends PureComponent<{x: boolean}> { + @observable field = 1 + } + + `, + { keepDecorators: true } + ) + ).toMatchInlineSnapshot(` + "import {observer, inject} from 'mobx-react' + import { observable, makeObservable } from \\"mobx\\"; + import {PureComponent} from \\"react\\" + + @observer class X extends PureComponent<{x: boolean}> { + @observable field = 1 + + constructor(props: {x: boolean}) { + super(props); + makeObservable(this); + } + }" + `) + }) }) diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json index 2cdd4edb5..38829d381 100644 --- a/packages/mobx-undecorate/package.json +++ b/packages/mobx-undecorate/package.json @@ -1,6 +1,6 @@ { "name": "mobx-undecorate", - "version": "0.0.4", + "version": "0.0.5", "description": "Migrate MobX 4/5 to MobX 6", "bin": "cli.js", "scripts": { diff --git a/packages/mobx-undecorate/src/undecorate.ts b/packages/mobx-undecorate/src/undecorate.ts index daf1ae92a..b19b8c618 100644 --- a/packages/mobx-undecorate/src/undecorate.ts +++ b/packages/mobx-undecorate/src/undecorate.ts @@ -67,14 +67,24 @@ export default function tranform( decoratorsBeforeExport = !options?.decoratorsAfterExport const j = api.jscodeshift const superCall = j.expressionStatement(j.callExpression(j.super(), [])) + superCall.comments = [ + j.commentLine( + " TODO: [mobx-undecorate] verify the constructor arguments and the arguments of this automatically generated super call" + ) + ] + const reactSuperCall = j.expressionStatement( + j.callExpression(j.super(), [j.identifier("props")]) + ) const source = j(fileInfo.source) const lines = fileInfo.source.split("\n") let changed = false let needsInitializeImport = false const decoratorsUsed = new Set(options?.ignoreImports ? validDecorators : []) let usesDecorate = options?.ignoreImports ? true : false + let hasReact = options?.ignoreImports ? true : false source.find(j.ImportDeclaration).forEach(im => { + if (im.value.source.value === "react") hasReact = true if (validPackages.includes(im.value.source.value as string)) { let decorateIndex = -1 im.value.specifiers.forEach((specifier, idx) => { @@ -181,46 +191,12 @@ export default function tranform( createConstructor(clazz, members, privates) needsInitializeImport = true } - }) - - // rewrite all @observer / @inject - if (!options?.keepDecorators && decoratorsUsed.has("observer")) { - source.find(j.ClassDeclaration).forEach(clazzPath => { - const clazz = clazzPath.value - // find @observer - const observerDecorator = (clazz as any).decorators?.find( - dec => - j.Decorator.check(dec) && - j.Identifier.check(dec.expression) && - dec.expression.name === "observer" - ) - // find @inject - const injectDecorator = (clazz as any).decorators?.find( - dec => - j.Decorator.check(dec) && - j.CallExpression.check(dec.expression) && - j.Identifier.check(dec.expression.callee) && - dec.expression.callee.name === "inject" - ) - if (!observerDecorator && !injectDecorator) return - // re-create the class - let newClassDefExpr: any = j.classExpression(clazz.id, clazz.body, clazz.superClass) - // wrap with observer - if (observerDecorator) - newClassDefExpr = j.callExpression(j.identifier("observer"), [newClassDefExpr]) - // wrap with inject - if (injectDecorator) - newClassDefExpr = j.callExpression(injectDecorator.expression, [newClassDefExpr]) - - changed = true - const decl = j.variableDeclaration("const", [ - j.variableDeclarator(j.identifier(clazz.id!.name), newClassDefExpr) - ]) - decl.comments = clazz.comments - clazzPath.replace(decl) - }) - } + // rewrite all @observer / @inject + if (!options?.keepDecorators && decoratorsUsed.has("observer")) { + handleObserverAndInject(clazzPath) + } + }) if (needsInitializeImport && !options?.ignoreImports) { // @ts-ignore @@ -247,6 +223,45 @@ export default function tranform( return source.toSource() } + function handleObserverAndInject(clazzPath: ASTPath) { + const clazz = clazzPath.value + // find @observer + const observerDecorator = (clazz as any).decorators?.find( + dec => + j.Decorator.check(dec) && + j.Identifier.check(dec.expression) && + dec.expression.name === "observer" + ) + // find @inject + const injectDecorator = (clazz as any).decorators?.find( + dec => + j.Decorator.check(dec) && + j.CallExpression.check(dec.expression) && + j.Identifier.check(dec.expression.callee) && + dec.expression.callee.name === "inject" + ) + if (!observerDecorator && !injectDecorator) return + + // re-create the class + let newClassDefExpr: any = j.classExpression(clazz.id, clazz.body, clazz.superClass) + newClassDefExpr.superTypeParameters = clazz.superTypeParameters + newClassDefExpr.typeParameters = clazz.typeParameters + newClassDefExpr.implements = clazz.implements + // wrap with observer + if (observerDecorator) + newClassDefExpr = j.callExpression(j.identifier("observer"), [newClassDefExpr]) + // wrap with inject + if (injectDecorator) + newClassDefExpr = j.callExpression(injectDecorator.expression, [newClassDefExpr]) + + changed = true + const decl = j.variableDeclaration("const", [ + j.variableDeclarator(j.identifier(clazz.id!.name), newClassDefExpr) + ]) + decl.comments = clazz.comments + clazzPath.replace(decl) + } + function handleProperty( property: ClassProperty & /* | or ClassMethod */ { decorators: Decorator[] @@ -327,15 +342,34 @@ export default function tranform( ) } + let superClassName = j.Identifier.check(clazz.superClass) + ? clazz.superClass.name + : j.MemberExpression.check(clazz.superClass) + ? j.Identifier.check(clazz.superClass.property) + ? clazz.superClass.property.name + : "" + : "" + + // if this clazz is a react component, we now that the constructor and super call have one argument, the props + let isReactComponent = + hasReact && ["Component", "PureComponent"].includes(superClassName) + let propsType = isReactComponent && clazz.superTypeParameters?.params[0] + const propsParam = j.identifier("props") + // reuse the generic if we found it + if (propsType) propsParam.typeAnnotation = j.tsTypeAnnotation(propsType as any) + // create the constructor const constructorDecl = j.methodDefinition( "constructor", j.identifier("constructor"), j.functionExpression( null, - [], + isReactComponent ? [propsParam] : [], j.blockStatement( needsSuper - ? [superCall, initializeObservablesCall] + ? [ + isReactComponent ? reactSuperCall : superCall, + initializeObservablesCall + ] : [initializeObservablesCall] ) ) diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index 0a3097c7f..d8caa00c7 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -8,7 +8,8 @@ import { isComputedProp, isAction, makeAutoObservable, - autorun + autorun, + extendObservable } from "../../../src/mobx" test("makeObservable picks up decorators", () => { @@ -280,3 +281,74 @@ test("observable actions can be used for state updaters and state readers", () = d() }) + +test("makeObservable can be used late and support non-enumerable getters", () => { + function MyClass() { + this.x = 1 + Object.defineProperty(this, "double", { + get() { + return this.x + }, + configurable: true, + enumerable: false + }) + this.inc = function () { + this.x++ + } + makeObservable(this, { + x: observable, + double: computed, + inc: action + }) + } + const i = new MyClass() + + expect(isObservableProp(i, "x")).toBe(true) + expect(isComputedProp(i, "double")).toBe(true) + expect(isAction(i.inc)).toBe(true) +}) + +test("makeAutoObservable can be used late and support non-enumerable getters", () => { + function MyClass() { + this.x = 1 + Object.defineProperty(this, "double", { + get() { + return this.x + }, + configurable: true, + enumerable: false + }) + this.inc = function () { + this.x++ + } + makeAutoObservable(this) + } + const i = new MyClass() + + expect(isObservableProp(i, "x")).toBe(true) + expect(isComputedProp(i, "double")).toBe(true) + expect(isAction(i.inc)).toBe(true) +}) + +test("extendObservable can be used late and support non-enumerable getters #2386", () => { + function MyClass() { + const args = { + x: 1, + inc() { + this.x++ + } + } + Object.defineProperty(args, "double", { + get() { + return this.x + }, + enumerable: false + }) + extendObservable(this, args) + } + const i = new MyClass() + + expect(isObservableProp(i, "x")).toBe(true) + expect(isComputedProp(i, "double")).toBe(true) + expect(isAction(i.inc)).toBe(true) +}) From 7c5ed6ce793b262a7aa8ed5ee6243e2bdc70bc73 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 5 Jul 2020 21:38:00 +0100 Subject: [PATCH 0411/1043] cache inferred properties and warn about invalid proxy usage with ES5 mode --- notes.md | 21 ++++----- src/api/configure.ts | 1 + src/api/makeObservable.ts | 30 +++++++++---- src/core/globalstate.ts | 1 - src/types/dynamicobject.ts | 20 +++++++-- src/utils/utils.ts | 8 ++-- test/v5/base/errorhandling.js | 75 ++++++++++++++++++++++++++++++++- test/v5/base/make-observable.ts | 5 +++ 8 files changed, 132 insertions(+), 29 deletions(-) diff --git a/notes.md b/notes.md index cdc2768a9..c505d55fa 100644 --- a/notes.md +++ b/notes.md @@ -13,7 +13,7 @@ - [x] add **PURE** annotations? - [x] extract utils for getOwnPropertyDescriptor and defineProperty - [x] configure property mangling like in Immer. Will it save anything? -- [ ] code mod +- [x] code mod - [x] code mod, run on v4 tests? - [x] codemod TS - [x] codemod babel @@ -25,20 +25,20 @@ - [x] unit tests for `ignoreImports` - [x] unit tests for `keepDecorators` - [x] put in separate package - - [ ] special case constuctor of React components - - [ ] print // TODO about super calls -- [ ] ES5 support + - [x] special case constuctor of React components + - [x] print // TODO about super calls +- [x] ES5 support - [x] combine with ES5? - [x] backport tests and code to v4(6) - [x] make sure legacy array implementation is opt in - [x] ~map / set as opt-in as well?~ - [x] compare mobx.configure options between v4 and v5 - - [ ] two or 3 modes for configure useProxies? If two, kill `deep` option to observable? -- [ ] annotations instead of decorators + - [x] two or 3 modes for configure useProxies? If two, kill `deep` option to observable? +- [x] annotations instead of decorators - [x] update typings for makeObservable with private keys - [x] get rid of all that pending decorators shizzle - [x] Todo: check how important array of decorators is, see original issue -> This will be breaking issue, as we are going to treat action etc different? - - [ ] Optimize: cache meta data + - [x] Optimize: cache meta data - [x] observable / extendObservable use decorators args - [x] observable; support `false` as argument - [x] ~makeObservable don't warn about missing fields?~ use extendObservable instead @@ -47,21 +47,22 @@ - [x] revisit safety model - [x] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! - [x] verify: action called from computed throws? - - [ ] apply deprecation of find and findIndex error + - [x] apply deprecation of find and findIndex error - [ ] verify perf / memory changes - [x] investigate skipped tests - [ ] process TODO's - [ ] weakmap for hasMaps in Map (and Set?) - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - [ ] include #2343 - [ ] default observable requires reaction? - [x] kill globalstate options? - - [ ] no auto lifting? https://twitter.com/getify/status/1258137826241241088 + - [ ] no binding by default? https://twitter.com/getify/status/1258137826241241088 - [ ] kill / fix flow types - [ ] enable search on docs - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. +- [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 + - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable ## Docs / migration guide diff --git a/src/api/configure.ts b/src/api/configure.ts index 80e666a71..0b6b9370a 100644 --- a/src/api/configure.ts +++ b/src/api/configure.ts @@ -34,6 +34,7 @@ export function configure(options: { ? false : typeof Proxy !== "undefined" } + if (useProxies === "ifavailable") globalState.verifyProxies = true if (enforceActions !== undefined) { const ea = enforceActions === ALWAYS ? ALWAYS : enforceActions === OBSERVED globalState.enforceActions = ea diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index 9dcce315a..0b7d344da 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -31,9 +31,13 @@ import { OBSERVABLE_SHALLOW, OBSERVABLE_STRUCT, getOwnPropertyDescriptors, - defineProperty + defineProperty, + ownKeys, + objectPrototype, + hasProp } from "../internal" -import { ownKeys, objectPrototype } from "../utils/utils" + +const CACHED_ANNOTATIONS = Symbol("mobx-cached-annotations") function makeAction(target, key, name, fn, asAutoAction) { addHiddenProp(target, key, asAutoAction ? autoAction(name || key, fn) : action(name || key, fn)) @@ -54,7 +58,7 @@ function getInferredAnnotation( function getDescriptorInChain(target: Object, prop: PropertyKey): [PropertyDescriptor, Object] { let current = target while (current && current !== objectPrototype) { - // TODO: cache meta data, especially for members from prototypes? + // Optimization: cache meta data, especially for members from prototypes? const desc = getDescriptor(current, prop) if (desc) { return [desc, current] @@ -148,8 +152,9 @@ export function makeProperty( default: if (__DEV__) die( - `invalid decorator '${annotation.annotationType_ ?? - annotation}' for '${key.toString()}'` + `invalid decorator '${ + annotation.annotationType_ ?? annotation + }' for '${key.toString()}'` ) } } @@ -199,10 +204,17 @@ export function makeAutoObservable + if (!isPlain && hasProp(proto, CACHED_ANNOTATIONS)) { + // shortcut, reuse inferred annotations for this type from the previous time + annotations = proto[CACHED_ANNOTATIONS] as any + } else { + annotations = { ...excludes } + extractAnnotationsFromObject(target, annotations, options) + if (!isPlain) { + extractAnnotationsFromProto(proto, annotations) + addHiddenProp(proto, CACHED_ANNOTATIONS, annotations) + } } makeObservable(target, annotations, options) return target diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 0194b4138..78fee4d1f 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -134,7 +134,6 @@ export class MobXGlobals { /* * print warnings about code that would fail if proxies weren't available */ - // TODO: add tests for this verifyProxies = false } diff --git a/src/types/dynamicobject.ts b/src/types/dynamicobject.ts index 2f7d7d95e..85818c9ee 100644 --- a/src/types/dynamicobject.ts +++ b/src/types/dynamicobject.ts @@ -9,6 +9,7 @@ import { die, isStringish } from "../internal" +import { globalState } from "../core/globalstate" function getAdm(target): ObservableObjectAdministration { return target[$mobx] @@ -19,7 +20,10 @@ function getAdm(target): ObservableObjectAdministration { const objectProxyTraps: ProxyHandler = { has(target: IIsObservableObject, name: PropertyKey) { if (name === $mobx || name === "constructor") return true - if (__DEV__) warnAboutProxyRequirement() // TODO: is this correct? + if (__DEV__ && globalState.trackingDerivation) + warnAboutProxyRequirement( + "detect new properties using the 'in' operator. Use 'has' from 'mobx' instead." + ) const adm = getAdm(target) // MWE: should `in` operator be reactive? If not, below code path will be faster / more memory efficient // check performance stats! @@ -50,20 +54,28 @@ const objectProxyTraps: ProxyHandler = { set(target: IIsObservableObject, name: PropertyKey, value: any) { if (!isStringish(name)) return false if (__DEV__ && !getAdm(target).values_.has(name)) { - warnAboutProxyRequirement() + warnAboutProxyRequirement( + "add a new observable property through direct assignment. Use 'set' from 'mobx' instead." + ) } set(target, name, value) return true }, deleteProperty(target: IIsObservableObject, name: PropertyKey) { - if (__DEV__) warnAboutProxyRequirement() + if (__DEV__) + warnAboutProxyRequirement( + "delete properties from an observable object. Use 'remove' from 'mobx' instead." + ) if (!isStringish(name)) return false const adm = getAdm(target) adm.remove_(name) return true }, ownKeys(target: IIsObservableObject) { - if (__DEV__) warnAboutProxyRequirement() + if (__DEV__ && globalState.trackingDerivation) + warnAboutProxyRequirement( + "iterate keys to detect added / removed properties. Use `keys` from 'mobx' instead." + ) const adm = getAdm(target) adm.keysAtom_.reportObserved() return Reflect.ownKeys(target) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 5436bc25e..f7fa754fd 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -29,11 +29,11 @@ export function assertProxies() { } } -export function warnAboutProxyRequirement() { +export function warnAboutProxyRequirement(msg: string) { if (__DEV__ && globalState.verifyProxies) { - // TODO: add relevant URL at the end of this warning - console.warn( - "MobX is currently configured to be able to allow running ES5 mode, however, this line of code will not work on ES5 environments. For details see: " + die( + "MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to " + + msg ) } } diff --git a/test/v5/base/errorhandling.js b/test/v5/base/errorhandling.js index 357ed88da..4f9aee4eb 100644 --- a/test/v5/base/errorhandling.js +++ b/test/v5/base/errorhandling.js @@ -2,7 +2,7 @@ const mobx = require("../../../src/mobx.ts") const m = mobx const utils = require("../../v5/utils/test-utils") -const { observable, computed, $mobx } = mobx +const { observable, computed, $mobx, autorun } = mobx const voidObserver = function () {} @@ -794,3 +794,76 @@ test("error in effect of when is properly cleaned up", () => { checkGlobalState() }) + +describe("es5 compat warnings", () => { + beforeEach(() => { + mobx.configure({ + useProxies: "ifavailable" + }) + }) + + test("adding / deleting property", () => { + const x = observable({ + z: 0 + }) + + expect(() => { + x.y = 2 + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to add a new observable property through direct assignment. Use 'set' from 'mobx' instead."` + ) + + expect(() => { + delete x.z + }).toThrowErrorMatchingInlineSnapshot( + `"[MobX] MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to delete properties from an observable object. Use 'remove' from 'mobx' instead."` + ) + }) + + test("iterating props", () => { + const x = observable({ + z: 0 + }) + + expect(() => { + "z" in x + }).not.toThrowError() + + let e + autorun(() => { + try { + "z" in x + } catch (err) { + e = err + } + }) + expect(e).toMatchInlineSnapshot( + `[Error: [MobX] MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to detect new properties using the 'in' operator. Use 'has' from 'mobx' instead.]` + ) + + e = undefined + + expect(() => { + Object.getOwnPropertyNames(x) + }).not.toThrowError() + autorun(() => { + try { + Object.getOwnPropertyNames(x) + } catch (err) { + e = err + } + }) + expect(e).toMatchInlineSnapshot( + `[Error: [MobX] MobX is currently configured to be able to run in ES5 mode, but in ES5 MobX won't be able to iterate keys to detect added / removed properties. Use \`keys\` from 'mobx' instead.]` + ) + }) + + afterEach(() => { + mobx._resetGlobalState() + mobx.configure({ + useProxies: "always" + }) + }) +}) + +test("should throw when adding properties in ES5 compat mode", () => {}) diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index d8caa00c7..145bd3ea1 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -323,6 +323,11 @@ test("makeAutoObservable can be used late and support non-enumerable getters", ( } makeAutoObservable(this) } + // check if annotations are cached + expect(Object.getOwnPropertySymbols(MyClass.prototype).length).toBe(0) + const x = new MyClass() + expect(Object.getOwnPropertySymbols(MyClass.prototype).length).toBe(1) + const i = new MyClass() expect(isObservableProp(i, "x")).toBe(true) From 7fdf986fe2a3bc7d48de18327a920519b5bc9b1b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 11:39:01 +0200 Subject: [PATCH 0412/1043] Split out MobX & React pitfalls from general "what does MobX do" document. --- docs/best/what-does-mobx-react-to.md | 114 +------------------------ docs/react/react-integration.md | 4 +- docs/react/react-pitfalls.md | 119 +++++++++++++++++++++++++++ website/i18n/en.json | 4 + website/sidebars.json | 1 + 5 files changed, 127 insertions(+), 115 deletions(-) create mode 100644 docs/react/react-pitfalls.md diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index bd6b9390f..188de3622 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -378,118 +378,6 @@ runInAction(() => { See the [object manipulation api](../refguide/api.md#direct-observable-manipulation) for more details -## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` - -A common mistake made with `observer` is that it doesn't track data that syntactically seems parent of the `observer` component, -but in practice is actually rendered out by a different component. This often happens when render callbacks of components are passed in first class to another component. - -Take for example the following contrived example: - -```javascript -const MyComponent = observer(({ message }) => ( -
    {message.title}
    } /> -)) - -message.title = "Bar" -``` - -At first glance everything might seem ok here, except that the `
    ` is actually not rendered by `MyComponent` (which has a tracked rendering), but by `SomeContainer`. -So to make sure that the title of `SomeContainer` correctly reacts to a new `message.title`, `SomeContainer` should be an `observer` as well. - -If `SomeContainer` comes from an external lib, this is often not under your own control. In that case you can address this by either wrapping the `div` in its own stateless `observer` based component, or by leveraging the `` component: - -```javascript -const MyComponent = observer(({ message }) => - } - /> -) - -const TitleRenderer = observer(({ message }) => -
    {message.title}
    } -) - -message.title = "Bar" -``` - -Alternatively, to avoid creating additional components, it is also possible to use the mobx-react built-in `Observer` component, which takes no arguments, and a single render function as children: - -```javascript -const MyComponent = ({ message }) => ( - {() =>
    {message.title}
    }
    } /> -) - -message.title = "Bar" -``` - -## Avoid caching observables in local fields - -A common mistake is to store local variables that dereference observables, and then expect components to react. For example: - -```javascript -@observer -class MyComponent extends React.component { - author - constructor(props) { - super(props) - this.author = props.message.author - } - - render() { - return
    {this.author.name}
    - } -} -``` - -This component will react to changes in the `author`'s name, but it won't react to changing the `.author` of the `message` itself! Because that dereferencing happened outside `render()`, -which is the only tracked function of an `observer` component. -Note that even marking the `author` component field as `@observable` field does not solve this; that field is still assigned only once. -This can simply be solved by doing the dereferencing inside `render()`, or by introducing a computed property on the component instance: - -```javascript -@observer class MyComponent extends React.component { - @computed get author() { - return this.props.message.author - } -// ... -``` - -## How multiple components will render - -Suppose that the following components are used to render our above `message` object. - -```javascript -const Message = observer(({ message }) => ( -
    - {message.title} - - -
    -)) - -const Author = observer(({ author }) => {author.name}) - -const Likes = observer(({ likes }) => ( -
      - {likes.map(like => ( -
    • {like}
    • - ))} -
    -)) -``` - -| change | re-rendering component | -| ----------------------------------- | ---------------------------------------------------------------------- | -| `message.title = "Bar"` | `Message` | -| `message.author.name = "Susan"` | `Author` (`.author` is dereferenced in `Message`, but didn't change)\* | -| `message.author = { name: "Susan"}` | `Message`, `Author` | -| `message.likes[0] = "Michel"` | `Likes` | - -Notes: - -1. \* If the `Author` component was invoked like: ``. Then `Message` would be the dereferencing component and react to changes to `message.author.name`. Nonetheless `` would rerender as well, because it receives a new value. So performance wise it is best to dereference as late as possible. -2. \*\* If likes were objects instead of strings, and if they were rendered by their own `Like` component, the `Likes` component would not rerender for changes happening inside a specific like. - -## TL;DR +#### TL;DR > MobX reacts to any _existing_ **observable** _property_ that is read during the execution of a tracked function. diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index 436c58a28..e0da8e063 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -251,7 +251,7 @@ If the problem is not entirely clear, make sure to study [what does MobX react t Because `observer` only applies to exactly the `render` function of the current component; passing a render callback or component to a child component doesn't become reactive automatically. -For more details, see the [what does Mobx react to](https://mobx.js.org/best/react.html#what-does-mobx-react-to) guide. +For more details, see [MobX and React pitfalls](react-pitfalls.md). ### Declaring propTypes might cause unnecessary renders in dev mode @@ -265,5 +265,5 @@ See the relevant [React performance section](react-performance.md). 1. Make sure you didn't forget `observer` (yes, this is the most common mistake) 2. Make sure you grok how tracking works in general: [what does MobX react to](../best/what-does-mobx-react-to.md) -3. Read the [common mistakes](../best/pitfalls.md) section +3. Read the [common mistakes](react-pitfalls.md) section 4. Use [trace](../best/trace.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](../refguide/spy.md) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. diff --git a/docs/react/react-pitfalls.md b/docs/react/react-pitfalls.md new file mode 100644 index 000000000..6d4e13264 --- /dev/null +++ b/docs/react/react-pitfalls.md @@ -0,0 +1,119 @@ +--- +title: MobX and React pitfalls +sidebar_label: MobX and React pitfalls +hide_title: true +--- + +# MobX and React pitfalls + +## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` + +A common mistake made with `observer` is that it doesn't track data that syntactically seems parent of the `observer` component, +but in practice is actually rendered out by a different component. This often happens when render callbacks of components are passed in first class to another component. + +Take for example the following contrived example: + +```javascript +const MyComponent = observer(({ message }) => ( +
    {message.title}
    } /> +)) + +message.title = "Bar" +``` + +At first glance everything might seem ok here, except that the `
    ` is actually not rendered by `MyComponent` (which has a tracked rendering), but by `SomeContainer`. +So to make sure that the title of `SomeContainer` correctly reacts to a new `message.title`, `SomeContainer` should be an `observer` as well. + +If `SomeContainer` comes from an external lib, this is often not under your own control. In that case you can address this by either wrapping the `div` in its own stateless `observer` based component, or by leveraging the `` component: + +```javascript +const MyComponent = observer(({ message }) => + } + /> +) + +const TitleRenderer = observer(({ message }) => +
    {message.title}
    } +) + +message.title = "Bar" +``` + +Alternatively, to avoid creating additional components, it is also possible to use the mobx-react built-in `Observer` component, which takes no arguments, and a single render function as children: + +```javascript +const MyComponent = ({ message }) => ( + {() =>
    {message.title}
    }
    } /> +) + +message.title = "Bar" +``` + +## Avoid caching observables in local fields + +A common mistake is to store local variables that dereference observables, and then expect components to react. For example: + +```javascript +@observer +class MyComponent extends React.component { + author + constructor(props) { + super(props) + this.author = props.message.author + } + + render() { + return
    {this.author.name}
    + } +} +``` + +This component will react to changes in the `author`'s name, but it won't react to changing the `.author` of the `message` itself! Because that dereferencing happened outside `render()`, +which is the only tracked function of an `observer` component. +Note that even marking the `author` component field as `@observable` field does not solve this; that field is still assigned only once. +This can simply be solved by doing the dereferencing inside `render()`, or by introducing a computed property on the component instance: + +```javascript +@observer class MyComponent extends React.component { + @computed get author() { + return this.props.message.author + } +// ... +``` + +## How multiple components will render + +Suppose that the following components are used to render our above `message` object. + +```javascript +const Message = observer(({ message }) => ( +
    + {message.title} + + +
    +)) + +const Author = observer(({ author }) => {author.name}) + +const Likes = observer(({ likes }) => ( +
      + {likes.map(like => ( +
    • {like}
    • + ))} +
    +)) +``` + +| change | re-rendering component | +| ----------------------------------- | ---------------------------------------------------------------------- | +| `message.title = "Bar"` | `Message` | +| `message.author.name = "Susan"` | `Author` (`.author` is dereferenced in `Message`, but didn't change)\* | +| `message.author = { name: "Susan"}` | `Message`, `Author` | +| `message.likes[0] = "Michel"` | `Likes` | + +Notes: + +1. \* If the `Author` component was invoked like: ``. Then `Message` would be the dereferencing component and react to changes to `message.author.name`. Nonetheless `` would rerender as well, because it receives a new value. So performance wise it is best to dereference as late as possible. +2. \*\* If likes were objects instead of strings, and if they were rendered by their own `Like` component, the `Likes` component would not rerender for changes happening inside a specific like. diff --git a/website/i18n/en.json b/website/i18n/en.json index d376dc6bf..dc8a83d89 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -76,6 +76,10 @@ "title": "Optimizing rendering React components", "sidebar_label": "Optimizing React components" }, + "react/react-pitfalls": { + "title": "MobX and React pitfalls", + "sidebar_label": "MobX and React pitfalls" + }, "README": { "title": "Introduction", "sidebar_label": "Introduction" diff --git a/website/sidebars.json b/website/sidebars.json index 116ffe3e8..3c75b52cf 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -8,6 +8,7 @@ ], "MobX and React": [ "react/react-integration", + "react/react-pitfalls", "react/react-performance", "react/react-class-components" ], From 1c2ab34dfeb1c30ce772033739931e6591f082bc Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 11:45:47 +0200 Subject: [PATCH 0413/1043] Use class fields everywhere we use makeAutoObservable. --- docs/best/dispose-reactions.md | 3 ++- docs/best/what-does-mobx-react-to.md | 5 ++++- docs/react/react-class-components.md | 2 ++ docs/refguide/autorun.md | 5 +++++ docs/refguide/extend-observable.md | 3 +++ docs/refguide/make-observable.md | 2 ++ docs/refguide/reaction.md | 3 +++ 7 files changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/best/dispose-reactions.md b/docs/best/dispose-reactions.md index b72f07565..39cc21bc1 100644 --- a/docs/best/dispose-reactions.md +++ b/docs/best/dispose-reactions.md @@ -22,8 +22,9 @@ Example: ```javascript class Vat { + value = 1.2 + constructor() { - this.value = 1.2 makeAutoObservable(this) } } diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 188de3622..620820f8b 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -28,11 +28,14 @@ To elaborate on the above rules with an example, suppose that you have the follo ```javascript class Message { + title + author + likes constructor(title, author, likes) { + makeAutoObservable(this) this.title = title this.author = author this.likes = likes - makeAutoObservable(this) } updateTitle(title) { diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index e6a73d04e..0fb270597 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -76,6 +76,8 @@ import { makeAutoObservable, makeObservable, observable, action } from "mobx" import { observer } from "mobx-react" class User { + name + constructor(name) { this.name = name makeAutoObservable(this) diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 80163eda9..8060a0392 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -20,6 +20,9 @@ Here's an example: import { makeAutoObservable, autorun } from "mobx" class Animal { + name + energyLevel + constructor(name) { this.name = name this.energyLevel = 100 @@ -164,6 +167,8 @@ It is possible to override the default logging behavior of Reactions by providin import { makeAutoObservable, autorun } from "mobx" class Person { + age + constructor(age) { this.age = age makeAutoObservable(this) diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 2b8f37afc..e8bf36fa2 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -20,6 +20,9 @@ Here we add a new observable property to an alread observable instance: ```javascript class Person { + firstName + lastName + constructor(firstName, lastName) { this.firstName = firstName this.lastName = lastName diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 92abbdd00..c97c3089f 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -66,6 +66,8 @@ Here is the doubler with `makeAutoObservable`: import { makeAutoObservable } from "mobx" class Doubler { + value + constructor(value) { makeAutoObservable(this) this.value = value diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index b49a82ee3..90a917606 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -27,6 +27,9 @@ Here is an example: import { makeAutoObservable, reaction } from "mobx" class Animal { + name + energyLevel + constructor(name) { this.name = name this.energyLevel = 100 From 430e654f74498d6e5737094a5a03a555b7f7b7aa Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 12:00:02 +0200 Subject: [PATCH 0414/1043] Some explanation about class fields and makeAutoObservable. --- docs/refguide/make-observable.md | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index c97c3089f..85af4adae 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -85,6 +85,48 @@ class Doubler { As you can see this is more compact. +### When you call makeAutoObservable + +When you call `makeAutoObservable` all properties you want to be observable +_must_ exist on the instance already. + +In the example above you see we have declared `value` as a [public instance +field](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields) +in the class body. This ensures the property exists on the instance even before +`constructor` is called, so you can use `makeAutoObservable` at the start of +your constructor. + +Class field declarations are a [stage 3 language feature for +JS](https://github.com/tc39/proposal-class-fields), so while this feature is +close to standardization it's not officially part of JavaScript yet. It's +widely used though. Babel supports it with a +[plugin](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties) and +`create-react-app` supports it out of the box. You can use this syntax in +TypeScript too, where it's used very widely for type declaration. + +In JavaScript a public class field looks rather redundant if you only end up setting its value in the constructor. `makeAutoObservable` also works without +public class fields, but you have to call it at the end of the constructor in this case: + +```javascript +import { makeAutoObservable } from "mobx" + +class Doubler { + constructor(value) { + this.value = value + // ensure all properties exist before calling makeAutoObservable + makeAutoObservable(this) + } + + get double() { + return this.value * 2 + } + + increment() { + this.value++ + } +} +``` + ### Excluding properties that are not observable Here is how you can exclude a property from being observable: From 1105b548601882834c51d34eb9cb25106e747599 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 12:20:42 +0200 Subject: [PATCH 0415/1043] Clean up modifiers. Get rid of redundant information about computed & actions and focus it on observability. --- docs/refguide/action.md | 3 + docs/refguide/array.md | 3 +- docs/refguide/map.md | 3 +- docs/refguide/modifiers.md | 159 ++++++++++++++++--------------------- website/i18n/en.json | 2 +- website/sidebars.json | 2 +- 6 files changed, 79 insertions(+), 93 deletions(-) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 3f604fa4d..ee590ef0d 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -26,6 +26,9 @@ This ensures that intermediate or incomplete values produced during an action ar `action` also provides useful debugging information in combination with the devtools. +By passing in `name` you can control the name of the action, otherwise it +is derived from the function or method that is wrapped. + [setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) of [computed properties are automatically actions](computed.md). ## When are functions and methods not actions? diff --git a/docs/refguide/array.md b/docs/refguide/array.md index f4138b3ee..e2a085f8a 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -59,7 +59,8 @@ Unlike the built-in implementation of the functions `sort` and `reverse`, `obser ## `observable.array(values, { deep: false })` Any values assigned to an observable array will be default passed through [`observable`](observable.md) to make them observable. -Create a shallow array to disable this behavior and store a values as-is. See also [modifiers](modifiers.md) for more details on this mechanism. +Create a shallow array to disable this behavior and store a values as-is. You +can also use `observable.shallow` for this; see also [modifiers](modifiers.md). ## `observable.array(values, { name: "my array" })` diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 7a388281e..1c7a78db6 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -44,7 +44,8 @@ The following functions are not in the ES6 spec but are available in MobX: ### `observable.map(values, { deep: false })` Any values assigned to an observable map will be default passed through [`observable`](observable.md) to make them observable. -Create a shallow map to disable this behavior and store are values as-is. See also [modifiers](modifiers.md) for more details on this mechanism. +Create a shallow map to disable this behavior and store are values as-is. You +can also use `observable.shallow` for this; see also [modifiers](modifiers.md). ### `observable.map(values, { name: "my map" })` diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index c8c84fdc4..c65a54cbb 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,29 +1,71 @@ --- title: Modifiers -sidebar_label: modifiers +sidebar_label: Modifiers hide_title: true --- -# Modifiers +# Observable modifiers -
    +When you use `makeObservable`, `makeAutoObservable`, `extendObservable` and `observable.object` you can use annotations to specify how observable properties behave: -In MobX there is a set of decorators that defines how observable properties will behave. - -- `observable`: An alias for `observable.deep`. -- `observable.deep`: This is the default modifier, used by any observable. It clones and converts any (not yet observable) array, Map or plain object into it's observable counterpart upon assignment to the given property +- `observable`: An alias for `observable.deep`. The default. +- `observable.deep`: This is the default modifier, used by any observable. It clones and converts any (not yet observable) array, Map or plain object into its observable counterpart upon assignment to the given property - `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. -- `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is. -- `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value -- `computed`: Creates a derived property, see [`computed`](computed.md) -- `computed(options)`: Idem, sets additional options. -- `computed.struct`: Same as `computed`, but will only notify any of it's observers when the value produced by the view is _structurally_ different from the previous value -- `action`: Creates an action, see [`action`](action.md) -- `action(name)`: Creates an action, overrides the name -- `action.bound`: Creates an action, and binds `this` to the instance - -Decorators can be used with the api's `decorate`, `observable.object`, `extendObservable` and `observable` (when creating objects) to specify how object members should behave. -If no decorators are passed in, the default behavior is to use `observable.deep` for any key / value pair, and `computed` for getters. +- `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value. +- `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is and are not observable themselves. + +### Deep observability + +When MobX creates an observable object, it introduces observable properties which by default use the `deep` modifier. The deep modifier basically recursively calls `observable(newValue)` for any newly assigned value, so +all nested values become observable. + +This is a very convenient default. Without any additional effort all values assigned to an observable will themselves be made observable too (unless they already are), so no additional effort is required to make objects deep observable. + +### Reference observability + +In some cases however, objects don't need to be converted into observables. +Typical cases are immutable objects, or objects that are not managed by you but by an external library. Examples are JSX elements, DOM elements, native objects like History, window or etc. You just want to store a reference to those kinds of objects without turning them into an observable. + +For these situations there is the `ref` modifier. It makes sure that an observable property is created which only tracks the reference but doesn't try to convert its value. + +For example: + +```javascript +class Message { + message = "Hello world" + // fictional example, if author is immutable, we just need to store a + // reference and shouldn't turn it into a mutable, observable object + author = null + + constructor() { + makeObservable(this, { message: observable, author: observable.ref }) + } +} +``` + +Note that an observable, boxed reference can be created by using `const box = observable.shallowBox(value)` ([more](boxed.md)). + +### Shallow observability + +The `observable.shallow` modifier applies observability 'one-level-deep'. You need those if you want to create a _collection_ of observable references. +If a new collection is assigned to a property with this modifier, it is made observable, but its values will be left as is, so unlike `deep`, it won't recurse. + +Example: + +```javascript +class AuthorStore { + authors = [] + constructor() { + makeObservable(this, { authors: observable.shallow }) + } +} +``` + +In the above example an assignment of a plain array with authors to the `authors` will update the authors with an observable array, containing the original, non-observable authors. + +Note that `{ deep: false }` can be passed as option to `observable`, `observable.object`, `observable.array`, `observable.map` and `extendObservable` to create shallow collections. + +## Examples ```javascript import { observable, autorun, action } from "mobx" @@ -56,6 +98,16 @@ class Person { age = 42 showAge = false + constructor() { + makeObservable(this, { + name: observable, + age: observable, + showAge: observable, + labelText: computed, + setAge: action + }) + } + get labelText() { return this.showAge ? `${this.name} (age: ${this.age})` : this.name } @@ -64,75 +116,4 @@ class Person { this.age = age } } -// when using decorate, all fields should be specified (a class might have many more non-observable internal fields after all) -decorate(Person, { - name: observable, - age: observable, - showAge: observable, - labelText: computed, - setAge: action -}) ``` - -## Deep observability - -When MobX creates an observable object, (using `observable`, `observable.object`, or `extendObservable`), it introduces observable properties which -by default use the `deep` modifier. The deep modifier basically recursively calls `observable(newValue)` for any newly assigned value. -Which in turns uses the `deep` modifier... you get the idea. - -This is a very convenient default. Without any additional effort all values assigned to an observable will themselves be made observable too (unless they already are), so no additional -effort is required to make objects deep observable. - -## Reference observability - -In some cases however, objects don't need to be converted into observables. -Typical cases are immutable objects, or objects that are not managed by you but by an external library. -Examples are JSX elements, DOM elements, native objects like History, window or etc. -To those kind of objects, you just want to store a reference without turning them into an observable. - -For these situations there is the `ref` modifier. It makes sure that an observable property is created, which only tracks the reference but doesn't try to convert its value. -For example: - -```javascript -class Message { - @observable message = "Hello world" - - // fictional example, if author is immutable, we just need to store a reference and shouldn't turn it into a mutable, observable object - @observable.ref author = null -} -``` - -Or with just ES5 syntax: - -```javascript -function Message() { - extendObservable( - this, - { - message: "Hello world", - author: null - }, - { - author: observable.ref - } - ) -} -``` - -Note that an observable, boxed reference can be created by using `const box = observable.shallowBox(value)` - -## Shallow observability - -The `observable.shallow` modifier applies observability 'one-level-deep'. You need those if you want to create a _collection_ of observable references. -If a new collection is assigned to a property with this modifier, it will be made observable, but its values will be left as is, so unlike `deep`, it won't recurse. -Example: - -```javascript -class AuthorStore { - @observable.shallow authors = [] -} -``` - -In the above example an assignment of a plain array with authors to the `authors` will update the authors with an observable array, containing the original, non-observable authors. - -Note that `{ deep: false }` can be passed as option to `observable`, `observable.object`, `observable.array`, `observable.map` and `extendObservable` to create shallow collections. diff --git a/website/i18n/en.json b/website/i18n/en.json index dc8a83d89..4dabfa5fa 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -150,7 +150,7 @@ }, "refguide/modifiers": { "title": "Modifiers", - "sidebar_label": "modifiers" + "sidebar_label": "Modifiers" }, "refguide/object-api": { "title": "Object api", diff --git a/website/sidebars.json b/website/sidebars.json index 3c75b52cf..1bac6458b 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -18,6 +18,7 @@ "refguide/object", "refguide/array", "refguide/map", + "refguide/modifiers", "refguide/extend-observable", "refguide/boxed" ], @@ -48,7 +49,6 @@ "refguide/inject", "refguide/object-api", "refguide/mobx-utils", - "refguide/modifiers", "refguide/extending", "refguide/create-transformer", "refguide/expr" From 7c76914368345ba70385c56710a7f72e79ba89bf Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 12:25:23 +0200 Subject: [PATCH 0416/1043] A bit more linking about modifiers. --- docs/refguide/extend-observable.md | 2 +- docs/refguide/make-observable.md | 8 +++++--- docs/refguide/modifiers.md | 4 ++-- docs/refguide/object.md | 2 +- website/i18n/en.json | 4 ++-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index e8bf36fa2..76c0a3f1a 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -12,7 +12,7 @@ Usage: ExtendObservable can be used to add observable properties to an existing target object. All key / value pairs in the `properties` object result in new observable properties on the target initialized to the given value. Any getters in the properties map are turned into computed properties. -The `annotations` param can be used to override the declaration that is used for a specific property, similar to [`makeObservable` and `makeAutoObservable`](make-observable.md). The difference between `extendObservable` and `makeAutoObservable` is that `extendObservable` sets properties and declares information about them at the same time. +The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](make-observable.md). The difference between `extendObservable` and `makeAutoObservable` is that `extendObservable` sets properties and declares information about them at the same time. Use the `deep: false` option to make the new properties _shallow_. That is, prevent auto conversion of their _values_ to observables. diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 85af4adae..17b01f14f 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -46,15 +46,17 @@ Possible annotation values are: - `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map). The property cannot be a getter or a setter. See also the rules of [`observable`](observable.md). +- For more fine-grained control of observability you can use a selection of [modifiers](modifiers.md). + - `action`: Used on a method that modifies observable properties. See also [action](action.md). - `action.bound`: Like action, but used to bind the method. See [action.bound](action.md#actionbound). -- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. +- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. For more read [computed](computed.md). -* `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. +- `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. -* `false`: Explicitly do not annotate this property. Normally only useful with `makeAutoObservable`. +- `false`: Explicitly do not annotate this property. Normally only useful with `makeAutoObservable`. ## `makeAutoObservable` diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index c65a54cbb..606df8e08 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,6 +1,6 @@ --- -title: Modifiers -sidebar_label: Modifiers +title: Observable modifiers +sidebar_label: Observable modifiers hide_title: true --- diff --git a/docs/refguide/object.md b/docs/refguide/object.md index bb5f00f59..847366700 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -14,7 +14,7 @@ If a plain JavaScript object is passed to `observable` all properties inside wil (A plain object is an object that wasn't created using a constructor function / but has `Object` as its prototype, or no prototype at all.) `observable` is by default applied recursively, so if one of the encountered values is an object or array, that value will be passed through `observable` as well. -The `annotations` param can be used to override the declaration that is used for a specific property, similar to [`makeObservable` and `makeAutoObservable`](make-observable.md). +The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](make-observable.md). See also [modifiers](modifiers.md). ```javascript import { observable, autorun, action } from "mobx" diff --git a/website/i18n/en.json b/website/i18n/en.json index 4dabfa5fa..8daee90d6 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -149,8 +149,8 @@ "sidebar_label": "MobX-utils" }, "refguide/modifiers": { - "title": "Modifiers", - "sidebar_label": "Modifiers" + "title": "Observable modifiers", + "sidebar_label": "Observable modifiers" }, "refguide/object-api": { "title": "Object api", From a0085013108d9aec10edbf9243b155dc6a8405f4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 13:09:41 +0200 Subject: [PATCH 0417/1043] Pull out a separate page for sets. --- docs/refguide/api.md | 77 +++++--------------------------- docs/refguide/make-observable.md | 10 +++-- docs/refguide/map.md | 2 + docs/refguide/observable.md | 27 +++-------- docs/refguide/set.md | 20 +++++++++ website/i18n/en.json | 6 ++- website/sidebars.json | 1 + 7 files changed, 51 insertions(+), 92 deletions(-) create mode 100644 docs/refguide/set.md diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 507a3da99..ee23d79da 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -1,18 +1,10 @@ --- -title: MobX Api Reference +title: MobX API Reference sidebar_label: API overview hide_title: true --- -# MobX Api Reference - -
    - -**Applies to MobX 4 and higher** - -- Using Mobx 3? Use this [migration guide](https://github.com/mobxjs/mobx/wiki/Migrating-from-mobx-3-to-mobx-4) to switch gears. -- [MobX 3 documentation](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md) -- For MobX 2, the old documentation is still available on [github](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md). +# MobX API Reference # Core API @@ -23,66 +15,27 @@ _These are the most important MobX API's._ ## Creating observables -### `observable(value)` - -Usage: - -- `observable(value)` -- `@observable classProperty = value` - -Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. - -**Note:** `observable(value)` is a convenience API that will succeed only if it can be made into -an observable data structure (_Array_, _Map_, or _observable-object_). For all other values, no conversion will be performed. - -You can also directly create the desired observable type, see below. - -The following conversion rules are applied, but can be fine-tuned by using [_decorators_](#decorators). See below. +### `observable` -1. If _value_ is an instance of an [ES6 Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -1. If _value_ is an array, a new [Observable Array](array.md) will be returned. -1. If _value_ is an object _without_ prototype or its prototype is `Object.prototype`, the object will be cloned and all its current properties will be made observable. See [Observable Object](object.md) -1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, there will be no change made to the value. If you do need a [Boxed Observable](boxed.md), you can do one of the following: - - Call `observable.box(value)` explicitly - - Use `@observable` in the class definition - - Call [`decorate()`](#decorate) - - Use `extendObservable()` to introduce properties on a class definition +Mark a property as observable. -MobX will not make objects with a prototype automatically observable; as that is the responsibility of its constructor function. Use `extendObservable` in the constructor, or `@observable` in its class definition instead. +[«`details`»](make-observable.md) -These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. - -**Some notes:** - -- To use the `@observable` decorator, make sure that [decorators are enabled](observable.md) in your transpiler (babel or typescript). -- By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [_decorators_](#decorators). -- _[MobX 4 and below]_ To create dynamically keyed objects, always use maps! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. - -[«`observable`»](observable.md) — [«`@observable`»](observable.md) - -### `@observable property = value` +### `observable(value)` -`observable` can also be used as property decorator. It requires [decorators to be enabled](../best/decorators.md) and is syntactic -sugar for `extendObservable(this, { property: value })`. +Make a value observable. [«`details`»](observable.md) ### `observable.box(value, options?)` -Creates an observable _box_ that stores an observable reference to a value. Use `get()` to get the current value of the box, and `set()` to update it. -This is the foundation on which all other observables are built, but in practice you will use it rarely. - -Normal boxes will automatically try to turn any new value into an observable if it isn't already. Use the `{deep: false}` option to disable this behavior. +Creates an observable _box_ that stores an observable reference to a value. [«`details`»](boxed.md) ### `observable.object(value, decorators?, options?)` Creates a clone of the provided object and makes all its properties observable. -By default any values in those properties will be made observable as well, but when using the `{deep: false}` options, only the properties will be made into observable -references, leaving the values untouched. (This holds also for any values assigned in the future). - -The second argument in `observable.object()` can be used to fine tune the observability with [`decorators`](#decorators). [«`details`»](object.md) @@ -90,27 +43,19 @@ The second argument in `observable.object()` can be used to fine tune the observ Creates a new observable array based on the provided value. -Use the `{deep: false}` option if the values in the array should not be turned into observables. - [«`details`»](array.md) ### `observable.map(value, options?)` -Creates a new observable map based on the provided value. Use the `{deep: false}` option if the values in the map should not be turned into observables. - -Use `map` whenever you want to create a dynamically keyed collections and the addition / removal of keys needs to be observed. -Since this uses the full-blown _ES6 Map_ internally, you are free to use any type for the key and _not limited_ to string keys. +Creates a new observable Map based on the provided value. [«`details`»](map.md) ### `observable.set(value, options?)` -Creates a new observable map based on the provided value. Use the `{deep: false}` option if the values in the map should not be turned into observables. - -Use `set` whenever you want to create a dynamic set where the addition / removal of values needs to be observed, and where values can appear only once in the collection. -Note that your browser needs to support ES6 sets, or polyfill them, to make sets work. +Create a new observable Set based on the provided value. -The api is further the same as the [ES6 set api](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) +[«`details`»](set.md) ### `extendObservable` diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 17b01f14f..0c84d4c67 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -13,9 +13,7 @@ Usage: In `makeObservable`, a JavaScript object (including class instance) is passed into `target`. In `annotations` you can declare properties observable, getters as computed and methods as actions. -Typically `makeObservable` is used in the constructor of a class, and -its first argument is `this`. The `annotations` argument is a mapping with -declarations about properties and methods: +Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. The `annotations` argument is a mapping with declarations about properties and methods: ```javascript import { makeObservable, observable, computed, action } from "mobx" @@ -58,6 +56,10 @@ Possible annotation values are: - `false`: Explicitly do not annotate this property. Normally only useful with `makeAutoObservable`. +## `makeObservable` and decorators + +You can also use `makeObservable` with [decorators](../best/decorators.md). In this case you can leave out the annotations argument and instead declare observables, computed and actions using decorator syntax. Using decorators requires special compiler support. + ## `makeAutoObservable` `makeAutoObservable` behaves much like `makeObservable`, but infers all properties by default. You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. @@ -85,7 +87,7 @@ class Doubler { } ``` -As you can see this is more compact. +This can be more compact and easy to maintain than using `makeObservable`. ### When you call makeAutoObservable diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 1c7a78db6..d2de9f79a 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -17,6 +17,8 @@ Optionally takes an object, entries array or string keyed [ES6 map](https://deve Using ES6 Map constructor you can initialize observable map using `observable(new Map())` or for class properties with `makeObservable` using `map = new Map()`. +Since this uses the full-blown _ES6 Map_ internally, you are free to use any type for the key and _not limited_ to string keys. + The following methods are exposed according to the [ES6 Map spec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): - `has(key)` Returns whether this map has an entry with the provided key. Note that the presence of a key is an observable fact in itself. diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index f4abfc31f..ccfd59f4b 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -21,34 +21,19 @@ Observable values can be JS primitives, references, plain objects, class instanc The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. 1. If _value_ is an ES6 `Map`: a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -1. If _value_ is an ES6 `Set`: a new Observable Set will be returned. +1. If _value_ is an ES6 `Set`: a new [Observable Set](set.md) will be returned. 1. If _value_ is an array, a new [Observable Array](array.md) will be returned. 1. If _value_ is an object _without_ prototype, all its current properties will be made observable. See [Observable Object](object.md) 1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `makeObservable` in the constructor instead. These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. -Some notes: -- By default, making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using _modifiers_. -- _[Environments without Proxy support]_ To create **dynamically keyed objects** use an [Observable Map](map.md)! Only initially existing properties on an object will be made observable, although new ones can be added using `extendObservable`. See also [limitations without proxies](../best/limitations-without-proxies.md). +By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [modifiers](#modifiers.md). -Some examples of the programmatic API: - -```javascript -const map = observable.map({ key: "value" }) -map.set("key", "new value") - -const list = observable([1, 2, 4]) -list[2] = 3 +For examples of the declarative use of `observable` with `makeObservable`, see [Concepts & Principles](../intro/concepts.md) and [`makeObservable` / `makeAutoObservable`](make-observable.md). -const person = observable({ - firstName: "Clive Staples", - lastName: "Lewis" -}) -person.firstName = "C.S." +## Using `observable` programmatically -const temperature = observable.box(20) -temperature.set(25) -``` +You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. -For examples of the declarative use of `observable` with `makeObservable`, see [Concepts & Principles](../intro/concepts.md) and [`makeObservable` / `makeAutoObservable`](make-observable.md). +You can't use `observable` to make objects with a prototype observable; as that is the responsibility of its constructor function. Use `makeObservable` or `makeAutoObservable` in its constructor. diff --git a/docs/refguide/set.md b/docs/refguide/set.md new file mode 100644 index 000000000..7828f2f7e --- /dev/null +++ b/docs/refguide/set.md @@ -0,0 +1,20 @@ +--- +title: Observable Sets +sidebar_label: sets +hide_title: true +--- + +# Observable Sets + +Usage: + +- `observable.set(initialSet?, options?)` +- `observable(set)` + +Creates a new observable ES6 Set based on the provided value. Use the `{deep: false}` option if the values in the set should not be turned into observables. + +Use `set` whenever you want to create a dynamic set where the addition / removal of values needs to be observed, and where values can appear only once in the collection. + +Note that your browser needs to support ES6 sets, or polyfill them, to make sets work. + +Sets use the [ES6 Set API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) diff --git a/website/i18n/en.json b/website/i18n/en.json index 8daee90d6..72c5f1991 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -89,7 +89,7 @@ "sidebar_label": "action" }, "refguide/api": { - "title": "MobX Api Reference", + "title": "MobX API Reference", "sidebar_label": "API overview" }, "refguide/array": { @@ -172,6 +172,10 @@ "title": "reaction", "sidebar_label": "reaction" }, + "refguide/set": { + "title": "Observable Sets", + "sidebar_label": "sets" + }, "refguide/spy": { "title": "Spy", "sidebar_label": "spy" diff --git a/website/sidebars.json b/website/sidebars.json index 1bac6458b..1d6243d7a 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -18,6 +18,7 @@ "refguide/object", "refguide/array", "refguide/map", + "refguide/set", "refguide/modifiers", "refguide/extend-observable", "refguide/boxed" From 7d016963e8344663683aa0aa6feceff45dff3f28 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 13:49:21 +0200 Subject: [PATCH 0418/1043] Further update of api. Separate out flow into its own page. --- docs/best/actions.md | 20 +- docs/refguide/action.md | 19 ++ docs/refguide/api.md | 303 ++++-------------------------- docs/refguide/autorun.md | 2 + docs/refguide/computed-options.md | 1 + docs/refguide/flow.md | 78 ++++++++ docs/refguide/observable.md | 4 +- notes-docs.md | 1 + website/i18n/en.json | 6 +- website/sidebars.json | 7 +- 10 files changed, 159 insertions(+), 282 deletions(-) create mode 100644 docs/refguide/flow.md diff --git a/docs/best/actions.md b/docs/best/actions.md index 21673922c..8f2a625f9 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -126,9 +126,7 @@ class Store { ### The `runInAction` utility -A downside of inline actions in combination with TypeScript is that TypeScript does -not apply type inference on them, so you would have type all your callbacks. -Instead of creating an action for the entire callback, you can also run only the state modifying part of the callback in an action. +Instead of creating an action for the entire callback, you can also run only the state modifying part of the callback in an action with `runInAction`. This is especially useful with TypeScript, as you can avoid having to manually type your callbacks. `runInAction` requires you to structure your code so that state modifications happen at the end of the process as much as possible: @@ -166,7 +164,7 @@ class Store { } ``` -Note that `runInAction` can also be given a name as first argument. `runInAction(f)` is in fact just sugar for `action(f)()` +See also [`runInAction`](../refguide/action.md#runinaction). ## async / await @@ -282,9 +280,7 @@ class Store { ## flow instead of async/await -An alternative approach is to use the built-in concept of `flow`. `flow` -works in the same way as `async` / `await` but is based around generators -instead. The rules are: +An alternative approach is to use the built-in concept of [`flow`](../refguide/flow.md). `flow` works in the same way as `async` / `await` but is based around generators instead. The rules are: - Wrap `flow` around your asynchronous function. @@ -296,6 +292,8 @@ The advantage of `flow` is that it is syntactically very close to `async` / `awa `flow` also integrates neatly with MobX development tools, so that it is easy to trace the process of the async function. +Here is our example rewritten to use `flow`: + ```javascript import { flow } from "mobx" @@ -308,7 +306,7 @@ class Store { } // note the star, this a generator function! - fetchProjects = flow(function* () { + fetchProjects = flow(function* fetchProjects() { this.githubProjects = [] this.state = "pending" try { @@ -323,9 +321,3 @@ class Store { }) } ``` - -### Flows can be cancelled - -Flows are cancellable which means you can call `cancel()` on the returned promise. This stops the generator immediately, but any `finally` clause is still processed. The returned promise itself rejects with an instance of `FlowCancellationError` whose message is `FLOW_CANCELLED`. - -If you want to write code that catches `FlowCancellationError` you can import it from the `mobx` package. Also exported is a `isFlowCancellationError(error)` helper that returns `true` if and only if the provided argument is a `FlowCancellationError`. diff --git a/docs/refguide/action.md b/docs/refguide/action.md index ee590ef0d..178a45aaa 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -38,6 +38,25 @@ Functions that just perform look-ups, filters etc should _not_ be marked as acti If you use `makeAutoObservable` you have to [exclude these methods explicitly from being marked as actions](make-observable.md#excluding-methods-that-are-not-actions). +## `runInAction` + +Usage: + +- `runInAction(name? fn)` + +It can be useful to have just a small snippet of code run as an action, +without having to declare a method. This can be especially useful in [async code](../best/actions.md). + +`runInAction(name?, fn)` is a convenience to write `action(name, fn)()`. + +For example, to change the observable property `message.name` outside of an explicit action, write: + +```javascript +runInAction(() => { + message.name = "Sara" +}) +``` + ## Actions and async code There are some special rules you have to take into account when you have actions that diff --git a/docs/refguide/api.md b/docs/refguide/api.md index ee23d79da..57a7da79d 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -15,6 +15,19 @@ _These are the most important MobX API's._ ## Creating observables +### `makeObservable` + +Declare observables, computeds and actions in the class +constructor. + +[«`details`»](make-observable.md) + +### `makeAutoObservable` + +Automatically derive observables, computeds and actions in the class constructor. + +[«`details`»](make-observable.md) + ### `observable` Mark a property as observable. @@ -27,12 +40,6 @@ Make a value observable. [«`details`»](observable.md) -### `observable.box(value, options?)` - -Creates an observable _box_ that stores an observable reference to a value. - -[«`details`»](boxed.md) - ### `observable.object(value, decorators?, options?)` Creates a clone of the provided object and makes all its properties observable. @@ -57,311 +64,83 @@ Create a new observable Set based on the provided value. [«`details`»](set.md) -### `extendObservable` - -Usage: `extendObservable(target, properties, decorators?, options?)`. - -For each key/value pair in each `properties` a (new) observable property will be introduced on the target object if the property does not already exist on the target object. If the property does exist, it will be made observable. -This can be used in constructor functions to introduce observable properties without using decorators. -If a value of the `properties` is a getter function, a _computed_ property will be introduced. - -Use `extendObservable(target, properties, decorators?, {deep: false})` if the new properties should not be infective (that is; newly assigned values should not be turned into observables automatically). -Note that `extendObservable` enhances existing objects, unlike `observable.object` which creates a new object. - -[«details»](extend-observable.md) +### `observable` modifiers -### Decorators - -Use decorators to fine tune the observability of properties defined via `observable`, `extendObservable` and `observable.object`. They can also control the auto-conversion rules for specific properties. - -The following decorators are available: - -- **`observable.deep`**: This is the default decorator, used by any observable. It converts any assigned, non-primitive value into an observable if it isn't one yet. -- **`observable.ref`**: Disables automatic observable conversion, just creates an observable reference instead. -- **`observable.shallow`**: Can only be used in combination with collections. Turns any assigned collection into a collection, which is shallowly observable (instead of deep). In other words; the values inside the collection won't become observables automatically. -- **`computed`**: Creates a derived property, see [`computed`](computed.md) -- **`action`**: Creates an action, see [`action`](action.md) -- **`action.bound`**: Creates a bound action, see [`action`](action.md) - -You can apply these decorators using the _@decorator_ syntax: - -```javascript -import { observable, action } from "mobx" - -class TaskStore { - @observable.shallow tasks = [] - @action addTask(task) { - /* ... */ - } -} -``` - -Or by passing in property decorators via `observable.object` / `observable.extendObservable` or [`decorate()`](#decorate). -Note that decorators always 'stick' to the property. So they will remain in effect even if a new value is assigned. - -```javascript -import { observable, action } from "mobx" - -const taskStore = observable( - { - tasks: [], - addTask(task) { - /* ... */ - } - }, - { - tasks: observable.shallow, - addTask: action - } -) -``` +Modify observable behavior. [«details»](modifiers.md) -### `decorate` - -Usage: `decorate(object, decorators)` -This is a convenience method to apply observability [decorators](#decorators) to the properties of a plain object or class instance. The second argument is an object with properties set to certain decorators. - -Use this if you cannot use the _@decorator_ syntax or need more control over setting observability. - -```js -class TodoList { - todos = {} - get unfinishedTodoCount() { - return values(this.todos).filter(todo => !todo.finished).length - } - addTodo() { - const t = new Todo() - t.title = "Test_" + Math.random() - set(this.todos, t.id, t) - } -} - -decorate(TodoList, { - todos: observable, - unfinishedTodoCount: computed, - addTodo: action.bound -}) -``` - -For applying multiple decorators on a single property, you can pass an array of decorators. The decorators application order is from right to left. - -```javascript -import { decorate, observable } from "mobx" -import { serializable, primitive } from "serializr" -import persist from "mobx-persist" - -class Todo { - id = Math.random() - title = "" - finished = false -} - -decorate(Todo, { - title: [serializable(primitive), persist("object"), observable], - finished: [serializable(primitive), observable] -}) -``` +### `extendObservable` -Note: Not all decorators can be composed together, and this functionality is just best-effort. Some decorators affect the instance directly and can 'hide' the effect of other decorators that only change the prototype. +Make an existing object observable. -## Computed values +[«details»](extend-observable.md) -Usage: +### `observable.box(value, options?)` -- `computed(() => expression)` -- `computed(() => expression, (newValue) => void)` -- `computed(() => expression, options)` -- `@computed get classProperty() { return expression; }` -- `@computed({equals: compareFn}) get classProperty() { return expression; }` -- `@computed.struct get classProperty() { return expression; }` +Creates an observable _box_ that stores an observable reference to a value. -Creates a computed property. The `expression` should not have side effects but return a value. -The expression will automatically be re-evaluated if any observables it uses changes, but only if it is in use by some _reaction_. +[«`details`»](boxed.md) -There are various `options` that can be used to control the behavior of `computed`. These include: +## `computed` -- **`equals: (value, value) => boolean`** Comparison method can be used to override the default detection on when something is changed. Built-in comparers are: `comparer.identity`, `comparer.default`, `comparer.structural`, `comparer.shallow`. -- **`name: string`** Provide a debug name to this computed property -- **`requiresReaction: boolean`** Wait for a change in value of the tracked observables, before recomputing the derived property -- **`get: () => value)`** Override the getter for the computed property. -- **`set: (value) => void`** Override the setter for the computed property -- **`keepAlive: boolean`** Set to true to automatically keep computed values alive, rather then suspending then when there are no observers. +Computed values derived from observables and other computeds. [«details»](computed.md) ## Actions -Any application has actions. Actions are anything that modify the state. +Actions are anything that modify the state. -With MobX you can make it explicit in your code where your actions live by marking them. -Actions helps you to structure your code better. -It is advised to use them on any function that modifies observables or has side effects. -`action` also provides useful debugging information in combination with the devtools. -Note: using `action` is mandatory when _strict mode_ is enabled, see `enforceActions`. [«details»](action.md) -Usage: +### `runInAction` -- `action(fn)` -- `action(name, fn)` -- `@action classMethod` -- `@action(name) classMethod` -- `@action boundClassMethod = (args) => { body }` -- `@action.bound boundClassMethod(args) { body }` +One-time actions. -For one-time-actions `runInAction(name?, fn)` can be used, which is sugar for `action(name, fn)()`. +[«details»](action.md#runinaction) ### Flow -Usage: `flow(function* (args) { })` - -`flow()` takes a generator function as its only input - -When dealing with _async actions_, the code that executes in the callback is not wrapped by `action`. This means the observable state that you are mutating, will fail the [`enforceActions`](#configure) check. An easy way to retain the action semantics is by wrapping the async function with flow. This will ensure to wrap all your callbacks in `action()`. - -Note that the async function must be a _generator_ and you must only _yield_ to promises inside. `flow` gives you back a promise that you can `cancel()` if you want. - -```js -import { configure } from "mobx" - -// don't allow state modifications outside actions -configure({ enforceActions: "always" }) - -class Store { - @observable githubProjects = [] - @observable state = "pending" // "pending" / "done" / "error" - - fetchProjects = flow(function* fetchProjects() { - // <- note the star, this a generator function! - this.githubProjects = [] - this.state = "pending" - try { - const projects = yield fetchGithubProjectsSomehow() // yield instead of await - const filteredProjects = somePreprocessing(projects) - - // the asynchronous blocks will automatically be wrapped actions - this.state = "done" - this.githubProjects = filteredProjects - } catch (error) { - this.state = "error" - } - }) -} -``` - -_Tip: it is recommended to give the generator function a name, this is the name that will show up in dev tools and such_ - -**Flows can be cancelled** +MobX friendly replacement for `async` / `await`. -Flows are canceallable, that means that you can call `cancel()` on the returned promise. This will stop the generator immediately, but any `finally` clause will still be processed. -The returned promise itself will reject with `FLOW_CANCELLED` +[«details»](flow.md) -**Flows support async iterators** - -Flows support async iterators, that means you can use async generators: - -```javascript -async function* someNumbers() { - yield Promise.resolve(1) - yield Promise.resolve(2) - yield Promise.resolve(3) -} - -const count = mobx.flow(async function* () { - // use for await to loop async iterators - for await (const number of someNumbers()) { - total += number - } - return total -}) - -const res = await count() // 6 -``` - -## Reactions & Derivations - -_Computed values_ are **values** that react automatically to state changes. -_Reactions_ are **side effects** that react automatically to state changes. -Reactions _can_ be used to ensure that a certain side effect (mainly I/O) is automatically executed when relevant state changes, like logging, network requests etc. -The most commonly used reaction is the `observer` decorator for React components (see below). +## React integration ### `observer` -Can be used as higher order component around a React component. -The component will then automatically re-render if any of the observables used in the `render` function of the component has changed. -Note that `observer` is provided by the `"mobx-react"` package and not by `"mobx"` itself. +A higher order component you can use to make a React component re-render when observables change. -[«details»](../react/react-integration.md) +Is part of the `mobx-react` package. -Usage: +[«details»](../react/react-integration.md) -- `observer(React.createClass({ ... }))` -- `observer((props, context) => ReactElement)` -- `observer(class MyComponent extends React.Component { ... })` -- `@observer class MyComponent extends React.Component { ... }` +## Reactions & Derivations ### `autorun` -Usage: `autorun(() => { sideEffect }, options)`. Autorun runs the provided `sideEffect` and tracks which observable state is accessed while running the side effect. -Whenever one of the used observables is changed in the future, the same sideEffect will be run again. -Returns a disposer function to cancel the side effect. +Rerun a function each time anything it observes changes. [«details»](autorun.md) -**options** - -- **`name?: string`**: A name for easier identification and debugging -- **`delay?: number`**: the sideEffect will be delayed and throttled with the given `delay`. Defaults to `0`. -- **`onError?: (error) => void`**: error handler that will be triggered if the autorun function throws an exception -- **`scheduler?: (callback) => void`**: Set a custom scheduler to determine how re-running the autorun function should be scheduled -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the autorun - -### `when` - -Usage: `when(() => condition, () => { sideEffect }, options)`. -The condition expression will react automatically to any observables it uses. -As soon as the expression returns true the sideEffect function will be invoked, but only once. - -**Note:** the _effect-function_ (second argument) is actually optional. If no effect-function is provided, it will return a cancelable promise (i.e. having a `cancel()` method on the promise) - -`when` returns a disposer to prematurely cancel the whole thing. - -If no effect function is passed to `when`, it will return a promise that can be awaited until the condition settles. - -[«details»](when.md). - -**options** - -- **`name?: string`**: A name for easier identification and debugging -- **`onError?: (error) => void`**: error handler that will be triggered if the _predicate-function_ or the _effect-function_ throws an exception -- **`timeout: number`** a timeout in milliseconds, after which the `onError` handler will be triggered to signal the condition not being met within a certain time -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the when - ### `reaction` -Usage: `reaction(() => data, data => { sideEffect }, options)`. -A variation on `autorun` that gives more fine-grained control on which observables that will be tracked. -It takes two function, the first one is tracked and returns data that is used as input for the second one, the side effect. -Unlike `autorun` the side effect won't be run initially, and any observables that are accessed while executing the side effect will not be tracked. -The side effect can be throttled, just like `autorunAsync`. +Rerun a side-effect when data it observes changes. [«details»](reaction.md) -**options** +### `when` + +Execute a side-effect once when a observable condition becomes true. -- **`fireImmediately?: boolean`**: Wait for a change before firing the _effect function_. Defaults to `false`. -- **`delay?: number`**: the sideEffect will be delayed and throttled with the given `delay`. Defaults to `0`. -- **`equals`**: Custom equality function to determine whether the expr function differed from it's previous result, and hence should fire effect. Accepts the same options as the equals option of `computed`. -- Also accepts all of the options from [`autorun`](#autorun) -- **`requiresObservable?: boolean`** Enables [`reactionRequiresObservable`](#reactionrequiresobservable-boolean) locally for the reaction +[«details»](when.md). ### `onReactionError` Usage: `onReactionError(handler: (error: any, derivation) => void)` -This method attaches a global error listener, which is invoked for every error that is thrown from a _reaction_. +This function attaches a global error listener, which is invoked for every error that is thrown from a _reaction_. This can be used for monitoring or test purposes. --- diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 8060a0392..2f12d3d0d 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -10,6 +10,8 @@ Usage: - `autorun(effect: (reaction) => void)` +Autorun is a type of _reaction_. Reactions are **side effects** that react automatically to state changes. Reactions _can_ be used to ensure that a certain side effect (mainly I/O) is automatically executed when relevant state changes, like logging, network requests etc. + You pass a function into `autorun` that should run each time anything it observes changes. It also runs once when you create the `autorun`. It only responds to changes in observable state -- so things you marked `observable` or `computed`. It won't respond if other observable state changes that it does not in any refer refer to in the function. diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index 4e742b2bb..2984e34de 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -11,6 +11,7 @@ it's possible to customize its behavior by passing in an `options` argument: - `name`: String, the debug name used in spy and the MobX devtools - `context`: The `this` that should be used in the provided expression +- `get`: override the getter for the computed property. - `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the options argument passed to `computed` is a function, this is assumed to be a setter. - `equals`: By default `comparer.default`. This acts as a comparison function for comparing the previous value with the next value. If this function considers the previous and next values to be equal, then observers will not be re-evaluated. This is useful when working with structural data, and types from other libraries. For example, a computed [moment](https://momentjs.com/) instance could use `(a, b) => a.isSame(b)`. `comparer.structural` and `comparer.shallow` come in handy if you want to use structural/shallow comparison to determine whether the new value is different from the previous value (and as a result notify observers). - `requiresReaction`: It is recommended to set this one to `true` on very expensive computed values. If you try to read its value, but the value is not being tracked by some observer (in which case MobX won't cache the value), it causes the computed to throw, instead of doing an expensive re-evalution. diff --git a/docs/refguide/flow.md b/docs/refguide/flow.md new file mode 100644 index 000000000..e03fc9cb1 --- /dev/null +++ b/docs/refguide/flow.md @@ -0,0 +1,78 @@ +--- +title: flow +sidebar_label: flow +hide_title: true +--- + +# flow + +Usage: + +- `flow(function* (args) { })` + +`flow` is an alternative to `async` / `await` that makes it more easy to +work with MobX actions. + +`flow()` takes a [generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) as its only input. You must only _yield_ to promises inside. `flow` gives you back a promise that you can `cancel()` if you want. + +When dealing with _async actions_, the code that executes in the callback is not wrapped by `action`. An easy way to retain the action semantics is by wrapping the async function with flow. This will ensure to wrap all your callbacks in `action()`. See also [asynchronous actions](../best/actions#flow). + +Example: + +```js +import { flow, makeAutoObservable } from "mobx" + +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + constructor() { + makeAutoObservable(this) + } + + fetchProjects = flow(function* fetchProjects() { + // <- note the star, this a generator function! + this.githubProjects = [] + this.state = "pending" + try { + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) + + // the asynchronous blocks will automatically be wrapped actions + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + }) +} +``` + +_Tip: it is recommended to give the generator function a name, this is the name that will show up in dev tools and such_ + +**Flows can be cancelled** + +Flows are canceallable, that means that you can call `cancel()` on the returned promise. This will stop the generator immediately, but any `finally` clause will still be processed. The returned promise itself will reject with `FLOW_CANCELLED` + +If you want to write code that catches `FlowCancellationError` you can import it from the `mobx` package. Also exported is a `isFlowCancellationError(error)` helper that returns `true` if and only if the provided argument is a `FlowCancellationError`. + +**Flows support async iterators** + +Flows support async iterators, that means you can use async generators: + +```javascript +async function* someNumbers() { + yield Promise.resolve(1) + yield Promise.resolve(2) + yield Promise.resolve(3) +} + +const count = mobx.flow(async function* () { + // use for await to loop async iterators + for await (const number of someNumbers()) { + total += number + } + return total +}) + +const res = await count() // 6 +``` diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index ccfd59f4b..0b5d1b9a9 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -20,15 +20,15 @@ observable using [`makeObservable` / `makeAutoObservable`](make-observable.md). Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. +1. If _value_ is an array, a new [Observable Array](array.md) will be returned. 1. If _value_ is an ES6 `Map`: a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. 1. If _value_ is an ES6 `Set`: a new [Observable Set](set.md) will be returned. -1. If _value_ is an array, a new [Observable Array](array.md) will be returned. 1. If _value_ is an object _without_ prototype, all its current properties will be made observable. See [Observable Object](object.md) 1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `makeObservable` in the constructor instead. These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. -By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [modifiers](#modifiers.md). +By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [modifiers](modifiers.md). For examples of the declarative use of `observable` with `makeObservable`, see [Concepts & Principles](../intro/concepts.md) and [`makeObservable` / `makeAutoObservable`](make-observable.md). diff --git a/notes-docs.md b/notes-docs.md index 4d0b48a16..5ffda1abd 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -64,6 +64,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? - [ ] The broken displayName issue with React.memo and thus with observer. Now marked as broken in the docs, but should be updated once fixed. - [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. It does seem to work as intended according to the issue though. +- [ ] Find a good place for `onReactionError`. ## Structure thoughts diff --git a/website/i18n/en.json b/website/i18n/en.json index 72c5f1991..6fa785fb5 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -132,6 +132,10 @@ "title": "refguide/extending", "sidebar_label": "createAtom" }, + "refguide/flow": { + "title": "flow", + "sidebar_label": "flow" + }, "refguide/inject": { "title": "provider_inject", "sidebar_label": "Provider / inject" @@ -197,7 +201,7 @@ "Basics": "Basics", "MobX and React": "MobX and React", "Making things observable": "Making things observable", - "Updating observables": "Updating observables", + "Updating observables with actions": "Updating observables with actions", "Computed values": "Computed values", "Effects for observables": "Effects for observables", "Debugging MobX": "Debugging MobX", diff --git a/website/sidebars.json b/website/sidebars.json index 1d6243d7a..16b28d622 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -15,17 +15,18 @@ "Making things observable": [ "refguide/make-observable", "refguide/observable", - "refguide/object", "refguide/array", "refguide/map", "refguide/set", + "refguide/object", "refguide/modifiers", "refguide/extend-observable", "refguide/boxed" ], - "Updating observables": [ + "Updating observables with actions": [ "refguide/action", - "best/actions" + "best/actions", + "refguide/flow" ], "Computed values": [ "refguide/computed", From fd5ddfee42d6d55474bea6f7fd2b9463765bb8c2 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Tue, 7 Jul 2020 17:16:23 +0200 Subject: [PATCH 0419/1043] Another note --- notes-docs.md | 1 + 1 file changed, 1 insertion(+) diff --git a/notes-docs.md b/notes-docs.md index 5ffda1abd..8b1cef7b5 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -65,6 +65,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] The broken displayName issue with React.memo and thus with observer. Now marked as broken in the docs, but should be updated once fixed. - [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. It does seem to work as intended according to the issue though. - [ ] Find a good place for `onReactionError`. +- [ ] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. ## Structure thoughts From ad2eec7cbd66b6b8152430a137bef63fcce54584 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 13:11:23 +0200 Subject: [PATCH 0420/1043] More work cleaning up API doc. Move various checking functions into the various docs for observables. Split out a on-become-observed API doc. --- docs/refguide/action.md | 8 ++ docs/refguide/api.md | 136 +++++++++++++++------------- docs/refguide/array.md | 21 ++++- docs/refguide/boxed.md | 16 +++- docs/refguide/computed.md | 16 ++++ docs/refguide/map.md | 8 ++ docs/refguide/object.md | 10 +- docs/refguide/observable.md | 27 ++++++ docs/refguide/observe.md | 4 +- docs/refguide/on-become-observed.md | 50 ++++++++++ docs/refguide/set.md | 8 ++ docs/refguide/tojson.md | 6 +- website/i18n/en.json | 8 +- website/sidebars.json | 6 +- 14 files changed, 243 insertions(+), 81 deletions(-) create mode 100644 docs/refguide/on-become-observed.md diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 178a45aaa..fd40147d4 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -111,6 +111,14 @@ const ticker = new Ticker() setInterval(ticker.increment, 1000) ``` +## `isAction` + +Usage: + +- `isAction(func)` + +Returns `true` if the given function is marked as an `action`. + ## Disabling mandatory actions By default, MobX 6 and later require that you use actions to make state changes. diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 57a7da79d..ec88c3dde 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -100,7 +100,7 @@ One-time actions. [«details»](action.md#runinaction) -### Flow +### `flow` MobX friendly replacement for `async` / `await`. @@ -116,6 +116,16 @@ Is part of the `mobx-react` package. [«details»](../react/react-integration.md) +### `Provider` (`mobx-react` package) + +[*Deprecated*] Can be used to pass stores to child components using React's context mechanism. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. + +See the [`mobx-react` docs](https://github.com/mobxjs/mobx-react#provider-experimental). + +### `inject` (`mobx-react` package) + +[*Deprecated*] Higher order component and counterpart of `Provider`. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. + ## Reactions & Derivations ### `autorun` @@ -134,7 +144,7 @@ Rerun a side-effect when data it observes changes. Execute a side-effect once when a observable condition becomes true. -[«details»](when.md). +[«details»](when.md) ### `onReactionError` @@ -150,107 +160,103 @@ This can be used for monitoring or test purposes. _Here are some utilities that might make working with observable objects or computed values more convenient. More, less trivial utilities can be found in the \* [mobx-utils](https://github.com/mobxjs/mobx-utils) package._ -### `Provider` (`mobx-react` package) +### `toJS` -Can be used to pass stores to child components using React's context mechanism. See the [`mobx-react` docs](https://github.com/mobxjs/mobx-react#provider-experimental). +Converts observable data structures back to plain javascript objects, ignoring computed values. -### `inject` (`mobx-react` package) +[«details»](tojson.md) -Higher order component and counterpart of `Provider`. Can be used to pick stores from React's context and pass it as props to the target component. Usage: +## `isObservable` -- `inject("store1", "store2")(observer(MyComponent))` -- `@inject("store1", "store2") @observer MyComponent` -- `@inject((stores, props, context) => props) @observer MyComponent` -- `@observer(["store1", "store2"]) MyComponent` is a shorthand for the the `@inject() @observer` combo. +Is a value observable? -### `toJS` +[«details»](observable.md#isobservable) + +## `isObservableProp` + +Is a property observable? + +[«details»](observable.md#isobservableprop) + +## `isObservableArray` + +Is value an observable array? + +[«details»](array.md#isobservablearray) + +## `isObservableMap` -Usage: `toJS(observableDataStructure, options?)`. Converts observable data structures back to plain javascript objects, ignoring computed values. +Is value an observable map? -The `options` include: +[«details»](map.md#isobservablemap) -- **`detectCycles: boolean`**: Checks for cyclical references in the observable data-structure. Defaults to `true`. -- **`exportMapsAsObjects: boolean`**: Treats ES6 Maps as regular objects for export. Defaults to `true` +## `isObservableSet` -[«details»](tojson.md). +Is value an observable set? -### `isObservable` and `isObservableProp` +[«details»](set.md#isobservableset) -Usage: `isObservable(thing)` or `isObservableProp(thing, property?)`. Returns true if the given thing, or the `property` of the given thing is observable. -Works for all observables, computed values and disposer functions of reactions. +## `isObservableObject` -[«details»](is-observable) +Is value an observable object? -### `isObservableObject|Array|Map` and `isBoxedObservable` +[«details»](object.md#isobservableobject) -Usage: `isObservableObject(thing)`, `isObservableArray(thing)`, `isObservableMap(thing)`, `isBoxedObservable(thing)`. Returns `true` if.., well, do the math. +## `isBoxedObservable` -### `isArrayLike` +Is value an observable box? -Usage: `isArrayLike(thing)`. Returns `true` if the given thing is either a true JS-array or an observable (MobX-)array. -This is intended as convenience/shorthand. -Note that observable arrays can be `.slice()`d to turn them into true JS-arrays. +[«details»](boxed.md#isboxedobservable) + +## `isArrayLike` + +[Without Proxy support] + +Is this an array of some type, observable or not? + +[«details»](array.md#isarraylike) ### `isAction` -Usage: `isAction(func)`. Returns true if the given function is wrapped / decorated with `action`. +Is this an action? + +[«details»](action.md#isaction) + +### `isComputed` + +Is this a boxed computed value? + +[«details»](computed.md#iscomputed) + +### `isComputedProp` -### `isComputed` and `isComputedProp` +Is this a computed property? -Usage: `isComputed(thing)` or `isComputedProp(thing, property?)`. Returns true if the given thing is a boxed computed value, or if the designated property is a computed value. +[«details»](computed.md#iscomputedprop) ### `intercept` -Usage: `intercept(object, property?, interceptor)`. -Api that can be used to intercept changes before they are applied to an observable api. Useful for validation, normalization or cancellation. +Intercept changes before they are applied to an observable api. [«details»](observe.md) ### `observe` -Usage: `observe(object, property?, listener, fireImmediately = false)` Low-level api that can be used to observe a single observable value. [«details»](observe.md) -### `onBecomeObserved` and `onBecomeUnobserved` +### `onBecomeObserved` -Usage: `onBecomeObserved(observable, property?, listener: () => void): (() => void)` and -`onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` +Hook for when something becomes observed. -These functions are hooks into the observability system of MobX and get notified when observables _start_ / _stop_ becoming observed. It can be used to execute some lazy operations or perform network fetches. +[«details»](on-become-observed.md) -The return value is a _diposer-function_ that will detach the _listener_. +### `onBecomeUnobserved` -```javascript -export class City { - @observable location - @observable temperature - interval - - constructor(location) { - this.location = location - // only start data fetching if temperature is actually used! - onBecomeObserved(this, "temperature", this.resume) - onBecomeUnobserved(this, "temperature", this.suspend) - } - - resume = () => { - log(`Resuming ${this.location}`) - this.interval = setInterval(() => this.fetchTemperature(), 5000) - } +Hook for when something stops being observed. - suspend = () => { - log(`Suspending ${this.location}`) - this.temperature = undefined - clearInterval(this.interval) - } - - fetchTemperature = flow(function* () { - // data fetching logic - }) -} -``` +[«details»](on-become-observed.md) ### `configure` diff --git a/docs/refguide/array.md b/docs/refguide/array.md index e2a085f8a..445b8b440 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -66,9 +66,26 @@ can also use `observable.shallow` for this; see also [modifiers](modifiers.md). The `name` option can be used to give the array a friendly debug name, to be used in for example `spy` or the MobX dev tools. +## `isObservableArray` + +Usage: + +- `isObservableArray(value)` + +Returns `true` if `value` is an observable array. + +## `isArrayLike` + +[Without Proxy support] + +Usage: + +- `isArrayLike(thing)` + +Returns `true` if the given thing is either a true JS-array or an observable (MobX-)array. This is intended as convenience/shorthand. Note that observable arrays can be `.slice()`d to turn them into true JS-arrays. + ## Array limitations in environments without Proxy support -If your environment does not support Proxies, then MobX cannot make its observable -array be a real JS Array. +If your environment does not support Proxies, then MobX cannot make its observable array be a real JS Array. [More information](../best/limitations-without-proxies.md). diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index bace1a0c5..36c497449 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -1,14 +1,14 @@ --- -title: Boxed Values -sidebar_label: boxed values +title: Observable Boxes +sidebar_label: boxes hide_title: true --- -# Boxed values +# Observable Boxes Usage: -- `observable.boxed(value, options?)` +- `observable.box(value, options?)` All primitive values in JavaScript are immutable and hence per definition not observable. Usually that is fine, as MobX usually can just make the _property_ that contains the value observable. @@ -56,3 +56,11 @@ cityName.set("Amsterdam") ## `observable.box(value, { name: "my array" })` The `name` option can be used to give the box a friendly debug name, to be used in for example `spy` or the MobX dev tools. + +## `isBoxedObservable` + +Usage: + +- `isBoxedObservable(value)` + +Returns `true` if `value` is an observable box. diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 291b8450f..8803fa37f 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -136,6 +136,22 @@ Note: don't use arrow functions as the `this` would be incorrect. For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) +## `isComputed` + +Usage: + +- `isComputed(value)` + +Returns `true` if `value` is a boxed computed value. + +## `isComputedProp` + +Usage: + +- `isComputedProp(obj, propertyName)` + +Returns `true` if the designated property is a computed value. + ## More about computed You can pass [options into `computed`](computed-options.md). If you experience diff --git a/docs/refguide/map.md b/docs/refguide/map.md index d2de9f79a..183ff25aa 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -52,3 +52,11 @@ can also use `observable.shallow` for this; see also [modifiers](modifiers.md). ### `observable.map(values, { name: "my map" })` The `name` option can be used to give the map a friendly debug name, to be used in for example `spy` or the MobX dev tools. + +## `isObservableMap` + +Usage: + +- `isObservableMap(value)` + +Returns `true` if `value` is an observable map. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 847366700..29178a44e 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -60,6 +60,14 @@ Some things to keep in mind when making objects observable: - Pass `{ deep: false }` as 3rd argument to disable the auto conversion of property values. - Pass `{ name: "my object" }` to assign a friendly debug name to this object. -## Object limitations in environments without Proxy support +## `isObservableObject` + +Usage: + +- `isObservableObject(value)` + +Returns `true` if `value` is an observable object. + +## Limitations in environments without Proxy support When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See also [limitations without proxies](../best/limitations-without-proxies.md) diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 0b5d1b9a9..b69145d3d 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -37,3 +37,30 @@ For examples of the declarative use of `observable` with `makeObservable`, see [ You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. You can't use `observable` to make objects with a prototype observable; as that is the responsibility of its constructor function. Use `makeObservable` or `makeAutoObservable` in its constructor. + +## Inspecting whether something is observable + +### `isObservable` + +Usage: + +- `isObservable(value)` + +Returns `true` if `value` is observable. + +Works for all observables, computed values and disposer functions of reactions. + +### `isObservableProp` + +Usage: + +- `isObservableProp(obj, propertyName)` + +Returns `true` if property named `propertyName` of `obj` is +observable. + +Works for all observables, computed values and disposer functions of reactions. + +### Type-specific APIs + +MobX also exposes `isObservable*`, like `isObservableArray` and so on to expect for specific observables. diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index d25e1b655..1006d56bf 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -7,7 +7,9 @@ hide_title: true # Intercept & Observe `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). -`intercept` can be used to detect and modify mutations before they are applied to the observable. + +`intercept` can be used to detect and modify mutations before they are applied to the observable. This is useful for useful for validation, normalization or cancellation. + `observe` allows you to intercept changes after they have been made. ## Intercept diff --git a/docs/refguide/on-become-observed.md b/docs/refguide/on-become-observed.md new file mode 100644 index 000000000..c11da25b0 --- /dev/null +++ b/docs/refguide/on-become-observed.md @@ -0,0 +1,50 @@ +--- +title: onBecomeObserved +sidebar_label: onBecomeObserved +hide_title: true +--- + +# `onBecomeObserved` and `onBecomeUnobserved` + +Usage: + +- `onBecomeObserved(observable, property?, listener: () => void): (() => void)` +- `onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` + +These functions are hooks into the observability system of MobX and get notified when observables _start_ / _stop_ becoming observed. It can be used to execute some lazy operations or perform network fetches. + +The return value is a _diposer-function_ that will detach the _listener_. + +```javascript +export class City { + location + temperature + interval + + constructor(location) { + makeAutoObservable(this, { + resume: false, + suspend: false + }) + this.location = location + // only start data fetching if temperature is actually used! + onBecomeObserved(this, "temperature", this.resume) + onBecomeUnobserved(this, "temperature", this.suspend) + } + + resume = () => { + log(`Resuming ${this.location}`) + this.interval = setInterval(() => this.fetchTemperature(), 5000) + } + + suspend = () => { + log(`Suspending ${this.location}`) + this.temperature = undefined + clearInterval(this.interval) + } + + fetchTemperature = flow(function* () { + // data fetching logic + }) +} +``` diff --git a/docs/refguide/set.md b/docs/refguide/set.md index 7828f2f7e..e07956e40 100644 --- a/docs/refguide/set.md +++ b/docs/refguide/set.md @@ -18,3 +18,11 @@ Use `set` whenever you want to create a dynamic set where the addition / removal Note that your browser needs to support ES6 sets, or polyfill them, to make sets work. Sets use the [ES6 Set API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) + +## `isObservableSet` + +Usage: + +- `isObservableSet(value)` + +Returns `true` if `value` is an observable set. diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 2eba09852..9a0e2cbec 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -6,8 +6,6 @@ hide_title: true # toJS -
    - `toJS(value, options?)` Recursively converts an (observable) object to a javascript _structure_. @@ -24,11 +22,11 @@ Cycles are detected and properly supported by default, but this can be disabled For more complex (de)serialization scenario's, one can use [serializr](https://github.com/mobxjs/serializr) ```javascript -var obj = mobx.observable({ +const obj = mobx.observable({ x: 1 }) -var clone = mobx.toJS(obj) +const clone = mobx.toJS(obj) console.log(mobx.isObservableObject(obj)) // true console.log(mobx.isObservableObject(clone)) // false diff --git a/website/i18n/en.json b/website/i18n/en.json index 6fa785fb5..a6b93a79d 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -101,8 +101,8 @@ "sidebar_label": "autorun" }, "refguide/boxed": { - "title": "Boxed Values", - "sidebar_label": "boxed values" + "title": "Observable Boxes", + "sidebar_label": "boxes" }, "refguide/computed-behavior": { "title": "How computed works", @@ -172,6 +172,10 @@ "title": "Intercept & Observe", "sidebar_label": "intercept & observe" }, + "refguide/on-become-observed": { + "title": "onBecomeObserved", + "sidebar_label": "onBecomeObserved" + }, "refguide/reaction": { "title": "reaction", "sidebar_label": "reaction" diff --git a/website/sidebars.json b/website/sidebars.json index 16b28d622..0a38100db 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -19,9 +19,10 @@ "refguide/map", "refguide/set", "refguide/object", + "refguide/boxed", "refguide/modifiers", "refguide/extend-observable", - "refguide/boxed" + "refguide/is-observable" ], "Updating observables with actions": [ "refguide/action", @@ -39,7 +40,8 @@ "refguide/when", "refguide/observe", "best/dispose-reactions", - "best/what-does-mobx-react-to" + "best/what-does-mobx-react-to", + "refguide/on-become-observed" ], "Debugging MobX": [ "best/trace" From fa19a7db14e664fd041d25c2800c4421c5ccb157 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 13:39:59 +0200 Subject: [PATCH 0421/1043] Pull configure into its own document. Link the proper information in various places about configuring without proxy support. --- docs/best/limitations-without-proxies.md | 11 +- docs/intro/installation.md | 6 +- docs/refguide/action.md | 2 +- docs/refguide/api.md | 120 +------------------ docs/refguide/computed-behavior.md | 2 +- docs/refguide/configure.md | 142 +++++++++++++++++++++++ website/sidebars.json | 1 + 7 files changed, 158 insertions(+), 126 deletions(-) create mode 100644 docs/refguide/configure.md diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 1583bd1a1..53b0af122 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -11,7 +11,14 @@ MobX 6 works on any ES 5 environment, but if your environment or browser does no - Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. - Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. -Luckily, most environments support Proxies these days. +Luckily, most environments support Proxies these days. MobX is configured +to fail if `Proxy` is not available, but you can [change that](configure.md#useproxies), for instance: + +```javascript +import { configure } from "mobx" + +configure({ useProxies: "never" }) # or "ifavailable" +``` ## Arrays @@ -26,7 +33,7 @@ Some native array manipulation methods as well as external libraries use `Array. So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. Alternatively you can use the `toJS` method on observable array. As long as the external library has no intent to modify the array, this works as expected. -You can use `isObservableArray(observable)` to check whether something is an observable array. +You can use [`isObservableArray(observable)`](array.md#isobservablearray) to check whether something is an observable array, and [`isArrayLike`](array.md#isarraylike) to check whether something is an array at all, observable or not. ## Objects diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 341f72806..8d3776d45 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -21,12 +21,12 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). For example, when running Microsoft Internet Explorer or React Native (if < v0.59 or when using the Hermes engine) on Android. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). -You have to explicitly enable the fallback implementation by calling `enableES5()`: +You have to explicitly enable the fallback implementation by configuring [`useProxies`](../refguide/configure#useproxies): ```javascript -import { enableES5 } from "mobx" +import { configure } from "mobx" -enableES5() +configure({ useProxies: "never" }) # or "ifavailable" ``` ## Modern JavaScript environments diff --git a/docs/refguide/action.md b/docs/refguide/action.md index fd40147d4..dcdd8b702 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -122,4 +122,4 @@ Returns `true` if the given function is marked as an `action`. ## Disabling mandatory actions By default, MobX 6 and later require that you use actions to make state changes. -You can however configure MobX to disable this behavior, see [`enforceActions`](api.md#enforceactions). +You can however configure MobX to disable this behavior, see [`enforceActions`](configure.md#enforceactions). diff --git a/docs/refguide/api.md b/docs/refguide/api.md index ec88c3dde..11df44171 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -260,128 +260,10 @@ Hook for when something stops being observed. ### `configure` -Usage: `configure(options)`. Sets global behavior settings on the active MobX instance. Use this to change how MobX behaves as a whole. -```javascript -import { configure } from "mobx" - -configure({ - // ... -}) -``` - -#### `arrayBuffer: number` - -Increases the default created size of observable arrays to `arrayBuffer`, if the maximum size isn't yet there. - -Observable arrays lazily create getters on members of `ObservableArray.prototype` starting at `0`. -This will create the members from `0` to `arrayBuffer` if they don't yet exist. -Use `arrayBuffer` if you know you'll have a common minimum array size and don't want to risk first creating those getters in hot code paths. -See also `observable`. - -#### `computedRequiresReaction: boolean` - -Forbids the access of any unobserved computed value. -Use this if you want to check whether you are using computed properties without a reactive context. - -```javascript -configure({ computedRequiresReaction: true }) -``` - -#### `observableRequiresReaction: boolean` - -Warns about any unobserved observable access. -Use this if you want to check whether you are using observables without a reactive context (eg not inside an autorun, action, or react component without observer wrapping). - -```javascript -configure({ observableRequiresReaction: true }) -``` - -#### `reactionRequiresObservable: boolean` - -Warns when a reaction (eg `autorun`) is created without any observable access. -Use this to check whether you are unneededly wrapping react components with `observer`, or to find possible related bugs. - -```javascript -configure({ reactionRequiresObservable: true }) -``` - -#### `computedConfigurable: boolean` - -Allows overwriting computed values. This is useful for testing purposes _only_. Don't enable this -on production as it can cause memory-leaks. - -```javascript -configure({ computedConfigurable: true }) -``` - -#### `disableErrorBoundaries: boolean` - -By default, MobX will catch and rethrow exceptions happening in your code to make sure that a reaction in one exception does not prevent the scheduled execution of other, possibly unrelated, reactions. This means exceptions are not propagated back to the original causing code and therefore you won't be able to catch them using try/catch. - -There may be times when you want to catch those errors, for example when unit testing your reactions. You can disable this behaviour using `disableErrorBoundaries`. - -```javascript -configure({ disableErrorBoundaries: true }) -``` - -Please note that MobX won't recover from errors when using this configuration. For that reason, you may need to use `_resetGlobalState` after each exception. Example: - -```js -configure({ disableErrorBoundaries: true }) - -test("Throw if age is negative", () => { - expect(() => { - const age = observable.box(10) - autorun(() => { - if (age.get() < 0) throw new Error("Age should not be negative") - }) - age.set(-1) - }).toThrow() - _resetGlobalState() // Needed after each exception -}) -``` - -> Prior to MobX 4, `_resetGlobalState` was `extras.resetGlobalState`. - -#### `enforceActions` - -Also known as "strict mode". -In strict mode, it is not allowed to change any state outside of an [`action`](action.md). -Accepted values: - -- `"never"` (default): State can be modified from anywhere -- `"observed"`: All state that is observed _somewhere_ needs to be changed through actions. This is the recommended strictness mode in non-trivial applications. -- `"always"`: State always needs be updated (which in practice also includes creation) in actions. - -#### `isolateGlobalState: boolean` - -Isolates the global state of MobX, when there are multiple instances of MobX in the same environment. -This is useful when you have an encapsulated library that is using MobX, living in the same page as the app that is using MobX. -The reactivity inside the library will remain self-contained when you call `configure({isolateGlobalState: true})` inside the library. - -Without this options, if multiple MobX instances are active, the internal state will be shared. The benefit is that observables from both instances work together, the downside is that the MobX versions have to match. - -```javascript -configure({ isolateGlobalState: true }) -``` - -#### `reactionScheduler: (f: () => void) => void` - -Sets a new function that executes all MobX reactions. -By default `reactionScheduler` just runs the `f` reaction without any other behavior. -This can be useful for basic debugging, or slowing down reactions to visualize application updates. - -```javascript -configure({ - reactionScheduler: (f): void => { - console.log("Running an event after a delay:", f) - setTimeout(f, 100) - } -}) -``` +[«details»](configure.md) ## Direct Observable manipulation diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index d7d1e043b..b54c4af7c 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -36,7 +36,7 @@ This can cause performance degradation if a computed value is read in a high fre You can forcefully keep a computed value awake if you need to, by using [`keepAlive`](computed-options.md#computed-keepalive) or by using [`observe`](observe.md), but note that this can potentially create memory leaks. -MobX can be configured to report an error when computeds are accessed directly with the `computedRequiresReaction` option: +MobX can be configured to report an error when computeds are accessed directly with the [`computedRequiresReaction`](configure#computedrequiresreaction) option: ```javascript configure({ diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md new file mode 100644 index 000000000..34416e6c1 --- /dev/null +++ b/docs/refguide/configure.md @@ -0,0 +1,142 @@ +--- +title: configure +sidebar_label: configure +hide_title: true +--- + +# `configure` + +Usage: + +- `configure(options)`. + +Sets global behavior settings on the active MobX instance. Use this to change how MobX behaves as a whole. + +```javascript +import { configure } from "mobx" + +configure({ + // ... +}) +``` + +## Options + +#### `arrayBuffer: number` + +Increases the default created size of observable arrays to `arrayBuffer`, if the maximum size isn't yet there. + +Observable arrays lazily create getters on members of `ObservableArray.prototype` starting at `0`. +This will create the members from `0` to `arrayBuffer` if they don't yet exist. +Use `arrayBuffer` if you know you'll have a common minimum array size and don't want to risk first creating those getters in hot code paths. + +#### `computedRequiresReaction: boolean` + +Forbids the access of any unobserved computed value. +Use this if you want to check whether you are using computed properties without a reactive context. + +```javascript +configure({ computedRequiresReaction: true }) +``` + +#### `observableRequiresReaction: boolean` + +Warns about any unobserved observable access. +Use this if you want to check whether you are using observables without a reactive context (eg not inside an autorun, action, or react component without observer wrapping). + +```javascript +configure({ observableRequiresReaction: true }) +``` + +#### `reactionRequiresObservable: boolean` + +Warns when a reaction (eg `autorun`) is created without any observable access. +Use this to check whether you are unneededly wrapping react components with `observer`, or to find possible related bugs. + +```javascript +configure({ reactionRequiresObservable: true }) +``` + +#### `computedConfigurable: boolean` + +Allows overwriting computed values. This is useful for testing purposes _only_. Don't enable this on production as it can cause memory-leaks. + +```javascript +configure({ computedConfigurable: true }) +``` + +#### `disableErrorBoundaries: boolean` + +By default, MobX will catch and rethrow exceptions happening in your code to make sure that a reaction in one exception does not prevent the scheduled execution of other, possibly unrelated, reactions. This means exceptions are not propagated back to the original causing code and therefore you won't be able to catch them using try/catch. + +There may be times when you want to catch those errors, for example when unit testing your reactions. You can disable this behavior using `disableErrorBoundaries`. + +```javascript +configure({ disableErrorBoundaries: true }) +``` + +Please note that MobX won't recover from errors when using this configuration. For that reason, you may need to use `_resetGlobalState` after each exception. Example: + +```js +import { _resetGlobalState } from "mobx" + +configure({ disableErrorBoundaries: true }) + +test("Throw if age is negative", () => { + expect(() => { + const age = observable.box(10) + autorun(() => { + if (age.get() < 0) throw new Error("Age should not be negative") + }) + age.set(-1) + }).toThrow() + _resetGlobalState() // Needed after each exception +}) +``` + +#### `enforceActions` + +Accepted values: + +- `"observed"` (default): All state that is observed _somewhere_ needs to be changed through actions. This is the default, and the recommended strictness mode in non-trivial applications. +- `"never"`: State can be modified from anywhere +- `"always"`: State always needs be updated (which in practice also includes creation) in actions. + +`enforcedActions` set to `observed` (or `always`) is also known as _strict mode_. In strict mode, it is not allowed to change any state outside of an [`action`](action.md). + +#### `isolateGlobalState: boolean` + +Isolates the global state of MobX when there are multiple instances of MobX in the same environment. + +This is useful when you have an encapsulated library that is using MobX, living in the same page as the app that is using MobX. + +The reactivity inside the library will remain self-contained when you call `configure({isolateGlobalState: true})` inside the library. + +Without this options, if multiple MobX instances are active, the internal state will be shared. The benefit is that observables from both instances work together, the downside is that the MobX versions have to match. + +```javascript +configure({ isolateGlobalState: true }) +``` + +#### `reactionScheduler: (f: () => void) => void` + +Sets a new function that executes all MobX reactions. +By default `reactionScheduler` just runs the `f` reaction without any other behavior. +This can be useful for basic debugging, or slowing down reactions to visualize application updates. + +```javascript +configure({ + reactionScheduler: (f): void => { + console.log("Running an event after a delay:", f) + setTimeout(f, 100) + } +}) +``` + +### `useProxies` + +Accepted values: + +- `"always"` (default): MobX is expected to only run in environments with [`Proxy` support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). It is an error if these are not available. +- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations]((../best/limitations-without-proxy.md). +- `"ifavailable"`: Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. This causes various [limitations]((../best/limitations-without-proxy.md). You still need to write code taking these limitations into account. diff --git a/website/sidebars.json b/website/sidebars.json index 0a38100db..3892e527d 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -49,6 +49,7 @@ "Utilities": [ "refguide/api", "refguide/tojson", + "refguide/configure", "refguide/spy", "refguide/inject", "refguide/object-api", From 9b74688ba4a19f12549d85f957766614608f69a6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 13:44:20 +0200 Subject: [PATCH 0422/1043] Pull out configure into its own document. Fix information about configuration without proxies. --- docs/best/limitations-without-proxies.md | 6 +++--- docs/intro/installation.md | 10 +++++----- docs/refguide/configure.md | 4 ++-- website/i18n/en.json | 4 ++++ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 53b0af122..5c39a9ec7 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -12,12 +12,12 @@ MobX 6 works on any ES 5 environment, but if your environment or browser does no - Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. Luckily, most environments support Proxies these days. MobX is configured -to fail if `Proxy` is not available, but you can [change that](configure.md#useproxies), for instance: +to fail if `Proxy` is not available, but you can [change that](../refguide/configure.md#useproxies), for instance: ```javascript import { configure } from "mobx" -configure({ useProxies: "never" }) # or "ifavailable" +configure({ useProxies: "never" }) // or "ifavailable" ``` ## Arrays @@ -33,7 +33,7 @@ Some native array manipulation methods as well as external libraries use `Array. So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. Alternatively you can use the `toJS` method on observable array. As long as the external library has no intent to modify the array, this works as expected. -You can use [`isObservableArray(observable)`](array.md#isobservablearray) to check whether something is an observable array, and [`isArrayLike`](array.md#isarraylike) to check whether something is an array at all, observable or not. +You can use [`isObservableArray(observable)`](../refguide/array.md#isobservablearray) to check whether something is an observable array, and [`isArrayLike`](../refguide/array.md#isarraylike) to check whether something is an array at all, observable or not. ## Objects diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 8d3776d45..ee9cc6ac7 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -17,6 +17,10 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: - Unpkg: ` - ⚠️ When using a CDN, it is best to check the url in your browser and see what version it resolves to, so that your users aren't accidentally served a newer version in the future when updates are release. So use an url like: https://unpkg.com/mobx@5.15.4/lib/mobx.umd.production.min.js instead. Substitute `production.min` with `development` in the URL for a development build. +## Modern JavaScript environments + +The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` + ## Older JavaScript environments By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). For example, when running Microsoft Internet Explorer or React Native (if < v0.59 or when using the Hermes engine) on Android. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). @@ -26,9 +30,5 @@ You have to explicitly enable the fallback implementation by configuring [`usePr ```javascript import { configure } from "mobx" -configure({ useProxies: "never" }) # or "ifavailable" +configure({ useProxies: "never" }) // or "ifavailable" ``` - -## Modern JavaScript environments - -The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 34416e6c1..632025d90 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -138,5 +138,5 @@ configure({ Accepted values: - `"always"` (default): MobX is expected to only run in environments with [`Proxy` support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). It is an error if these are not available. -- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations]((../best/limitations-without-proxy.md). -- `"ifavailable"`: Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. This causes various [limitations]((../best/limitations-without-proxy.md). You still need to write code taking these limitations into account. +- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations](../best/limitations-without-proxies.md). +- `"ifavailable"`: Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. This causes various [limitations](../best/limitations-without-proxies.md). You still need to write code taking these limitations into account. diff --git a/website/i18n/en.json b/website/i18n/en.json index a6b93a79d..7e7af1cc4 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -116,6 +116,10 @@ "title": "computed", "sidebar_label": "computed" }, + "refguide/configure": { + "title": "configure", + "sidebar_label": "configure" + }, "refguide/create-transformer": { "title": "createTransformer", "sidebar_label": "mobxUtils.createTransformer" From a743db4b01750de6c684fef8da2fc7d48e3262c6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 14:01:23 +0200 Subject: [PATCH 0423/1043] Clean up Object API docs. --- docs/refguide/api.md | 58 ++++++++++++++++++++++--------------- docs/refguide/object-api.md | 32 +++++++++++--------- docs/refguide/spy.md | 5 ++++ website/i18n/en.json | 4 +-- website/sidebars.json | 3 +- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 11df44171..94b454841 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -265,17 +265,41 @@ Use this to change how MobX behaves as a whole. [«details»](configure.md) -## Direct Observable manipulation +## Object API -There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. +The Object API is an optional, generic API that enables manipulating observable maps, objects and arrays with the same API. This is specially useful +in [environments without `Proxy` support](../best/limitations-without-proxies.md). -- **`values(thing)`** returns all values in the collection as array -- **`keys(thing)`** returns all keys in the collection as array -- **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array -- **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). -- **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. -- **`has(thing, key)`** returns true if the collection has the specified _observable_ property. -- **`get(thing, key)`** returns the child under the specified key. +### `values` + +Return all values in collection as array. + +### `keys` + +Return all keys/indices in collection as array. + +### `entries` + +Return a `[key, value]` pair for all entries in the collection +as an array. + +### `set` + +Update collection. + +### `remove` + +Remove item from collection. + +### `has` + +Check for membership in collection. + +### `get` + +Get value from collection with key. + +[«details»](object-api.md) # Development utilities @@ -290,27 +314,15 @@ Also has a powerful logger utility based on `spy`. ### `trace` -Usage: - -- `trace(enterDebugger?)` -- `trace(Reaction object / ComputedValue object / disposer function, enterDebugger?)` -- `trace(object, computedValuePropertyName, enterDebugger?)` - -`trace` is a small utility that you can use inside a computed value or reaction. -If it is enabled, it will start logging when the value is being invalidated, and why. -If `enterDebugger` is set to true, and developer tools are enabled, the javascript engine -will break on the point where it is triggered. +Log when value is invalidated, or set debugger breakpoint. [«trace»](../best/trace.md) ### `spy` -Usage: `spy(listener)`. Registers a global spy listener that listens to all events that happen in MobX. -It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. -Used for example by the `mobx-react-devtools`. -[«details»](spy.md) +[«trace»](spy.md) ### `getAtom` diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 350e13e66..e380d636b 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,25 +1,31 @@ --- -sidebar_label: Object api -title: Object api +sidebar_label: Object API +title: Object API hide_title: true --- -## Direct Observable manipulation +## Object API -
    +The Object API is a utility API that enables manipulating observable maps, objects and arrays with the same generic API. -There is now an utility API that enables manipulating observable maps, objects and arrays with the same API. These api's are fully reactive, which means that even new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. +These APIs are fully reactive, which means that even [without `Proxy` support](../best/limitations-without-proxies.md) new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. -- **`values(thing)`** returns all values in the collection as array -- **`keys(thing)`** returns all keys in the collection as array -- **`entries(thing)`** returns a [key, value] pair for all entries in the collection as array +Access: -The following methods are not really necessary when using MobX 5, but can be used to achieve MobX-5-like behavior in MobX 4. +- `values(thing)` returns all values in the collection as array +- `keys(thing)` returns all keys in the collection as array +- `entries(thing)` returns a [key, value] pair for all entries in the collection as array -- **`set(thing, key, value)`** or **`set(thing, { key: value })`** Updates the given collection with the provided key / value pair(s). -- **`remove(thing, key)`** removes the specified child from the collection. For arrays splicing is used. -- **`has(thing, key)`** returns true if the collection has the specified _observable_ property. -- **`get(thing, key)`** returns the child under the specified key. +Mutation: + +- `set(thing, key, value)` or `set(thing, { key: value })` Updates the given collection with the provided key / value pair(s). +- `remove(thing, key)` removes the specified child from the collection. For arrays splicing is used. +- `has(thing, key)` returns true if the collection has the specified _observable_ property. +- `get(thing, key)` returns the child under the specified key. + +If you use the access API in an environment in an environment +without `Proxy` support you should also use the mutation APIs +so that they can detect changes. ```javascript import { get, set, observable, values } from "mobx" diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 6e36e5f1d..a8e6e8c4b 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -13,6 +13,11 @@ Registers a global spy listener that listens to all events that happen in MobX. It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. Used for example by the `mobx-react-devtools`. +Usage: `spy(listener)`. +Registers a global spy listener that listens to all events that happen in MobX. +It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. +Used for example by the `mobx-react-devtools`. + Example usage of spying all actions: ```javascript diff --git a/website/i18n/en.json b/website/i18n/en.json index 7e7af1cc4..b5cd42239 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -161,8 +161,8 @@ "sidebar_label": "Observable modifiers" }, "refguide/object-api": { - "title": "Object api", - "sidebar_label": "Object api" + "title": "Object API", + "sidebar_label": "Object API" }, "refguide/object": { "title": "Observable Objects", diff --git a/website/sidebars.json b/website/sidebars.json index 3892e527d..a1b6ddcdd 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -44,7 +44,8 @@ "refguide/on-become-observed" ], "Debugging MobX": [ - "best/trace" + "best/trace", + "best/devtools" ], "Utilities": [ "refguide/api", From fea2f8030b004db0cbcf8b3d825a64772198e6a3 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 14:31:25 +0200 Subject: [PATCH 0424/1043] Add a note about MobX developer tools and link in a few places. Get rid of the old devtools docs as those are now replaced by the browser plugin. --- docs/best/devtools.md | 43 ------------------------------- docs/best/stateless-HMR.md | 30 --------------------- docs/react/react-integration.md | 13 +++++++++- docs/refguide/action.md | 2 +- docs/refguide/api.md | 9 +------ docs/refguide/computed-options.md | 2 +- docs/refguide/spy.md | 10 +++---- website/i18n/en.json | 4 --- 8 files changed, 18 insertions(+), 95 deletions(-) delete mode 100644 docs/best/devtools.md diff --git a/docs/best/devtools.md b/docs/best/devtools.md deleted file mode 100644 index a2a924655..000000000 --- a/docs/best/devtools.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -sidebar_label: MobX + React DevTools -title: MobX + React DevTools -hide_title: true ---- - -# MobX + React DevTools - -
    - -
    - egghead.io lesson 2: devtools -
    -
    - -
    - Hosted on egghead.io -
    - -MobX ships with DevTools that can be used to track the rendering behavior and data dependencies of your app. - -![devtools](../assets/devtools.gif) - -## Usage: - -Install: - -`npm install mobx-react-devtools` - -To enable devtools, import and render the devtools somewhere in your codebase. - -```JS -import DevTools from 'mobx-react-devtools' - -const App = () => ( -  
    - ... - -
    -) -``` - -For more details check the [mobx-react-devtools](https://github.com/mobxjs/mobx-react-devtools) repository. diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index c5b051687..5a4b4f2c4 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -18,36 +18,6 @@ This is usually because the modules which have changed (and their parents) do no This is especially apparent when you start working with MobX since observables make it really easy to create a lot of stateless components. Here are some tips for how to build your stateless components and still get all the advantages of HMR: -## Use function declarations instead of arrow functions - -Function declarations still do the exact same thing as arrow functions, but they have the key advantage of actually having names inside of the React DevTools. - -For instance, here's a stateless component built with an arrow function: - -```javascript -const ToDoItem = observer(props =>
    {props.item}
    ) - -export default ToDoItem -``` - -And here's how that will appear in the React DevTools: - -![devtools-noname](../assets/devtools-noDisplayName.png) - -On the other hand, using a function declaration will allow you to build the same stateless component AND see it in the DevTools: - -```javascript -function ToDoItem(props) { - return
    {props.item}
    -} - -export default observer(ToDoItem) -``` - -And now the component shows up correctly in the DevTools: - -![devtools-withname](../assets/devtools-withDisplayName.png) - ## Make sure your top-level component is a stateful observer By "stateful observer", all I really mean is a component created with `React.Component` or `React.createClass` and which uses the `@observer` decorator, like so: diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index e0da8e063..4b7568bda 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -161,7 +161,7 @@ See [React class components](react-class-components.md) for more information. ## Tips -### React DevTools support +### React DevTools component name support [React DevTools](https://reactjs.org/blog/2019/08/15/new-react-devtools.html) uses the display name information of components to properly display the component hierarchy. @@ -173,6 +173,8 @@ export const MyComponent = observer(props =>
    hi
    ) then no display name will be visible in the DevTools. +![devtools-noname](../assets/devtools-noDisplayName.png) + The following approaches can be used to fix this: - use `function` with a name instead of an arrow function. `mobx-react` infers component name from function name: @@ -206,6 +208,15 @@ The following approaches can be used to fix this: This is broken in React at the time of writing; mobx-react `observer` uses a React.memo and runs into this bug: https://github.com/facebook/react/issues/18026 +Now you can see component names: + +![devtools-withname](../assets/devtools-withDisplayName.png) + +### MobX developer tools + +[MobX developer tools](https://github.com/mobxjs/mobx-devtools) is browser plugin that lets you introspect observables and track changes. This can +be used in addition to the React devtools. Check it out! + ### Use the `` component in cases where you can't use observer Sometimes it is hard to apply `observer` to a part of the rendering, for example because you are rendering inside a callback, and you don't want to extract a new component to be able to mark it as `observer`. diff --git a/docs/refguide/action.md b/docs/refguide/action.md index dcdd8b702..504baf6f6 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -24,7 +24,7 @@ Especially the fact that [`transaction`](api.md#transaction) is applied automati actions will batch mutations and only notify computed values and reactions after the (outer most) action has finished. This ensures that intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. -`action` also provides useful debugging information in combination with the devtools. +`action` also provides useful debugging information in combination with the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). By passing in `name` you can control the name of the action, otherwise it is derived from the function or method that is wrapped. diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 94b454841..fe772b1ee 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -305,13 +305,6 @@ Get value from collection with key. _The following api's might come in handy if you want to build cool tools on top of MobX or if you want to inspect the internal state of MobX_ -### `"mobx-react-devtools"` package - -The mobx-react-devtools is a powerful package that helps you to investigate the performance and dependencies of your react components. -Also has a powerful logger utility based on `spy`. - -[«details»](../best/devtools.md) - ### `trace` Log when value is invalidated, or set debugger breakpoint. @@ -332,7 +325,7 @@ Returns the backing _Atom_ of a given observable object, property, reaction etc. ### `getDebugName` Usage: `getDebugName(thing, property?)` -Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the `mobx-react-devtools`. +Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). ### `getDependencyTree` diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index 2984e34de..ddd94370c 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -9,7 +9,7 @@ hide_title: true Usually `computed` behaves the way you want it to out of the box, but it's possible to customize its behavior by passing in an `options` argument: -- `name`: String, the debug name used in spy and the MobX devtools +- `name`: String, the debug name used in spy and the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). - `context`: The `this` that should be used in the provided expression - `get`: override the getter for the computed property. - `set`: The setter function to be used. Without setter it is not possible to assign new values to a computed value. If the options argument passed to `computed` is a function, this is assumed to be a setter. diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index a8e6e8c4b..45d687ac5 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -6,17 +6,13 @@ hide_title: true # Spy -
    +Usage: -Usage: `spy(listener)`. -Registers a global spy listener that listens to all events that happen in MobX. -It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. -Used for example by the `mobx-react-devtools`. +- `spy(listener)` -Usage: `spy(listener)`. Registers a global spy listener that listens to all events that happen in MobX. It is similar to attaching an `observe` listener to _all_ observables at once, but also notifies about running (trans/re)actions and computations. -Used for example by the `mobx-react-devtools`. +Used for example by the [MobX developer tools](../react/react-integration/md#mobxdevtools). Example usage of spying all actions: diff --git a/website/i18n/en.json b/website/i18n/en.json index b5cd42239..a78c68465 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -13,10 +13,6 @@ "title": "Decorators in MobX", "sidebar_label": "Decorators in MobX" }, - "best/devtools": { - "title": "MobX + React DevTools", - "sidebar_label": "MobX + React DevTools" - }, "best/dispose-reactions": { "title": "Always dispose reactions", "sidebar_label": "Always dispose reactions" From d463cb82e3783e761ebd38deeecf8c52ef053a96 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 15:10:44 +0200 Subject: [PATCH 0425/1043] Finish cleaning up the API document. --- docs/refguide/api.md | 275 ++++++++++++--------------- docs/refguide/array.md | 2 +- docs/refguide/extending.md | 9 +- docs/refguide/internals.md | 79 ++++++++ docs/refguide/introspection-utils.md | 41 ++++ website/i18n/en.json | 15 +- website/sidebars.json | 6 +- 7 files changed, 261 insertions(+), 166 deletions(-) create mode 100644 docs/refguide/internals.md create mode 100644 docs/refguide/introspection-utils.md diff --git a/docs/refguide/api.md b/docs/refguide/api.md index fe772b1ee..78d2e1f67 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -15,6 +15,8 @@ _These are the most important MobX API's._ ## Creating observables +_Making things observable_ + ### `makeObservable` Declare observables, computeds and actions in the class @@ -82,15 +84,13 @@ Creates an observable _box_ that stores an observable reference to a value. [«`details`»](boxed.md) -## `computed` +## Actions -Computed values derived from observables and other computeds. +_Actions are anything that modify the state._ -[«details»](computed.md) - -## Actions +### `action` -Actions are anything that modify the state. +Marking things as action. [«details»](action.md) @@ -106,8 +106,20 @@ MobX friendly replacement for `async` / `await`. [«details»](flow.md) +## Computed + +_Computed values derived from observables and other computeds._ + +### `computed` + +Marking things as computed. + +[«details»](computed.md) + ## React integration +From the `mobx-react` package. + ### `observer` A higher order component you can use to make a React component re-render when observables change. @@ -116,17 +128,19 @@ Is part of the `mobx-react` package. [«details»](../react/react-integration.md) -### `Provider` (`mobx-react` package) +### `Provider` [*Deprecated*] Can be used to pass stores to child components using React's context mechanism. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. See the [`mobx-react` docs](https://github.com/mobxjs/mobx-react#provider-experimental). -### `inject` (`mobx-react` package) +### `inject` [*Deprecated*] Higher order component and counterpart of `Provider`. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. -## Reactions & Derivations +## Reactions + +Side-effects for observables. ### `autorun` @@ -153,157 +167,157 @@ Usage: `onReactionError(handler: (error: any, derivation) => void)` This function attaches a global error listener, which is invoked for every error that is thrown from a _reaction_. This can be used for monitoring or test purposes. ---- +### `intercept` -# Utilities +Intercept changes before they are applied to an observable api. -_Here are some utilities that might make working with observable objects or computed values more convenient. -More, less trivial utilities can be found in the \* [mobx-utils](https://github.com/mobxjs/mobx-utils) package._ +[«details»](observe.md) -### `toJS` +### `observe` -Converts observable data structures back to plain javascript objects, ignoring computed values. +Low-level api that can be used to observe a single observable value. -[«details»](tojson.md) +[«details»](observe.md) -## `isObservable` +### `onBecomeObserved` -Is a value observable? +Hook for when something becomes observed. -[«details»](observable.md#isobservable) +[«details»](on-become-observed.md) -## `isObservableProp` +### `onBecomeUnobserved` -Is a property observable? +Hook for when something stops being observed. -[«details»](observable.md#isobservableprop) +[«details»](on-become-observed.md) -## `isObservableArray` +## Utilities -Is value an observable array? +Here are some utilities that might make working with observable objects or computed values more convenient. +More, less trivial utilities can be found in the [mobx-utils](https://github.com/mobxjs/mobx-utils) package. -[«details»](array.md#isobservablearray) +### `toJS` -## `isObservableMap` +Converts observable data structures back to plain javascript objects, ignoring computed values. -Is value an observable map? +[«details»](tojson.md) -[«details»](map.md#isobservablemap) +### `isArrayLike` -## `isObservableSet` +[Without Proxy support] -Is value an observable set? +Is this an array of some type, observable or not? -[«details»](set.md#isobservableset) +[«details»](array.md#isarraylike) -## `isObservableObject` +## Configuration -Is value an observable object? +### `configure` -[«details»](object.md#isobservableobject) +Sets global behavior settings on the active MobX instance. +Use this to change how MobX behaves as a whole. -## `isBoxedObservable` +[«details»](configure.md) -Is value an observable box? +## Object API -[«details»](boxed.md#isboxedobservable) +The Object API is an optional, generic API that enables manipulating observable maps, objects and arrays with the same API. This is specially useful +in [environments without `Proxy` support](../best/limitations-without-proxies.md). -## `isArrayLike` +### `values` -[Without Proxy support] +Return all values in collection as array. -Is this an array of some type, observable or not? +### `keys` -[«details»](array.md#isarraylike) +Return all keys/indices in collection as array. -### `isAction` +### `entries` -Is this an action? +Return a `[key, value]` pair for all entries in the collection +as an array. -[«details»](action.md#isaction) +### `set` -### `isComputed` +Update collection. -Is this a boxed computed value? +### `remove` -[«details»](computed.md#iscomputed) +Remove item from collection. -### `isComputedProp` +### `has` -Is this a computed property? +Check for membership in collection. -[«details»](computed.md#iscomputedprop) +### `get` -### `intercept` +Get value from collection with key. -Intercept changes before they are applied to an observable api. +[«details»](object-api.md) -[«details»](observe.md) +## Introspection utilities -### `observe` +The following APIs might come in handy if you want to inspect the internal state of MobX or want to build cool tools on top of MobX. -Low-level api that can be used to observe a single observable value. +### `isObservable` -[«details»](observe.md) +Is a value observable? -### `onBecomeObserved` +[«details»](observable.md#isobservable) -Hook for when something becomes observed. +### `isObservableProp` -[«details»](on-become-observed.md) +Is a property observable? -### `onBecomeUnobserved` +[«details»](observable.md#isobservableprop) -Hook for when something stops being observed. +### `isObservableArray` -[«details»](on-become-observed.md) +Is value an observable array? -### `configure` +[«details»](array.md#isobservablearray) -Sets global behavior settings on the active MobX instance. -Use this to change how MobX behaves as a whole. +### `isObservableMap` -[«details»](configure.md) +Is value an observable map? -## Object API +[«details»](map.md#isobservablemap) -The Object API is an optional, generic API that enables manipulating observable maps, objects and arrays with the same API. This is specially useful -in [environments without `Proxy` support](../best/limitations-without-proxies.md). +### `isObservableSet` -### `values` +Is value an observable set? -Return all values in collection as array. +[«details»](set.md#isobservableset) -### `keys` +### `isObservableObject` -Return all keys/indices in collection as array. +Is value an observable object? -### `entries` +[«details»](object.md#isobservableobject) -Return a `[key, value]` pair for all entries in the collection -as an array. +### `isBoxedObservable` -### `set` +Is value an observable box? -Update collection. +[«details»](boxed.md#isboxedobservable) -### `remove` +### `isAction` -Remove item from collection. +Is this an action? -### `has` +[«details»](action.md#isaction) -Check for membership in collection. +### `isComputed` -### `get` +Is this a boxed computed value? -Get value from collection with key. +[«details»](computed.md#iscomputed) -[«details»](object-api.md) +### `isComputedProp` -# Development utilities +Is this a computed property? -_The following api's might come in handy if you want to build cool tools on top of MobX or if you want to inspect the internal state of MobX_ +[«details»](computed.md#iscomputedprop) ### `trace` @@ -317,99 +331,48 @@ Registers a global spy listener that listens to all events that happen in MobX. [«trace»](spy.md) -### `getAtom` - -Usage: `getAtom(thing, property?)`. -Returns the backing _Atom_ of a given observable object, property, reaction etc. - ### `getDebugName` -Usage: `getDebugName(thing, property?)` -Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). +Returns a (generated) friendly debug name + +[«trace»](introspection-utils.md#getdebugname) ### `getDependencyTree` -Usage: `getDependencyTree(thing, property?)`. Returns a tree structure with all observables the given reaction / computation currently depends upon. +[«trace»](introspection-utils.md#getdependencytree) + ### `getObserverTree` -Usage: `getObserverTree(thing, property?)`. Returns a tree structure with all reactions / computations that are observing the given observable. -### `"mobx-react"` development hooks +[«trace»](introspection-utils.md#getobservertree) -The `mobx-react` package exposes the following additional api's that are used by the `mobx-react-devtools`: +## Extending MobX -- `trackComponents()`: enables the tracking of `observer` based React components -- `renderReporter.on(callback)`: callback will be invoked on each rendering of an `observer` enabled React component, with timing information etc -- `componentByNodeRegistery`: ES6 WeakMap that maps from DOMNode to a `observer` based React component instance +In the rare case you want to extend MobX itself. -# Internal functions +### `createAtom` -_The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX_ +Utility function that can be used to create your own observable data structures and hook them up to MobX. Used internally by all observable data types. -### `transaction` +[«details»](extending.md) -_Transaction is a low-level api, it is recommended to use actions instead_ +### `getAtom` -`transaction(worker: () => void)` can be used to batch a bunch of updates without notifying any observers until the end of the transaction. -`transaction` takes a single, parameterless `worker` function as argument and runs it. -No observers are notified until this function has completed. -`transaction` returns any value that was returned by the `worker` function. -Note that `transaction` runs completely synchronously. -Transactions can be nested. Only after completing the outermost `transaction` pending reactions will be run. +Returns the backing atom. -```javascript -import { observable, transaction, autorun } from "mobx" +[«trace»](introspection-utils.md#getatom) -const numbers = observable([]) +### `transaction` -autorun(() => console.log(numbers.length, "numbers!")) -// Prints: '0 numbers!' +Wrap code in a transaction. -transaction(() => { - transaction(() => { - numbers.push(1) - numbers.push(2) - }) - numbers.push(3) -}) -// Prints: '3 numbers!' -``` +[«trace»](internals.md#transaction) ### `untracked` Untracked allows you to run a piece of code without establishing observers. -Like `transaction`, `untracked` is automatically applied by `(@)action`, so usually it makes more sense to use actions than to use `untracked` directly. -Example: - -```javascript -const person = observable({ - firstName: "Michel", - lastName: "Weststrate" -}) - -autorun(() => { - console.log( - person.lastName, - ",", - // this untracked block will return the person's firstName without establishing a dependency - untracked(() => person.firstName) - ) -}) -// prints: Weststrate, Michel - -person.firstName = "G.K." -// doesn't print! - -person.lastName = "Chesterton" -// prints: Chesterton, G.K. -``` -### `createAtom` - -Utility function that can be used to create your own observable data structures and hook them up to MobX. -Used internally by all observable data types. - -[«details»](extending.md) +[«trace»](internals.md#untracked) diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 445b8b440..2218df610 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -4,7 +4,7 @@ sidebar_label: arrays hide_title: true --- -## Observable Arrays +# Observable Arrays Usage: diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 3fef44c89..837d29cde 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,11 +1,10 @@ --- -sidebar_label: createAtom +title: Creating new observable types +sidebar_label: Creating new observable types hide_title: true --- -# Creating observable data structures and reactions - -
    +# Creating new observable types ## Atoms @@ -15,7 +14,7 @@ Atoms can be used to signal MobX that some observable data source has been obser And MobX will signal the atom whenever it is used or no longer in use. _Tip: in many cases you can avoid the need to create your own atoms, by just creating a normal observable, and use -the `onBecomeObserved` or `onBecomeUnobserved` utility to be notified when MobX starts tracking an observable_ +the [`onBecomeObserved`](on-become-observed.md) utility to be notified when MobX starts tracking an observable_ The following example demonstrates how you can create an observable `Clock`, which can be used in reactive functions, and returns the current date-time. diff --git a/docs/refguide/internals.md b/docs/refguide/internals.md new file mode 100644 index 000000000..53dd9dce8 --- /dev/null +++ b/docs/refguide/internals.md @@ -0,0 +1,79 @@ +--- +title: Internal functions +sidebar_label: Internal functions +hide_title: true +--- + +# Internal functions + +The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX. + +## `transaction` + +_Transaction is a low-level api, it is recommended to use actions instead_ + +Usage: + +- `transaction(worker: () => any)` + +`transaction` can be used to batch a bunch of updates without notifying any observers until the end of the transaction. Like `untracked`, it is automatically applied by `action`, so usually it makes more sense to use actions than to use `transaction` directly. + +`transaction` takes a single, parameterless `worker` function as argument and runs it. +No observers are notified until this function has completed. +`transaction` returns any value that was returned by the `worker` function. +Note that `transaction` runs completely synchronously. +Transactions can be nested. Only after completing the outermost `transaction` pending reactions will be run. + +```javascript +import { observable, transaction, autorun } from "mobx" + +const numbers = observable([]) + +autorun(() => console.log(numbers.length, "numbers!")) +// Prints: '0 numbers!' + +transaction(() => { + transaction(() => { + numbers.push(1) + numbers.push(2) + }) + numbers.push(3) +}) +// Prints: '3 numbers!' +``` + +## `untracked` + +Untracked allows you to run a piece of code without establishing observers. +Like `transaction`, `untracked` is automatically applied by `action`, so usually it makes more sense to use actions than to use `untracked` directly. +Example: + +```javascript +const person = observable({ + firstName: "Michel", + lastName: "Weststrate" +}) + +autorun(() => { + console.log( + person.lastName, + ",", + // this untracked block will return the person's firstName without establishing a dependency + untracked(() => person.firstName) + ) +}) +// prints: Weststrate, Michel + +person.firstName = "G.K." +// doesn't print! + +person.lastName = "Chesterton" +// prints: Chesterton, G.K. +``` + +## `createAtom` + +Utility function that can be used to create your own observable data structures and hook them up to MobX. +Used internally by all observable data types. + +[«details»](extending.md) diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md new file mode 100644 index 000000000..1c6c8a39e --- /dev/null +++ b/docs/refguide/introspection-utils.md @@ -0,0 +1,41 @@ +--- +title: Introspection APIs +sidebar_label: Introspection APIs +hide_title: true +--- + +# Introspection APIs + +The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. + +### `getDebugName` + +Usage: + +- `getDebugName(thing, property?)` + +Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). + +### `getDependencyTree` + +Usage: + +- `getDependencyTree(thing, property?)`. + +Returns a tree structure with all observables the given reaction / computation currently depends upon. + +### `getObserverTree` + +Usage: + +- `getObserverTree(thing, property?)`. + +Returns a tree structure with all reactions / computations that are observing the given observable. + +### `getAtom` + +Usage: + +- `getAtom(thing, property?)`. + +Returns the backing _Atom_ of a given observable object, property, reaction etc. diff --git a/website/i18n/en.json b/website/i18n/en.json index a78c68465..43953daa8 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -129,8 +129,8 @@ "sidebar_label": "extendObservable" }, "refguide/extending": { - "title": "refguide/extending", - "sidebar_label": "createAtom" + "title": "Creating new observable types", + "sidebar_label": "Creating new observable types" }, "refguide/flow": { "title": "flow", @@ -140,6 +140,14 @@ "title": "provider_inject", "sidebar_label": "Provider / inject" }, + "refguide/internals": { + "title": "Internal functions", + "sidebar_label": "Internal functions" + }, + "refguide/introspection-utils": { + "title": "Introspection APIs", + "sidebar_label": "Introspection APIs" + }, "refguide/make-observable": { "title": "makeObservable / makeAutoObservable", "sidebar_label": "makeObservable / makeAutoObservable" @@ -210,7 +218,8 @@ "Effects for observables": "Effects for observables", "Debugging MobX": "Debugging MobX", "Utilities": "Utilities", - "Tips & Tricks": "Tips & Tricks" + "Tips & Tricks": "Tips & Tricks", + "Extending MobX": "Extending MobX" } }, "pages-strings": { diff --git a/website/sidebars.json b/website/sidebars.json index a1b6ddcdd..dac9ce9c6 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -45,7 +45,7 @@ ], "Debugging MobX": [ "best/trace", - "best/devtools" + "refguide/introspection-utils" ], "Utilities": [ "refguide/api", @@ -65,6 +65,10 @@ "best/limitations-without-proxies", "best/decorators", "best/store" + ], + "Extending MobX": [ + "refguide/extending", + "refguide/internals" ] } } From 0bc68bd99e7f0bc6b44bb2df5eb2b77a34b3d96e Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:18:10 +0200 Subject: [PATCH 0426/1043] createTransformer docs have moved to a PR for mobx-utils. --- docs/refguide/api.md | 10 ------- docs/refguide/inject.md | 45 ---------------------------- docs/refguide/introspection-utils.md | 1 + docs/refguide/mobx-utils.md | 9 +++--- notes-docs.md | 3 ++ website/i18n/en.json | 8 ++--- website/sidebars.json | 9 ++---- 7 files changed, 13 insertions(+), 72 deletions(-) delete mode 100644 docs/refguide/inject.md diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 78d2e1f67..8e4b0c682 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -128,16 +128,6 @@ Is part of the `mobx-react` package. [«details»](../react/react-integration.md) -### `Provider` - -[*Deprecated*] Can be used to pass stores to child components using React's context mechanism. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. - -See the [`mobx-react` docs](https://github.com/mobxjs/mobx-react#provider-experimental). - -### `inject` - -[*Deprecated*] Higher order component and counterpart of `Provider`. Use the [React context mechanism](https://reactjs.org/docs/context.html) instead. - ## Reactions Side-effects for observables. diff --git a/docs/refguide/inject.md b/docs/refguide/inject.md deleted file mode 100644 index 8abdd7073..000000000 --- a/docs/refguide/inject.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -sidebar_label: Provider / inject -title: provider_inject -hide_title: true ---- - -# Provider / inject - -
    - -egghead.io lesson 8: inject stores with Provider - -_Warning: It is recommended to use [`React.createContext`](https://mobx-react.js.org/recipes-context) instead! It provides generally the same functionality, and Provider / inject is mostly around for legacy reasons_ - -The `mobx-react` package provides the `Provider` component that can be used to pass down stores using React's context mechanism. -To connect to those stores, pass a list of store names to `inject`, which will make the stores available as props. - -Example: - -```javascript -const colors = observable({ - foreground: '#000', - background: '#fff' -}); - -const App = () => - - - ; - -const Button = inject("colors")(observer(({ colors, label, onClick }) => - -)); - -// later.. -colors.foreground = 'blue'; -// all buttons updated -``` - -See for more information the [`mobx-react` docs](https://github.com/mobxjs/mobx-react#provider-and-inject). diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md index 1c6c8a39e..772a3f5e8 100644 --- a/docs/refguide/introspection-utils.md +++ b/docs/refguide/introspection-utils.md @@ -7,6 +7,7 @@ hide_title: true # Introspection APIs The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. +Also relevant are [`toJS`](tojson.md) and the various [`isObservable*` APIs](api.md#isobservable). ### `getDebugName` diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 71214ee8e..c704f094f 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,10 +1,9 @@ --- -sidebar_label: MobX-utils +title: mobx-utils +sidebar_label: mobx-utils hide_title: true --- -# MobX-utils +# mobx-utils -
    - -[MobX-utils](https://github.com/mobxjs/mobx-utils) provides utility functions and common patterns for MobX. +[MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions and common patterns for MobX. diff --git a/notes-docs.md b/notes-docs.md index 8b1cef7b5..7ee374fec 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -48,6 +48,9 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - Should we use `mobx-react-lite` in examples primarily? What's up with the observer batching story though? +- createTransformer from mobx-utils is documented in the main docs but NOT + in mobx-utils. Should move it to mobx-utils? `expr` is also documented but we can instead directly refer to mobx-utils. + ## Todo - [ ] Netlify preview for docs PR. diff --git a/website/i18n/en.json b/website/i18n/en.json index 43953daa8..18ca6fcae 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -136,10 +136,6 @@ "title": "flow", "sidebar_label": "flow" }, - "refguide/inject": { - "title": "provider_inject", - "sidebar_label": "Provider / inject" - }, "refguide/internals": { "title": "Internal functions", "sidebar_label": "Internal functions" @@ -157,8 +153,8 @@ "sidebar_label": "maps" }, "refguide/mobx-utils": { - "title": "refguide/mobx-utils", - "sidebar_label": "MobX-utils" + "title": "mobx-utils", + "sidebar_label": "mobx-utils" }, "refguide/modifiers": { "title": "Observable modifiers", diff --git a/website/sidebars.json b/website/sidebars.json index dac9ce9c6..6cc4dd90d 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -45,23 +45,20 @@ ], "Debugging MobX": [ "best/trace", - "refguide/introspection-utils" + "refguide/introspection-utils", + "refguide/spy" ], "Utilities": [ "refguide/api", "refguide/tojson", - "refguide/configure", - "refguide/spy", - "refguide/inject", "refguide/object-api", "refguide/mobx-utils", - "refguide/extending", - "refguide/create-transformer", "refguide/expr" ], "Tips & Tricks": [ "faq/faq", "best/pitfalls", + "refguide/configure", "best/limitations-without-proxies", "best/decorators", "best/store" From 9025a46a77288e7e111d3427b542bff6ad645826 Mon Sep 17 00:00:00 2001 From: Sylvain Pace Date: Wed, 8 Jul 2020 16:19:00 +0200 Subject: [PATCH 0427/1043] feat(website): add DocSearch as recommended by docusaurus --- website/siteConfig.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/siteConfig.js b/website/siteConfig.js index b5158a52e..329c46870 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -21,6 +21,10 @@ const users = [ ] const siteConfig = { + algolia: { + apiKey: '500db32fbdbd53a814f42aafdfa26bd4', + indexName: 'mobxjs', + }, title: "MobX", // Title for your website. tagline: "Simple, scalable state management", From a0ffcacb30b349e56c295c3808c31ae1516f467d Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:20:28 +0200 Subject: [PATCH 0428/1043] Remove createTransformer from docs. --- docs/faq/faq.md | 2 +- docs/refguide/create-transformer.md | 191 ---------------------------- website/i18n/en.json | 4 - 3 files changed, 1 insertion(+), 196 deletions(-) delete mode 100644 docs/refguide/create-transformer.md diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 5646a38e1..aaaca0a28 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -63,7 +63,7 @@ MobX works just as well server side, and is already combined with jQuery (see th ##### Can I record states and re-hydrate them? -Yes, see [createTransformer](http://mobxjs.github.io/mobx/refguide/create-transformer.html) for some examples. +Yes, see [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils)for some examples. ##### Can you tell me how it works? diff --git a/docs/refguide/create-transformer.md b/docs/refguide/create-transformer.md deleted file mode 100644 index 1ac7e19ab..000000000 --- a/docs/refguide/create-transformer.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: createTransformer -sidebar_label: mobxUtils.createTransformer -hide_title: true ---- - -# createTransformer - -
    - -Provided by the `mobx-utils` package. - -`createTransformer(transformation: (value: A) => B, onCleanup?: (result: B, value?: A) => void): (value: A) => B` - -`createTransformer` turns a function (that should transform value `A` into another value `B`) into a reactive and memoizing function. -In other words, if the `transformation` function computes B given a specific A, the same B will be returned for all other future invocations of the transformation with the same A. -However, if A changes, the transformation will be re-applied so that B is updated accordingly. -And last but not least, if nobody is using the transformation of a specific A anymore, its entry will be removed from the memoization table. - -With `createTransformer` it is very easy to transform a complete data graph into another data graph. -Transformation functions can be composed so that you can build a tree using lots of small transformations. -The resulting data graph will never be stale, it will be kept in sync with the source by applying small patches to the result graph. -This makes it very easy to achieve powerful patterns similar to sideways data loading, map-reduce, tracking state history using immutable data structures etc. - -The optional `onCleanup` function can be used to get a notification when a transformation of an object is no longer needed. -This can be used to dispose resources attached to the result object if needed. - -Always use transformations inside a reaction like `@observer` or `autorun`. -Transformations will, like any other computed value, fall back to lazy evaluation if not observed by something, which sort of defeats their purpose. - -This all might still be a bit vague, so here are two examples that explain this whole idea of transforming one data structure into another by using small, reactive functions: - -## Tracking mutable state using immutable, shared data structures. - -This example is taken from the [Reactive2015 conference demo](https://github.com/mobxjs/mobx-reactive2015-demo): - -```javascript -/* - The store that holds our domain: boxes and arrows -*/ -const store = observable({ - boxes: [], - arrows: [], - selection: null -}) - -/** - Serialize store to json upon each change and push it onto the states list -*/ -const states = [] - -autorun(() => { - states.push(serializeState(store)) -}) - -const serializeState = createTransformer(store => ({ - boxes: store.boxes.map(serializeBox), - arrows: store.arrows.map(serializeArrow), - selection: store.selection ? store.selection.id : null -})) - -const serializeBox = createTransformer(box => ({ ...box })) - -const serializeArrow = createTransformer(arrow => ({ - id: arrow.id, - to: arrow.to.id, - from: arrow.from.id -})) -``` - -In this example the state is serialized by composing three different transformation functions. -The autorunner triggers the serialization of the `store` object, which in turn serializes all boxes and arrows. -Let's take closer look at the life of an imaginary example box#3. - -1. The first time box#3 is passed by `map` to `serializeBox`, - the serializeBox transformation is executed and an entry containing box#3 and its serialized representation is added to the internal memoization table of `serializeBox`. -2. Imagine that another box is added to the `store.boxes` list. - This would cause the `serializeState` function to re-compute, resulting in a complete remapping of all the boxes. - However, all the invocations of `serializeBox` will now return their old values from the memoization tables since their transformation functions didn't (need to) run again. -3. Secondly, if somebody changes a property of box#3 this will cause the application of the `serializeBox` to box#3 to re-compute, just like any other reactive function in MobX. - Since the transformation will now produce a new Json object based on box#3, all observers of that specific transformation will be forced to run again as well. - That's the `serializeState` transformation in this case. - `serializeState` will now produce a new value in turn and map all the boxes again. But except for box#3, all other boxes will be returned from the memoization table. -4. Finally, if box#3 is removed from `store.boxes`, `serializeState` will compute again. - But since it will no longer be using the application of `serializeBox` to box#3, - that reactive function will go back to non-reactive mode. - This signals the memoization table that the entry can be removed so that it is ready for GC. - -So effectively we have achieved state tracking using immutable, shared datas structures here. -All boxes and arrows are mapped and reduced into single state tree. -Each change will result in a new entry in the `states` array, but the different entries will share almost all of their box and arrow representations. - -## Transforming a datagraph into another reactive data graph - -Instead of returning plain values from a transformation function, it is also possible to return observable objects. -This can be used to transform an observable data graph into a another observable data graph, which can be used to transform... you get the idea. - -Here is a small example that encodes a reactive file explorer that will update its representation upon each change. -Data graphs that are built this way will in general react a lot faster and will consist of much more straight-forward code, -compared to derived data graph that are updated using your own code. See the [performance tests](https://github.com/mobxjs/mobx/blob/3ea1f4af20a51a1cb30be3e4a55ec8f964a8c495/test/perf/transform-perf.js#L4) for some examples. - -Unlike the previous example, the `transformFolder` will only run once as long as a folder remains visible; -the `DisplayFolder` objects track the associated `Folder` objects themselves. - -In the following example all mutations to the `state` graph will be processed automatically. -Some examples: - -1. Changing the name of a folder will update its own `path` property and the `path` property of all its descendants. -2. Collapsing a folder will remove all descendant `DisplayFolders` from the tree. -3. Expanding a folder will restore them again. -4. Setting a search filter will remove all nodes that do not match the filter, unless they have a descendant that matches the filter. -5. Etc. - -```javascript -var m = require('mobx') - -function Folder(parent, name) { - this.parent = parent; - m.extendObservable(this, { - name: name, - children: m.observable.shallow([]), - }); -} - -function DisplayFolder(folder, state) { - this.state = state; - this.folder = folder; - m.extendObservable(this, { - collapsed: false, - get name() { - return this.folder.name; - }, - get isVisible() { - return !this.state.filter || this.name.indexOf(this.state.filter) !== -1 || this.children.some(child => child.isVisible); - }, - get children() { - if (this.collapsed) - return []; - return this.folder.children.map(transformFolder).filter(function(child) { - return child.isVisible; - }) - }, - get path() { - return this.folder.parent === null ? this.name : transformFolder(this.folder.parent).path + "/" + this.name; - }) - }); -} - -var state = m.observable({ - root: new Folder(null, "root"), - filter: null, - displayRoot: null -}); - -var transformFolder = m.createTransformer(function (folder) { - return new DisplayFolder(folder, state); -}); - - -// returns list of strings per folder -var stringTransformer = m.createTransformer(function (displayFolder) { - var path = displayFolder.path; - return path + "\n" + - displayFolder.children.filter(function(child) { - return child.isVisible; - }).map(stringTransformer).join(''); -}); - -function createFolders(parent, recursion) { - if (recursion === 0) - return; - for (var i = 0; i < 3; i++) { - var folder = new Folder(parent, i + ''); - parent.children.push(folder); - createFolders(folder, recursion - 1); - } -} - -createFolders(state.root, 2); // 3^2 - -m.autorun(function() { - state.displayRoot = transformFolder(state.root); - state.text = stringTransformer(state.displayRoot) - console.log(state.text) -}); - -state.root.name = 'wow'; // change folder name -state.displayRoot.children[1].collapsed = true; // collapse folder -state.filter = "2"; // search -state.filter = null; // unsearch -``` diff --git a/website/i18n/en.json b/website/i18n/en.json index 18ca6fcae..0e2501255 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -116,10 +116,6 @@ "title": "configure", "sidebar_label": "configure" }, - "refguide/create-transformer": { - "title": "createTransformer", - "sidebar_label": "mobxUtils.createTransformer" - }, "refguide/expr": { "title": "refguide/expr", "sidebar_label": "mobxUtils.expr" From 5eed6406a870636db2bb55d93691e2416cfe478c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:21:53 +0200 Subject: [PATCH 0429/1043] Reference to other libraries that can do this --- docs/faq/faq.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/faq/faq.md b/docs/faq/faq.md index aaaca0a28..47e0ad3c2 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -65,6 +65,8 @@ MobX works just as well server side, and is already combined with jQuery (see th Yes, see [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils)for some examples. +For more advanced frameworks built with MobX that can do this, see [mobx-state-tree](https://mobx-state-tree.js.org/intro/philosophy) and [mobx-keystone](https://mobx-keystone.js.org/). + ##### Can you tell me how it works? Sure, join the reactiflux channel or checkout the code. Or, submit an issue to motivate me to make some nice drawings :). From 2f5f0f789634fd4f1cc90d80f400c0630504e38b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:27:53 +0200 Subject: [PATCH 0430/1043] Clean up the expr docs. --- docs/refguide/expr.md | 30 ------------------------------ website/sidebars.json | 3 +-- 2 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 docs/refguide/expr.md diff --git a/docs/refguide/expr.md b/docs/refguide/expr.md deleted file mode 100644 index a6ccd32d9..000000000 --- a/docs/refguide/expr.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_label: mobxUtils.expr -hide_title: true ---- - -# Expr - -
    - -Provided by the `mobx-utils` package. - -`expr` can be used to create temporary computed values inside computed values. -Nesting computed values is useful to create cheap computations in order to prevent expensive computations from needing to run. - -In the following example, the expression prevents the `TodoView` component from being re-rendered if the selection changes elsewhere. -Instead, the component will only re-render when the relevant todo is (de)selected, which happens much less frequently. - -```javascript -const TodoView = observer(({ todo, editorState }) => { - const isSelected = mobxUtils.expr(() => editorState.selection === todo) - return
    {todo.title}
    -}) -``` - -`expr(func)` is an alias for `computed(func).get()`. - -Please note that the function given to `expr` will be evaluated _twice_ in the scenario that the overall expression value changes. -It will be evaluated the first time when any observables it depends on change. -It will be evaluated a second time when a change in its value triggers the outer computed or reaction to evaluate, which will -recreate and reevaluate the expression. diff --git a/website/sidebars.json b/website/sidebars.json index 6cc4dd90d..34278841b 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -52,8 +52,7 @@ "refguide/api", "refguide/tojson", "refguide/object-api", - "refguide/mobx-utils", - "refguide/expr" + "refguide/mobx-utils" ], "Tips & Tricks": [ "faq/faq", From 8ce4c5ac8390965ec90fbdbbda6a4ab7faacc095 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:49:31 +0200 Subject: [PATCH 0431/1043] Clean up FAQ. --- docs/faq/faq.md | 66 ++++++++++++++++++++------------------ docs/intro/installation.md | 2 +- notes-docs.md | 1 + website/i18n/en.json | 4 --- website/sidebars.json | 4 +-- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 47e0ad3c2..a3e0c390d 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -6,20 +6,38 @@ hide_title: true ## FAQ -
    - ##### Which browsers are supported? -See the [browser support](https://mobx.js.org/README.html#browser-support). +MobX works in any ES5 environment, which includes browsers and NodeJS. -##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` +There are some [limitations](../best/limitations-without-proxies.md) for +environments that do not support `Proxy` (modern browsers +all support `Proxy`). -Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: +##### How does MobX compare to other Reactive frameworks? -- ES5 target: DOM,ES5,ScriptHost -- ES6 target: DOM,ES6,DOM.Iterable,ScriptHost +See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. -So you'd need to add `es2018.asynciterable` to those defaults in this particular case. +##### Is MobX a framework? + +MobX gives you a lot of freedom in how you structure your code, where to store state or how to process events. It might free you from frameworks that pose all kinds of restrictions on your code in the name of performance. + +For state management frameworks built with MobX that offer advanced features, see [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/). + +##### Can I record states and re-hydrate them? + +[mobx-state-tree](https://mobx-state-tree.js.org/intro/philosophy) and [mobx-keystone](https://mobx-keystone.js.org/) can do this for you. + +To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) for some examples. + +##### Is React Native supported? + +Yes, `mobx` and `mobx-react` will work on React Native. The latter through importing `"mobx-react/native"`. +The devtools don't support React Native. + +##### Where can I find more MobX resources? + +We've compiled a large list of helpful resources of all types in the [official awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx). If you feel it's missing something, please open an [issue](https://github.com/mobxjs/awesome-mobx/issues/new) or [pull request](https://github.com/mobxjs/awesome-mobx/compare) to describe what you're looking for or share your added links :). ##### Can MobX be combined with RxJS? @@ -34,19 +52,6 @@ In practice, combining RxJS and MobX might result in really powerful constructio Use for example RxJS to process and throttle user events and as a result of that update the state. If the state has been made observable by MobX, it will then take care of updating the UI and other derivations accordingly. -##### Is React Native supported? - -Yes, `mobx` and `mobx-react` will work on React Native. The latter through importing `"mobx-react/native"`. -The devtools don't support React Native. Note that if you indend to use your observer components with hot reloading, decorators in the components may not always work. If that is the case, use the functions instead (eg. `action(fn)` instead of `@action` or `observer(component)` instead of `@observer`). - -##### How does MobX compare to other Reactive frameworks? - -See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. - -##### Is MobX a framework? - -MobX is _not_ a framework. It does not tell you how to structure your code, where to store state or how to process events. Yet it might free you from frameworks that poses all kinds of restrictions on your code in the name of performance. - ##### Can I combine MobX with Flux? Flux implementations that do not work on the assumption that the data in their stores is immutable should work well with MobX. @@ -61,24 +66,23 @@ MobX is framework agnostic and can be applied in any modern JS environment. It just ships with a small function to transform ReactJS components into reactive view functions for convenience. MobX works just as well server side, and is already combined with jQuery (see this [Fiddle](http://jsfiddle.net/mweststrate/vxn7qgdw)) and [Deku](https://gist.github.com/mattmccray/d8740ea97013c7505a9b). -##### Can I record states and re-hydrate them? - -Yes, see [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils)for some examples. - -For more advanced frameworks built with MobX that can do this, see [mobx-state-tree](https://mobx-state-tree.js.org/intro/philosophy) and [mobx-keystone](https://mobx-keystone.js.org/). - ##### Can you tell me how it works? Sure, join the reactiflux channel or checkout the code. Or, submit an issue to motivate me to make some nice drawings :). And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). -##### Where can I find more MobX resources? +#### Does MobX have TypeScript support? -We've compiled a large list of helpful resources of all types in the [official awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx). If you feel it's missing something, please open an [issue](https://github.com/mobxjs/awesome-mobx/issues/new) or [pull request](https://github.com/mobxjs/awesome-mobx/compare) to describe what you're looking for or share your added links :). +It works out of the box. MobX is written with TypeScript and type definitions are built-in. -#### What about TypeScript support? +##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` -MobX is written with TypeScript and type definitions is built-in. +Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: + +- ES5 target: DOM,ES5,ScriptHost +- ES6 target: DOM,ES6,DOM.Iterable,ScriptHost + +So you'd need to add `es2018.asynciterable` to those defaults in this particular case. #### Does MobX have Flow typing support? diff --git a/docs/intro/installation.md b/docs/intro/installation.md index ee9cc6ac7..056d0fd41 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -14,7 +14,7 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: - CDN: - cndjs: https://cdnjs.com/libraries/mobx - - Unpkg: ` + - Unpkg: `` - ⚠️ When using a CDN, it is best to check the url in your browser and see what version it resolves to, so that your users aren't accidentally served a newer version in the future when updates are release. So use an url like: https://unpkg.com/mobx@5.15.4/lib/mobx.umd.production.min.js instead. Substitute `production.min` with `development` in the URL for a development build. ## Modern JavaScript environments diff --git a/notes-docs.md b/notes-docs.md index 7ee374fec..3cfafb48c 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -69,6 +69,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. It does seem to work as intended according to the issue though. - [ ] Find a good place for `onReactionError`. - [ ] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. +- [ ] Move API overview into UI. ## Structure thoughts diff --git a/website/i18n/en.json b/website/i18n/en.json index 0e2501255..6841d3c78 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -116,10 +116,6 @@ "title": "configure", "sidebar_label": "configure" }, - "refguide/expr": { - "title": "refguide/expr", - "sidebar_label": "mobxUtils.expr" - }, "refguide/extend-observable": { "title": "refguide/extend-observable", "sidebar_label": "extendObservable" diff --git a/website/sidebars.json b/website/sidebars.json index 34278841b..5a33a1824 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -4,7 +4,8 @@ "README", "intro/installation", "intro/overview", - "intro/concepts" + "intro/concepts", + "faq/faq" ], "MobX and React": [ "react/react-integration", @@ -55,7 +56,6 @@ "refguide/mobx-utils" ], "Tips & Tricks": [ - "faq/faq", "best/pitfalls", "refguide/configure", "best/limitations-without-proxies", From dfa7ab3ea21a5630e2a587f4729df83dbf948584 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 16:51:38 +0200 Subject: [PATCH 0432/1043] The pitfalls doc is now empty; its content distributed or out of date. --- docs/best/pitfalls.md | 54 ------------------------------------------- docs/faq/faq.md | 16 +++++++++++++ website/i18n/en.json | 4 ---- website/sidebars.json | 1 - 4 files changed, 16 insertions(+), 59 deletions(-) delete mode 100644 docs/best/pitfalls.md diff --git a/docs/best/pitfalls.md b/docs/best/pitfalls.md deleted file mode 100644 index 2baebbbfc..000000000 --- a/docs/best/pitfalls.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -sidebar_label: Common Pitfalls & Best Practices -title: Common pitfalls & best practices -hide_title: true ---- - -# Common pitfalls & best practices - -Stuck with MobX? This section contains a list of common issues people new to MobX might run into. - -#### Importing from wrong location - -Because MobX ships with typescript typings out of the box, some import autocompleting tools (at least in VSCode) have the habit of auto completing with a wrong import, like - -```javascript -// wrong -import { observable } from "mobx/lib/mobx" -``` - -This is incorrect but will not always immediately lead to runtime errors. So be aware. The only correct way of importing anything from the `mobx` package is: - -```javascript -// correct -import { observable } from "mobx" -``` - -### `@inject('store')` before `@observer` will cause MobX to not trigger - -The effect with React is that the it will never render on observable changes. - -This is wrong - -```typescript -@observer -@inject('store') -``` - -It must be - -```typescript -@inject('store') -@observer -``` - -You'll notice a warning - -``` -Mobx observer: You are trying to use 'observer' on a component that already has 'inject'. Please apply 'observer' before applying 'inject' -``` - -#### I have a weird exception when using `@observable` in a React component. - -The following exception: `Uncaught TypeError: Cannot assign to read only property '__mobxLazyInitializers' of object` occurs when using a `react-hot-loader` that does not support decorators. -Either use `extendObservable` in `componentWillMount` instead of `@observable`, or upgrade to `react-hot-loader` `"^3.0.0-beta.2"` or higher. diff --git a/docs/faq/faq.md b/docs/faq/faq.md index a3e0c390d..6d8241bf6 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -84,6 +84,22 @@ Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.a So you'd need to add `es2018.asynciterable` to those defaults in this particular case. +#### Importing from wrong location + +Because MobX ships with typescript typings out of the box, some import autocompleting tools (at least in VSCode) have the habit of auto completing with a wrong import, like + +```javascript +// wrong +import { observable } from "mobx/lib/mobx" +``` + +This is incorrect but will not always immediately lead to runtime errors. So be aware. The only correct way of importing anything from the `mobx` package is: + +```javascript +// correct +import { observable } from "mobx" +``` + #### Does MobX have Flow typing support? MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. diff --git a/website/i18n/en.json b/website/i18n/en.json index 6841d3c78..40ac763c6 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -21,10 +21,6 @@ "title": "Limitations without Proxy support", "sidebar_label": "Limitations without Proxy support" }, - "best/pitfalls": { - "title": "Common pitfalls & best practices", - "sidebar_label": "Common Pitfalls & Best Practices" - }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", "sidebar_label": "Hot Module Reloading with Stateless Components" diff --git a/website/sidebars.json b/website/sidebars.json index 5a33a1824..65144b5a1 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -56,7 +56,6 @@ "refguide/mobx-utils" ], "Tips & Tricks": [ - "best/pitfalls", "refguide/configure", "best/limitations-without-proxies", "best/decorators", From 06ecfa2efac3f84b5e8572d65207c3ef01d2145a Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:11:51 +0200 Subject: [PATCH 0433/1043] Modernize this document. I decided to frontload the discussion of domain store and only talk about the UI store afterward, as I think the domain store concept is one central to MobX. --- docs/best/store.md | 173 +++++++++++++++++++------------------ docs/refguide/configure.md | 6 +- website/i18n/en.json | 4 +- website/sidebars.json | 4 +- 4 files changed, 98 insertions(+), 89 deletions(-) diff --git a/docs/best/store.md b/docs/best/store.md index ead4a8a89..ebe4326eb 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -6,80 +6,18 @@ hide_title: true # Best Practices for building large scale maintainable projects -
    - This section contains some best practices we discovered at Mendix while working with MobX. This section is opinionated and you are in no way forced to apply these practices. There are many ways of working with MobX and React, and this is just one of them. -This section focuses on an unobtrusive way of working with MobX, which works well in existing code bases, or with classic MVC patterns. An alternative, more opinionated way of organizing stores is using [mobx-state-tree](https://github.com/mobxjs/mobx-state-tree), which ships with cool features as structurally shared snapshots, action middlewares, JSON patch support etc out of the box. +This section focuses on an unobtrusive way of working with MobX, which works well in existing code bases, or with classic MVC patterns. An alternative, more opinionated way of organizing stores is using [mobx-state-tree](https://github.com/mobxjs/mobx-state-tree) or [mobx-keystone](https://mobx-keystone.js.org/). Both ship with cool features as structurally shared snapshots, action middlewares, JSON patch support etc out of the box. -# Stores +## Stores Stores can be found in any Flux architecture and can be compared a bit with controllers in the MVC pattern. The main responsibility of stores is to move _logic_ and _state_ out of your components into a standalone testable unit that can be used in both frontend and backend JavaScript. -## Stores for the user interface state - -Most applications benefit from having at least two stores. -One for the _UI state_ and one or more for the _domain state_. -The advantage of separating those two is you can reuse and test _domain state_ universally, and you might very well reuse it in other applications. -The _ui-state-store_ however is often very specific for your application. -But usually very simple as well. -This store typically doesn't have much logic in it, but will store a plethora of loosely coupled pieces of information about the UI. -This is ideal as most applications will change the UI state often during the development process. - -Things you will typically find in UI stores: - -- Session information -- Information about how far your application has loaded -- Information that will not be stored in the backend -- Information that affects the UI globally - - Window dimensions - - Accessibility information - - Current language - - Currently active theme -- User interface state as soon as it affects multiple, further unrelated components: - - Current selection - - Visibility of toolbars, etc. - - State of a wizard - - State of a global overlay - -It might very well be that these pieces of information start as internal state of a specific component (for example the visibility of a toolbar). -But after a while you discover that you need this information somewhere else in your application. -Instead of pushing state in such a case upwards in the component tree, like you would do in plain React apps, you just move that state to the _ui-state-store_. - -For isomorphic applications you might also want to provide a stub implementation of this store with sane defaults so that all components render as expected. -You might distribute the _ui-state-store_ through your application by passing it as a property through your component tree or using `Provider` and `inject` from the `mobx-react` package. - -Example of a store (using ES6 syntax): - -```javascript -import { observable, computed, asStructure } from "mobx" -import jquery from "jquery" - -export class UiState { - @observable language = "en_US" - @observable pendingRequestCount = 0 - - // .struct makes sure observer won't be signaled unless the - // dimensions object changed in a deepEqual manner - @observable.struct windowDimensions = { - width: jquery(window).width(), - height: jquery(window).height() - } - - constructor() { - jquery.resize(() => { - this.windowDimensions = getWindowDimensions() - }) - } - - @computed get appIsInSync() { - return this.pendingRequestCount === 0 - } -} -``` +Most applications benefit from having at least two stores: one for the _domain state_ and another one for the _UI state_. The advantage of separating those two is you can reuse and test _domain state_ universally, and you might very well reuse it in other applications. ## Domain Stores @@ -88,8 +26,9 @@ These stores store the data your application is all about. Todo items, users, books, movies, orders, you name it. Your application will most probably have at least one domain store. -A single domain store should be responsible for a single concept in your application. -However a single concept might take the form of multiple subtypes and it is often a (cyclic) tree structure. +A single domain store should be responsible for a single concept in your application. A single store is often organized as a tree structure with +multiple domain objects inside. + For example: one domain store for your products, and one for your orders and orderlines. As a rule of thumb: if the nature of the relationship between two items is containment, they should typically be in the same store. So a store just manages _domain objects_. @@ -110,12 +49,11 @@ These are the responsibilities of a store: ### Domain objects Each domain object should be expressed using its own class (or constructor function). -It is recommended to store your data in _denormalized_ form. There is no need to treat your client-side application state as some kind of database. Real references, cyclic data structures and instance methods are powerful concepts in JavaScript. Domain objects are allowed to refer directly to domain objects from other stores. Remember: we want to keep our actions and views as simple as possible and needing to manage references and doing garbage collection yourself might be a step backward. -Unlike many Flux architectures, with MobX there is no need to normalize your data, and this makes it a lot simpler to build the _essentially_ complex parts of your application: +Unlike many Flux architectures such as Redux, with MobX there is no need to normalize your data, and this makes it a lot simpler to build the _essentially_ complex parts of your application: your business rules, actions and user interface. Domain objects can delegate all their logic to the store they belong to if that suits your application well. @@ -133,16 +71,17 @@ It is possible to express your domain objects as plain objects, but classes have ### Example domain store ```javascript -import { observable, autorun } from "mobx" +import { makeAutoObservable, autorun, runInAction } from "mobx" import uuid from "node-uuid" export class TodoStore { authorStore transportLayer - @observable todos = [] - @observable isLoading = true + todos = [] + isLoading = true constructor(transportLayer, authorStore) { + makeAutoObservable(this) this.authorStore = authorStore // Store that can resolve authors for us this.transportLayer = transportLayer // Thing that can make server requests for us this.transportLayer.onReceiveTodoUpdate(updatedTodo => @@ -158,7 +97,9 @@ export class TodoStore { this.isLoading = true this.transportLayer.fetchTodos().then(fetchedTodos => { fetchedTodos.forEach(json => this.updateTodoFromServer(json)) - this.isLoading = false + runInAction(() => { + this.isLoading = false + }) }) } @@ -168,7 +109,7 @@ export class TodoStore { * or remove a todo if it has been deleted on the server. */ updateTodoFromServer(json) { - var todo = this.todos.find(todo => todo.id === json.id) + const todo = this.todos.find(todo => todo.id === json.id) if (!todo) { todo = new Todo(this, json.id) this.todos.push(todo) @@ -184,7 +125,7 @@ export class TodoStore { * Creates a fresh todo on the client and server */ createTodo() { - var todo = new Todo(this) + const todo = new Todo(this) this.todos.push(todo) return todo } @@ -198,19 +139,20 @@ export class TodoStore { } } +// domain object Todo export class Todo { /** * unique id of this todo, immutable. */ id = null - @observable completed = false - @observable task = "" + completed = false + task = "" /** * reference to an Author object (from the authorStore) */ - @observable author = null + author = null store = null @@ -227,6 +169,12 @@ export class Todo { saveHandler = null constructor(store, id = uuid.v4()) { + makeAutoObservable(this, { + id: false, + store: false, + autoSave: false, + saveHandler: false + }) this.store = store this.id = id @@ -250,7 +198,7 @@ export class Todo { this.store.removeTodo(this) } - @computed get asJson() { + get asJson() { return { id: this.id, completed: this.completed, @@ -278,7 +226,66 @@ export class Todo { } ``` -# Combining multiple stores +## UI stores + +The _ui-state-store_ is often very specific for your application, but usually very simple as well. +This store typically doesn't have much logic in it, but will store a plethora of loosely coupled pieces of information about the UI. +This is ideal as most applications will change the UI state often during the development process. + +Things you will typically find in UI stores: + +- Session information +- Information about how far your application has loaded +- Information that will not be stored in the backend +- Information that affects the UI globally + - Window dimensions + - Accessibility information + - Current language + - Currently active theme +- User interface state as soon as it affects multiple, further unrelated components: + - Current selection + - Visibility of toolbars, etc. + - State of a wizard + - State of a global overlay + +It might very well be that these pieces of information start as internal state of a specific component (for example the visibility of a toolbar). +But after a while you discover that you need this information somewhere else in your application. +Instead of pushing state in such a case upwards in the component tree, like you would do in plain React apps, you just move that state to the _ui-state-store_. + +For isomorphic applications you might also want to provide a stub implementation of this store with sane defaults so that all components render as expected. +You might distribute the _ui-state-store_ through your application by passing it as React context. + +Example of a store (using ES6 syntax): + +```javascript +import { makeAutoObservable, observable, computed, asStructure } from "mobx" +import jquery from "jquery" + +export class UiState { + language = "en_US" + pendingRequestCount = 0 + + // .struct makes sure observer won't be signaled unless the + // dimensions object changed in a deepEqual manner + windowDimensions = { + width: jquery(window).width(), + height: jquery(window).height() + } + + constructor() { + makeAutoObservable(this, { windowDimensions: observable.struct }) + jquery.resize(() => { + this.windowDimensions = getWindowDimensions() + }) + } + + get appIsInSync() { + return this.pendingRequestCount === 0 + } +} +``` + +## Combining multiple stores An often asked question is how to combine multiple stores without using singletons. How will they know about each other? @@ -310,12 +317,14 @@ class UserStore { } class TodoStore { - @observable todos = [] + todos = [] + rootStore constructor(rootStore) { + makeAutoObservable(this, { rootStore: false }) this.rootStore = rootStore } } ``` -When using React, this root store is typically inserted into the component tree by using `` +When using React, this root store is typically inserted into the component tree by using React context. diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 632025d90..1ece264cf 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,10 +1,10 @@ --- -title: configure -sidebar_label: configure +title: Configuring MobX +sidebar_label: Configuring MobX hide_title: true --- -# `configure` +# Configuring MobX Usage: diff --git a/website/i18n/en.json b/website/i18n/en.json index 40ac763c6..d36464d30 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -109,8 +109,8 @@ "sidebar_label": "computed" }, "refguide/configure": { - "title": "configure", - "sidebar_label": "configure" + "title": "Configuring MobX", + "sidebar_label": "Configuring MobX" }, "refguide/extend-observable": { "title": "refguide/extend-observable", diff --git a/website/sidebars.json b/website/sidebars.json index 65144b5a1..2103cf9ac 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -56,10 +56,10 @@ "refguide/mobx-utils" ], "Tips & Tricks": [ + "best/store", "refguide/configure", - "best/limitations-without-proxies", "best/decorators", - "best/store" + "best/limitations-without-proxies" ], "Extending MobX": [ "refguide/extending", From bef61e57af09aba6dd7920031b2456b0edd51b7a Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:14:01 +0200 Subject: [PATCH 0434/1043] Tweak the text. --- docs/best/store.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/best/store.md b/docs/best/store.md index ebe4326eb..2eeefb539 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -10,7 +10,7 @@ This section contains some best practices we discovered at Mendix while working This section is opinionated and you are in no way forced to apply these practices. There are many ways of working with MobX and React, and this is just one of them. -This section focuses on an unobtrusive way of working with MobX, which works well in existing code bases, or with classic MVC patterns. An alternative, more opinionated way of organizing stores is using [mobx-state-tree](https://github.com/mobxjs/mobx-state-tree) or [mobx-keystone](https://mobx-keystone.js.org/). Both ship with cool features as structurally shared snapshots, action middlewares, JSON patch support etc out of the box. +This section focuses on an unobtrusive way of working with MobX, which works well in existing code bases, or with classic MVC patterns. Alternative, more opinionated ways of organizing stores are [mobx-state-tree](https://github.com/mobxjs/mobx-state-tree) and [mobx-keystone](https://mobx-keystone.js.org/). Both ship with cool features as structurally shared snapshots, action middlewares, JSON patch support etc out of the box. ## Stores From 95e6ae9715919567b5a1029a9f8a228097241eec Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:15:02 +0200 Subject: [PATCH 0435/1043] dispose isn't an action either. --- docs/best/store.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/best/store.md b/docs/best/store.md index 2eeefb539..d576949ea 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -164,7 +164,7 @@ export class Todo { /** * Disposer for the side effect that automatically - * stores this Todo, see @dispose. + * stores this Todo, see dispose. */ saveHandler = null @@ -173,7 +173,8 @@ export class Todo { id: false, store: false, autoSave: false, - saveHandler: false + saveHandler: false, + dispose: false }) this.store = store this.id = id From 4a8fac12124cff22370a7e08359f0535bd048b3a Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:32:56 +0200 Subject: [PATCH 0436/1043] Introduce the atom symbol to mark "this is advanced". --- docs/faq/faq.md | 69 ++++++++++++++++++++------------------- docs/intro/how-to-read.md | 13 ++++++++ website/i18n/en.json | 4 +++ website/sidebars.json | 1 + 4 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 docs/intro/how-to-read.md diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 6d8241bf6..1b09369c4 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -14,22 +14,12 @@ There are some [limitations](../best/limitations-without-proxies.md) for environments that do not support `Proxy` (modern browsers all support `Proxy`). -##### How does MobX compare to other Reactive frameworks? - -See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. - ##### Is MobX a framework? MobX gives you a lot of freedom in how you structure your code, where to store state or how to process events. It might free you from frameworks that pose all kinds of restrictions on your code in the name of performance. For state management frameworks built with MobX that offer advanced features, see [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/). -##### Can I record states and re-hydrate them? - -[mobx-state-tree](https://mobx-state-tree.js.org/intro/philosophy) and [mobx-keystone](https://mobx-keystone.js.org/) can do this for you. - -To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) for some examples. - ##### Is React Native supported? Yes, `mobx` and `mobx-react` will work on React Native. The latter through importing `"mobx-react/native"`. @@ -39,26 +29,51 @@ The devtools don't support React Native. We've compiled a large list of helpful resources of all types in the [official awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx). If you feel it's missing something, please open an [issue](https://github.com/mobxjs/awesome-mobx/issues/new) or [pull request](https://github.com/mobxjs/awesome-mobx/compare) to describe what you're looking for or share your added links :). +#### Does MobX have TypeScript support? + +It works out of the box. MobX is written with TypeScript and type definitions are built-in. + +#### Does MobX have Flow typing support? + +MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. + +To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js) shipped with MobX: + +- In `.flowconfig`, you **cannot** ignore `node_modules`. +- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. +- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). + +##### Can I combine MobX with Flux / Redux? + +You don't need to. + +MobX already optimizes rendering, and it works with most kinds of data, including cycles and classes. So other programming paradigms like classic MVC can now be easily applied in applications that combine ReactJS with MobX. + +[⚛️] Flux implementations that do not work with the requirement that the data in their stores is immutable should work well with MobX. Redux does have this immutability requirement. Note that both mobx-state-tree and mobx-keystone add additional constraints to support better integration with Redux. + +##### How does MobX compare to other Reactive frameworks? + +[⚛️] See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. + +##### Can I record states and re-hydrate them? + +The frameworks built on top of MobX [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/) can both do this for you. + +[⚛️] To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) has some examples. + ##### Can MobX be combined with RxJS? -Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. +[⚛️] Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. ##### When to use RxJS instead of MobX? -For anything that involves explictly working with the concept of time, +[⚛️] For anything that involves explictly working with the concept of time, or when you need to reason about the historical values / events of an observable (and not just the latest), RxJs is recommended as it provides more low-level primitives. Whenever you want to react to _state_ instead of _events_, MobX offers an easier and more high-level approach. In practice, combining RxJS and MobX might result in really powerful constructions. Use for example RxJS to process and throttle user events and as a result of that update the state. If the state has been made observable by MobX, it will then take care of updating the UI and other derivations accordingly. -##### Can I combine MobX with Flux? - -Flux implementations that do not work on the assumption that the data in their stores is immutable should work well with MobX. -However, the need for Flux is reduced when using MobX. -MobX already optimizes rendering, and it works with most kinds of data, including cycles and classes. -So other programming paradigms like classic MVC can now be easily applied in applications that combine ReactJS with MobX. - ##### Can I use MobX together with framework X? Probably. @@ -68,13 +83,9 @@ MobX works just as well server side, and is already combined with jQuery (see th ##### Can you tell me how it works? -Sure, join the reactiflux channel or checkout the code. Or, submit an issue to motivate me to make some nice drawings :). +[⚛️] Sure, join the [gitter chat](https://gitter.im/mobxjs/mobx) or check out the code. Or, submit an issue to motivate me to make some nice drawings :). And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). -#### Does MobX have TypeScript support? - -It works out of the box. MobX is written with TypeScript and type definitions are built-in. - ##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: @@ -99,13 +110,3 @@ This is incorrect but will not always immediately lead to runtime errors. So be // correct import { observable } from "mobx" ``` - -#### Does MobX have Flow typing support? - -MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. - -To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js) shipped with MobX: - -- In `.flowconfig`, you **cannot** ignore `node_modules`. -- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md new file mode 100644 index 000000000..6c0f890db --- /dev/null +++ b/docs/intro/how-to-read.md @@ -0,0 +1,13 @@ +--- +title: How to read this documentation +sidebar_label: How to read this documentation +hide_title: true +--- + +# How to read this documentation + +The documentation follows the principle that the most commonly used concepts are +introduced before specialized information. This applies to the headings in the table +of concepts as well as the pages under those headings. + +We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [⚛️] marker. Feel free to skip them and move on to the next section! diff --git a/website/i18n/en.json b/website/i18n/en.json index d36464d30..3d3fd5123 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -45,6 +45,10 @@ "title": "Concepts & Principles", "sidebar_label": "Concepts & Principles" }, + "intro/how-to-read": { + "title": "How to read this documentation", + "sidebar_label": "How to read this documentation" + }, "intro/installation": { "title": "Installation", "sidebar_label": "Installation" diff --git a/website/sidebars.json b/website/sidebars.json index 2103cf9ac..3bce92f96 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -5,6 +5,7 @@ "intro/installation", "intro/overview", "intro/concepts", + "intro/how-to-read", "faq/faq" ], "MobX and React": [ From 25bda91b5540ba67ef12e383242a37995bc659f6 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:33:35 +0200 Subject: [PATCH 0437/1043] Move typescript stuff up. --- docs/faq/faq.md | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 1b09369c4..94f765a55 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -33,6 +33,31 @@ We've compiled a large list of helpful resources of all types in the [official a It works out of the box. MobX is written with TypeScript and type definitions are built-in. +##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` + +Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: + +- ES5 target: DOM,ES5,ScriptHost +- ES6 target: DOM,ES6,DOM.Iterable,ScriptHost + +So you'd need to add `es2018.asynciterable` to those defaults in this particular case. + +#### Importing from wrong location + +Because MobX ships with typescript typings out of the box, some import autocompleting tools (at least in VSCode) have the habit of auto completing with a wrong import, like + +```javascript +// wrong +import { observable } from "mobx/lib/mobx" +``` + +This is incorrect but will not always immediately lead to runtime errors. So be aware. The only correct way of importing anything from the `mobx` package is: + +```javascript +// correct +import { observable } from "mobx" +``` + #### Does MobX have Flow typing support? MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. @@ -85,28 +110,3 @@ MobX works just as well server side, and is already combined with jQuery (see th [⚛️] Sure, join the [gitter chat](https://gitter.im/mobxjs/mobx) or check out the code. Or, submit an issue to motivate me to make some nice drawings :). And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). - -##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` - -Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: - -- ES5 target: DOM,ES5,ScriptHost -- ES6 target: DOM,ES6,DOM.Iterable,ScriptHost - -So you'd need to add `es2018.asynciterable` to those defaults in this particular case. - -#### Importing from wrong location - -Because MobX ships with typescript typings out of the box, some import autocompleting tools (at least in VSCode) have the habit of auto completing with a wrong import, like - -```javascript -// wrong -import { observable } from "mobx/lib/mobx" -``` - -This is incorrect but will not always immediately lead to runtime errors. So be aware. The only correct way of importing anything from the `mobx` package is: - -```javascript -// correct -import { observable } from "mobx" -``` From 3e04d0d812a72472527f36e7c3b34046e00bd3ad Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Wed, 8 Jul 2020 17:38:30 +0200 Subject: [PATCH 0438/1043] Start marking stuff with atom. --- docs/react/react-class-components.md | 8 +++++--- docs/react/react-performance.md | 4 +++- docs/refguide/action.md | 6 +++--- docs/refguide/computed-behavior.md | 7 +------ docs/refguide/computed-options.md | 2 +- docs/refguide/computed.md | 5 ++--- docs/refguide/configure.md | 2 +- 7 files changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index 0fb270597..b1f55ba64 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -117,7 +117,9 @@ class Profile extends React.Component { The previous example looks a bit cumbersome. We recommended switching class components to function components if you can, and to use `useState` for maintaining -simple state. But decorators are still supported -- here is the same example with +simple state. + +[⚛️] But decorators are still supported -- here is the same example with decorators: ```javascript @@ -153,9 +155,9 @@ class TimerView extends React.Component { You can read more about [decorator support in MobX][../best/decorators.md], including how to enable them. -### Don't decorate (some) React lifecycle methods as `action.bound` on `observer` React components +### Don't mark (some) React lifecycle methods as `action.bound` on `observer` React components -If you modify any observable data in method in your React component, that method +[⚛️] If you modify any observable data in method in your React component, that method should be marked as an `action`. For event handlers, `action.bound` is handy, as `this` then refers to the instance your component class. diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md index 34ed138df..4be525e26 100644 --- a/docs/react/react-performance.md +++ b/docs/react/react-performance.md @@ -6,7 +6,9 @@ hide_title: true # Optimizing rendering React components -MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). But here are some tips to get most out of React and MobX. Most tips apply to React in general and are not specific for MobX. +MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). + +But here are some tips to get most out of React and MobX. Most tips apply to React in general and are not specific for MobX. Note that while it's good to be aware of these patterns, usually your application will be fast enough if you don't worry about them at all. Prioritize performance only diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 504baf6f6..09f016cc3 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -64,7 +64,7 @@ are asynchronous. See [asynchronous actions](../best/actions.md). ## action.bound -The `action` function follows the normal rules for binding in JavaScript. +[⚛️] The `action` function follows the normal rules for binding in JavaScript. However, `action.bound` can be used to automatically bind actions to the targeted object. This ensures that `this` points to the right object when you use the action as a callback later. @@ -91,7 +91,7 @@ setInterval(ticker.increment, 1000) ## bound arrow functions -You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: +[⚛️] You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: ```javascript class Ticker { @@ -121,5 +121,5 @@ Returns `true` if the given function is marked as an `action`. ## Disabling mandatory actions -By default, MobX 6 and later require that you use actions to make state changes. +[⚛️] By default, MobX 6 and later require that you use actions to make state changes. You can however configure MobX to disable this behavior, see [`enforceActions`](configure.md#enforceactions). diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index b54c4af7c..bc7546f69 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -6,8 +6,7 @@ hide_title: true # How `computed` works -Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, -but is useful to know if something unexpected happens. +[⚛️] Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. ## Computed values run more often than expected @@ -125,7 +124,3 @@ var disposer = upperCaseName.observe(change => console.log(change.newValue)) name.set("Dave") // prints: 'DAVE' ``` - -``` - -``` diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index ddd94370c..8549a2e9b 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -6,7 +6,7 @@ hide_title: true # Options for computed -Usually `computed` behaves the way you want it to out of the box, but +[⚛️] Usually `computed` behaves the way you want it to out of the box, but it's possible to customize its behavior by passing in an `options` argument: - `name`: String, the debug name used in spy and the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 8803fa37f..6dac3e0ec 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -112,8 +112,7 @@ _Note: always define the setter *after* the getter, some TypeScript versions are ## Computed with arguments -Sometimes you might want to have a computed value that takes one or more arguments. -In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: +[⚛️] Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: ```javascript import { observable } from "mobx" @@ -154,5 +153,5 @@ Returns `true` if the designated property is a computed value. ## More about computed -You can pass [options into `computed`](computed-options.md). If you experience +[⚛️] You can pass [options into `computed`](computed-options.md). If you experience unexpected behavior, you can also read more about the [detailed behavior of `computed`](computed-behavior.md). diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 1ece264cf..81a8074d4 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -6,7 +6,7 @@ hide_title: true # Configuring MobX -Usage: +[⚛️] Usage: - `configure(options)`. From 15059bed0783bf6c382fa07e7221c0ddeccef189 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 6 Jul 2020 21:19:16 +0100 Subject: [PATCH 0439/1043] made strict mode the default --- notes.md | 7 +++--- package.json | 3 +++ src/api/decorators.ts | 2 +- src/core/globalstate.ts | 2 +- src/types/dynamicobject.ts | 1 - src/types/observablemap.ts | 1 - test/setup.js | 8 +++++++ test/v4/mobx4.ts | 3 ++- test/v5/base/babel-tests.js | 40 +++++++++++++++++++++++++++++++ test/v5/base/strict-mode.js | 13 ++++++---- test/v5/base/typescript-tests.ts | 41 ++++++++++++++++++++++++++++++++ 11 files changed, 109 insertions(+), 12 deletions(-) create mode 100644 test/setup.js diff --git a/notes.md b/notes.md index c505d55fa..2f24e3f59 100644 --- a/notes.md +++ b/notes.md @@ -48,10 +48,11 @@ - [x] at startup, test presence of Map, Symbol ownPropertySymboles and other globals! - [x] verify: action called from computed throws? - [x] apply deprecation of find and findIndex error - - [ ] verify perf / memory changes + - [x] verify perf / memory changes -> general perf is similar (< 10% slower, class instanation is twice as slow...!?). Not sure if that is a problem or the result of difference in babel config in the first place (e.g. define props) - [x] investigate skipped tests - - [ ] process TODO's - - [ ] weakmap for hasMaps in Map (and Set?) + - [x] process TODO's + - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html + - [x] ~weakmap for hasMaps in Map (and Set?)~ no: that would only works for objectish keys which is an exception and would require separate map collection - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - [ ] include #2343 - [ ] default observable requires reaction? diff --git a/package.json b/package.json index 5deb9a3f2..71c7b6e26 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,9 @@ "tsConfig": "tsconfig.test.json" } }, + "setupFilesAfterEnv": [ + "/test/setup.js" + ], "transform": { "^.+\\.tsx?$": "ts-jest", "^.+\\.jsx?$": "babel-jest" diff --git a/src/api/decorators.ts b/src/api/decorators.ts index 198c97c61..6b2d418b3 100644 --- a/src/api/decorators.ts +++ b/src/api/decorators.ts @@ -64,7 +64,7 @@ export function storeDecorator( export function applyDecorators(target: Object): boolean { let current = target - // TODO optimization: this can be cached per prototype! + // optimization: this could be cached per prototype! // (then we can remove the weird short circuiting as well..) let annotations: AnnotationsMap[] = [] while (current && current !== objectPrototype) { diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 78fee4d1f..785c60e83 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -89,7 +89,7 @@ export class MobXGlobals { /** * If strict mode is enabled, state changes are by default not allowed */ - enforceActions: boolean | "always" = false // TODO: change to true + enforceActions: boolean | "always" = true /** * Spy callbacks diff --git a/src/types/dynamicobject.ts b/src/types/dynamicobject.ts index 85818c9ee..13106ff16 100644 --- a/src/types/dynamicobject.ts +++ b/src/types/dynamicobject.ts @@ -31,7 +31,6 @@ const objectProxyTraps: ProxyHandler = { if (isStringish(name)) return adm.has_(name) return (name as any) in target }, - // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html get(target: IIsObservableObject, name: PropertyKey) { if (name === $mobx || name === "constructor") return target[name] const adm = getAdm(target) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index ea8f62827..13fdf5edc 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -116,7 +116,6 @@ export class ObservableMap let entry = this.hasMap_.get(key) if (!entry) { - // TODO: replace with atom (breaking change) const newEntry = (entry = new ObservableValue( this.has_(key), referenceEnhancer, diff --git a/test/setup.js b/test/setup.js new file mode 100644 index 000000000..221e45bdf --- /dev/null +++ b/test/setup.js @@ -0,0 +1,8 @@ +import { configure, _resetGlobalState } from "../src/mobx" + +beforeEach(() => { + _resetGlobalState() + configure({ + enforceActions: "never" + }) +}) diff --git a/test/v4/mobx4.ts b/test/v4/mobx4.ts index 6719a5aa2..f6c0134ee 100644 --- a/test/v4/mobx4.ts +++ b/test/v4/mobx4.ts @@ -1,7 +1,8 @@ import { configure } from "../../src/mobx" configure({ - useProxies: "never" + useProxies: "never", + enforceActions: "never" }) export * from "../../src/mobx" diff --git a/test/v5/base/babel-tests.js b/test/v5/base/babel-tests.js index 0bd4be3c7..6bc2b7da7 100644 --- a/test/v5/base/babel-tests.js +++ b/test/v5/base/babel-tests.js @@ -562,6 +562,46 @@ test.skip("observable performance - babel", () => { console.log("changed in ", Date.now() - start) }) +test.skip("observable performance - babel - decorators", () => { + const AMOUNT = 100000 + + class A { + @observable + a = 1 + @observable + b = 2 + @observable + c = 3 + + constructor() { + makeObservable(this) + } + + @computed + get d() { + return this.a + this.b + this.c + } + } + + const objs = [] + const start = Date.now() + + for (let i = 0; i < AMOUNT; i++) objs.push(new A()) + + console.log("created in ", Date.now() - start) + + for (let j = 0; j < 4; j++) { + for (let i = 0; i < AMOUNT; i++) { + const obj = objs[i] + obj.a += 3 + obj.b *= 4 + obj.c = obj.b - obj.a + obj.d + } + } + + console.log("changed in ", Date.now() - start) +}) test("unbound methods", () => { class A { constructor() { diff --git a/test/v5/base/strict-mode.js b/test/v5/base/strict-mode.js index 8472a3b68..3138f91d8 100644 --- a/test/v5/base/strict-mode.js +++ b/test/v5/base/strict-mode.js @@ -7,6 +7,10 @@ const { makeObservable } = mobx const strictError = /Since strict-mode is enabled, changing observed observable values outside actions is not allowed./ +beforeEach(() => { + mobx.configure({ enforceActions: "observed" }) +}) + test("strict mode should not allow changes outside action", () => { const a = mobx.observable.box(2) mobx.configure({ enforceActions: "observed" }) @@ -166,11 +170,12 @@ test("can create objects in strict mode with action", () => { map.set("b", 4) map.delete("a") })() - - mobx.configure({ enforceActions: "never" }) }) test("strict mode checks", function () { + mobx.configure({ + enforceActions: "never" + }) const x = mobx.observable.box(3) const d = mobx.autorun(() => x.get()) @@ -323,7 +328,7 @@ describe("observableRequiresReaction", function () { test("don't warn on autorun tracks invalidation of unbound dependencies", function () { // #2195 try { - mobx.configure({ observableRequiresReaction: true }) + mobx.configure({ observableRequiresReaction: true, enforceActions: "never" }) const a = mobx.observable.box(0) const b = mobx.observable.box(0) const c = mobx.computed(() => a.get() + b.get()) @@ -347,7 +352,7 @@ describe("observableRequiresReaction", function () { test("don't warn on autorun tracks invalidation of unbound dependencies - also with action", function () { // #2195 try { - mobx.configure({ observableRequiresReaction: true }) + mobx.configure({ observableRequiresReaction: true, enforceActions: "never" }) const a = mobx.observable.box(0) const b = mobx.observable.box(0) const c = mobx.computed(() => a.get() + b.get()) diff --git a/test/v5/base/typescript-tests.ts b/test/v5/base/typescript-tests.ts index 8a29326b2..8079322bc 100644 --- a/test/v5/base/typescript-tests.ts +++ b/test/v5/base/typescript-tests.ts @@ -778,6 +778,47 @@ test.skip("observable performance - ts", () => { console.log("changed in ", Date.now() - start) }) +test.skip("observable performance - ts - decorators", () => { + const AMOUNT = 100000 + + class A { + @observable + a = 1 + @observable + b = 2 + @observable + c = 3 + + constructor() { + makeObservable(this) + } + + @computed + get d() { + return this.a + this.b + this.c + } + } + + const objs: any[] = [] + const start = Date.now() + + for (let i = 0; i < AMOUNT; i++) objs.push(new A()) + + console.log("created in ", Date.now() - start) + + for (let j = 0; j < 4; j++) { + for (let i = 0; i < AMOUNT; i++) { + const obj = objs[i] + obj.a += 3 + obj.b *= 4 + obj.c = obj.b - obj.a + obj.d + } + } + + console.log("changed in ", Date.now() - start) +}) + test("unbound methods", () => { class A { constructor() { From c463d28f709955bb2ce3817f8393a433a20d0fe3 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 8 Jul 2020 22:46:07 +0100 Subject: [PATCH 0440/1043] fixed flow typings --- flow-typed/mobx.js | 21 +++++++++++++-------- notes.md | 14 +++++++++----- src/api/configure.ts | 1 - src/api/makeObservable.ts | 4 ++-- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index e1021adc8..b064ba204 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -3,7 +3,7 @@ export type IObservableMapInitialValues = IMapEntries | KeyValueMap | IMap export interface IMobxConfigurationOptions { - +enforceActions?: boolean | "strict" | "never" | "always" | "observed"; + +enforceActions?: "never" | "always" | "observed"; computedRequiresReaction?: boolean; /** * (Experimental) @@ -17,8 +17,8 @@ export interface IMobxConfigurationOptions { observableRequiresReaction?: boolean; isolateGlobalState?: boolean; disableErrorBoundaries?: boolean; - arrayBuffer?: number; reactionScheduler?: (f: () => void) => void; + useProxies?: "always" | "never" | "ifavailable"; } declare export function configure(options: IMobxConfigurationOptions): void @@ -268,6 +268,7 @@ export type CreateObservableOptions = { declare export class IObservableFactories { box(value?: T, options?: CreateObservableOptions): IObservableValue; array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray; + set(initialValues?: V[], options?: CreateObservableOptions): Set; map( initialValues?: IObservableMapInitialValues, options?: CreateObservableOptions @@ -288,6 +289,11 @@ declare export class IObservableFactories { property?: string, descriptor?: PropertyDescriptor<*> ): IObservableDecorator; + struct( + target: Object, + property?: string, + descriptor?: PropertyDescriptor<*> + ): IObservableDecorator; } export interface Lambda { @@ -373,6 +379,10 @@ declare export function extendObservable( options?: any ): A & B +declare export function makeObservable(target: A, annotations?: any, options: any): A + +declare export function makeAutoObservable(target: A, exceptions?: any, options: any): A + declare export function intercept( object: Object, property: string, @@ -434,12 +444,7 @@ declare export function observe( fireImmediately?: boolean ): Lambda -export interface ToJSOptions { - detectCycles?: boolean; - exportMapsAsObjects?: boolean; -} - -declare export function toJS(source: T, options?: ToJSOptions): T +declare export function toJS(source: T): T declare export function untracked(action: () => T): T diff --git a/notes.md b/notes.md index 2f24e3f59..338c5fbde 100644 --- a/notes.md +++ b/notes.md @@ -53,17 +53,19 @@ - [x] process TODO's - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html - [x] ~weakmap for hasMaps in Map (and Set?)~ no: that would only works for objectish keys which is an exception and would require separate map collection - - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - - [ ] include #2343 + - [x] include #2343 - [ ] default observable requires reaction? - [x] kill globalstate options? - [ ] no binding by default? https://twitter.com/getify/status/1258137826241241088 - - [ ] kill / fix flow types - - [ ] enable search on docs - - [ ] Would be awesome, but no idea how to go about that :) We could maybe at random places (e.g in observableValue) check in DEV mode if a value is a class instance with decorators, but with undecorated members. Might be a bit of a performance bummer though. + - [x] kill / fix flow types + - [x] enable search on docs + - [ ] update ad links + - [ ] fix https://github.com/mobxjs/mobx/issues/2394 - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable +- [ ] post 6.0 + - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 ## Docs / migration guide @@ -128,6 +130,8 @@ Why declare fields * [ ] Breaking: sorting or reversing an array in an actino will no sort or reverse the source array rather than shallow copy. * Fixed #2326 * Fixed #2379 +* [ ] Breaking: strict mode defaults to observed now +* [ ] killed option `computedConfigurable` as it was the default already ## NOTES diff --git a/src/api/configure.ts b/src/api/configure.ts index 0b6b9370a..ff74dd69c 100644 --- a/src/api/configure.ts +++ b/src/api/configure.ts @@ -16,7 +16,6 @@ export function configure(options: { * Warn if observables are accessed outside a reactive context */ observableRequiresReaction?: boolean - computedConfigurable?: boolean isolateGlobalState?: boolean disableErrorBoundaries?: boolean reactionScheduler?: (f: () => void) => void diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index 0b7d344da..e51bfe6e3 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -163,7 +163,7 @@ export function makeObservable, options?: CreateObservableOptions -) { +): T { const adm = asObservableObject( target, options?.name, @@ -177,7 +177,7 @@ export function makeObservable { let annotation = annotations[key] From b4832b6f7c0018c970fb2028ddf4336e8c4d4503 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 14:16:25 +0200 Subject: [PATCH 0441/1043] Fix language. --- docs/refguide/observable.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index b69145d3d..9cbd5f879 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -63,4 +63,4 @@ Works for all observables, computed values and disposer functions of reactions. ### Type-specific APIs -MobX also exposes `isObservable*`, like `isObservableArray` and so on to expect for specific observables. +MobX also exposes `isObservable*`, like `isObservableArray` and so on to check for specific observables. From a13c7c5d8b23828018339fe8ed1f865d72cfe81c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 14:57:44 +0200 Subject: [PATCH 0442/1043] Atom marker for complex stuff. Slight reorganization of toc. --- docs/best/decorators.md | 5 ++- docs/best/limitations-without-proxies.md | 5 ++- docs/best/what-does-mobx-react-to.md | 3 +- docs/intro/how-to-read.md | 26 +++++++++++++- docs/react/react-performance.md | 2 +- docs/refguide/boxed.md | 4 +-- docs/refguide/computed-behavior.md | 6 ++-- docs/refguide/computed-options.md | 7 ++-- docs/refguide/configure.md | 6 ++-- docs/refguide/extend-observable.md | 7 ++-- docs/refguide/extending.md | 5 ++- docs/refguide/internals.md | 4 +-- docs/refguide/introspection-utils.md | 2 +- docs/refguide/mobx-utils.md | 4 +-- docs/refguide/modifiers.md | 4 +-- docs/refguide/object-api.md | 5 ++- docs/refguide/object.md | 2 +- docs/refguide/observable.md | 2 +- docs/refguide/observe.md | 5 ++- docs/refguide/on-become-observed.md | 4 +-- docs/refguide/spy.md | 4 +-- website/i18n/en.json | 44 ++++++++++++------------ website/sidebars.json | 8 ++--- 23 files changed, 90 insertions(+), 74 deletions(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 1e93a2340..85be3bff6 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,10 +1,9 @@ --- -sidebar_label: Decorators in MobX -title: Decorators in MobX +sidebar_label: Decorators in MobX [⚛️] hide_title: true --- -# Decorators in MobX +# Decorators in MobX [⚛️] MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 5c39a9ec7..2d0eea6c7 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -1,10 +1,9 @@ --- -title: Limitations without Proxy support -sidebar_label: Limitations without Proxy support +sidebar_label: Limitations without Proxy [⚛️] hide_title: true --- -# Limitations without Proxy support +# Limitations without Proxy support [⚛️] MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy), there are some limitations: diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 620820f8b..9998fa265 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -1,6 +1,5 @@ --- -title: What does MobX react to? -sidebar_label: Understanding what MobX reacts to +sidebar_label: Understanding MobX hide_title: true --- diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index 6c0f890db..59702e0f0 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -10,4 +10,28 @@ The documentation follows the principle that the most commonly used concepts are introduced before specialized information. This applies to the headings in the table of concepts as well as the pages under those headings. -We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [⚛️] marker. Feel free to skip them and move on to the next section! +We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [⚛️] marker. You can use MobX very effectively without knowing about them, so feel free to skip them and move on to the next section! + +## Guided tour + +To get an overall idea of how to use MobX with React, read through this _Basics_ section, in particular [The gist of MobX](overview.md) and [Concepts & Principles](concepts.md). These introduce the most important principles and patterns. You should actually be ready to use MobX once you read this! + +Here are a few suggestions about the next things to read: + +- [React integration](../react/react-integration.md). + +- [`makeObservable` / `makeAutoObservable`](../refguide/make-observable.md). + +- Scan through the rules of [`observable`](../refguide/observable.md). + +- It's also useful to at scan through the sections on [observable arrays](../refguide/array.md) and [observable maps](../refguide/map.md) to see what extra methods are available beyond the built-in JS `Array` and `Map` + +- Learn about [action](../refguide/action.md). Read the discussion about [asynchronous actions](../best/actions.md). + +- Read about [`autorun`](../refguide/autorun.md), if only because it's used in examples. + +- To get some ideas on how to organize your application's data stores, read [Defining data stores](../best/store.md). + +- If the behavior of MobX confuses you, it's useful to read [What does MobX react to?](../best/what-does-mobx-react-do.md). + +This should give you a good grounding in day-to-day use of MobX. There is plenty more available you can then read at your own leisure. diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md index 4be525e26..3faeb85a9 100644 --- a/docs/react/react-performance.md +++ b/docs/react/react-performance.md @@ -88,7 +88,7 @@ There is nothing wrong with the latter, but a change in the `name` property will ### Function props -You may notice that to deference values late you have to create lots of small observer components where eachis customized to render some different part of data, for example: +[⚛️] You may notice that to deference values late you have to create lots of small observer components where each is customized to render some different part of data, for example: ```javascript const PersonNameDisplayer = observer(({ person }) => ) diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index 36c497449..64f8eb286 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -1,10 +1,10 @@ --- title: Observable Boxes -sidebar_label: boxes +sidebar_label: boxes [⚛️] hide_title: true --- -# Observable Boxes +# Observable Boxes [⚛️] Usage: diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index bc7546f69..5c87f6840 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -1,12 +1,12 @@ --- title: How computed works -sidebar_label: How computed works +sidebar_label: How computed works [⚛️] hide_title: true --- -# How `computed` works +# How `computed` works [⚛️] -[⚛️] Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. +Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. ## Computed values run more often than expected diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index 8549a2e9b..f32498476 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -1,13 +1,12 @@ --- title: Options for computed -sidebar_label: Options for computed +sidebar_label: Options for computed [⚛️] hide_title: true --- -# Options for computed +# Options for computed [⚛️] -[⚛️] Usually `computed` behaves the way you want it to out of the box, but -it's possible to customize its behavior by passing in an `options` argument: +Usually `computed` behaves the way you want it to out of the box, but it's possible to customize its behavior by passing in an `options` argument: - `name`: String, the debug name used in spy and the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). - `context`: The `this` that should be used in the provided expression diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 81a8074d4..24b2a6317 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,12 +1,12 @@ --- title: Configuring MobX -sidebar_label: Configuring MobX +sidebar_label: Configuring MobX [⚛️] hide_title: true --- -# Configuring MobX +# Configuring MobX [⚛️] -[⚛️] Usage: +Usage: - `configure(options)`. diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 76c0a3f1a..520b9741e 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -1,16 +1,15 @@ --- -sidebar_label: extendObservable +sidebar_label: extendObservable [⚛️] hide_title: true --- -# extendObservable +# extendObservable [⚛️] Usage: - `extendObservable(target, properties, annotions?, options?)` -ExtendObservable can be used to add observable properties to an existing target object. -All key / value pairs in the `properties` object result in new observable properties on the target initialized to the given value. Any getters in the properties map are turned into computed properties. +`extendObservable` can be used to add observable properties to an existing target object. All key / value pairs in the `properties` object result in new observable properties on the target initialized to the given value. Any getters in the properties map are turned into computed properties. The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](make-observable.md). The difference between `extendObservable` and `makeAutoObservable` is that `extendObservable` sets properties and declares information about them at the same time. diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 837d29cde..469fe3d82 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,10 +1,9 @@ --- -title: Creating new observable types -sidebar_label: Creating new observable types +sidebar_label: New observable types [⚛️] hide_title: true --- -# Creating new observable types +# Creating new observable types [⚛️] ## Atoms diff --git a/docs/refguide/internals.md b/docs/refguide/internals.md index 53dd9dce8..81aa2bedf 100644 --- a/docs/refguide/internals.md +++ b/docs/refguide/internals.md @@ -1,10 +1,10 @@ --- title: Internal functions -sidebar_label: Internal functions +sidebar_label: Internal functions [⚛️] hide_title: true --- -# Internal functions +# Internal functions [⚛️] The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX. diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md index 772a3f5e8..29ef0fe7d 100644 --- a/docs/refguide/introspection-utils.md +++ b/docs/refguide/introspection-utils.md @@ -35,7 +35,7 @@ Returns a tree structure with all reactions / computations that are observing th ### `getAtom` -Usage: +[⚛️] Usage: - `getAtom(thing, property?)`. diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index c704f094f..07fad21f7 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,9 +1,9 @@ --- title: mobx-utils -sidebar_label: mobx-utils +sidebar_label: mobx-utils [⚛️] hide_title: true --- -# mobx-utils +# mobx-utils [⚛️] [MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions and common patterns for MobX. diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index 606df8e08..6d07a07ef 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,10 +1,10 @@ --- title: Observable modifiers -sidebar_label: Observable modifiers +sidebar_label: Observable modifiers [⚛️] hide_title: true --- -# Observable modifiers +# Observable modifiers [⚛️] When you use `makeObservable`, `makeAutoObservable`, `extendObservable` and `observable.object` you can use annotations to specify how observable properties behave: diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index e380d636b..f96a4a39f 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,10 +1,9 @@ --- -sidebar_label: Object API -title: Object API +sidebar_label: Object API [⚛️] hide_title: true --- -## Object API +## Object API [⚛️] The Object API is a utility API that enables manipulating observable maps, objects and arrays with the same generic API. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 29178a44e..972d1f6f2 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -4,7 +4,7 @@ sidebar_label: objects hide_title: true --- -## Observable Objects +# Observable Objects Usage: diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 9cbd5f879..e21530811 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -34,7 +34,7 @@ For examples of the declarative use of `observable` with `makeObservable`, see [ ## Using `observable` programmatically -You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. +[⚛️] You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. You can't use `observable` to make objects with a prototype observable; as that is the responsibility of its constructor function. Use `makeObservable` or `makeAutoObservable` in its constructor. diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index 1006d56bf..9faf061a2 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -1,10 +1,9 @@ --- -sidebar_label: intercept & observe -title: Intercept & Observe +sidebar_label: intercept & observe [⚛️] hide_title: true --- -# Intercept & Observe +# Intercept & Observe [⚛️] `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). diff --git a/docs/refguide/on-become-observed.md b/docs/refguide/on-become-observed.md index c11da25b0..fa74b1f81 100644 --- a/docs/refguide/on-become-observed.md +++ b/docs/refguide/on-become-observed.md @@ -1,10 +1,10 @@ --- title: onBecomeObserved -sidebar_label: onBecomeObserved +sidebar_label: onBecomeObserved [⚛️] hide_title: true --- -# `onBecomeObserved` and `onBecomeUnobserved` +# `onBecomeObserved` and `onBecomeUnobserved` [⚛️] Usage: diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 45d687ac5..a65423890 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -1,10 +1,10 @@ --- -sidebar_label: spy +sidebar_label: spy [⚛️] title: Spy hide_title: true --- -# Spy +# Spy [⚛️] Usage: diff --git a/website/i18n/en.json b/website/i18n/en.json index 3d3fd5123..1cf9a6912 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -10,16 +10,16 @@ "sidebar_label": "Asynchronous actions" }, "best/decorators": { - "title": "Decorators in MobX", - "sidebar_label": "Decorators in MobX" + "title": "best/decorators", + "sidebar_label": "Decorators in MobX [⚛️]" }, "best/dispose-reactions": { "title": "Always dispose reactions", "sidebar_label": "Always dispose reactions" }, "best/limitations-without-proxies": { - "title": "Limitations without Proxy support", - "sidebar_label": "Limitations without Proxy support" + "title": "best/limitations-without-proxies", + "sidebar_label": "Limitations without Proxy [⚛️]" }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", @@ -34,8 +34,8 @@ "sidebar_label": "Using trace for debugging" }, "best/what-does-mobx-react-to": { - "title": "What does MobX react to?", - "sidebar_label": "Understanding what MobX reacts to" + "title": "best/what-does-mobx-react-to", + "sidebar_label": "Understanding MobX" }, "faq/faq": { "title": "FAQ", @@ -98,15 +98,15 @@ }, "refguide/boxed": { "title": "Observable Boxes", - "sidebar_label": "boxes" + "sidebar_label": "boxes [⚛️]" }, "refguide/computed-behavior": { "title": "How computed works", - "sidebar_label": "How computed works" + "sidebar_label": "How computed works [⚛️]" }, "refguide/computed-options": { "title": "Options for computed", - "sidebar_label": "Options for computed" + "sidebar_label": "Options for computed [⚛️]" }, "refguide/computed": { "title": "computed", @@ -114,15 +114,15 @@ }, "refguide/configure": { "title": "Configuring MobX", - "sidebar_label": "Configuring MobX" + "sidebar_label": "Configuring MobX [⚛️]" }, "refguide/extend-observable": { "title": "refguide/extend-observable", - "sidebar_label": "extendObservable" + "sidebar_label": "extendObservable [⚛️]" }, "refguide/extending": { - "title": "Creating new observable types", - "sidebar_label": "Creating new observable types" + "title": "refguide/extending", + "sidebar_label": "New observable types [⚛️]" }, "refguide/flow": { "title": "flow", @@ -130,7 +130,7 @@ }, "refguide/internals": { "title": "Internal functions", - "sidebar_label": "Internal functions" + "sidebar_label": "Internal functions [⚛️]" }, "refguide/introspection-utils": { "title": "Introspection APIs", @@ -146,15 +146,15 @@ }, "refguide/mobx-utils": { "title": "mobx-utils", - "sidebar_label": "mobx-utils" + "sidebar_label": "mobx-utils [⚛️]" }, "refguide/modifiers": { "title": "Observable modifiers", - "sidebar_label": "Observable modifiers" + "sidebar_label": "Observable modifiers [⚛️]" }, "refguide/object-api": { - "title": "Object API", - "sidebar_label": "Object API" + "title": "refguide/object-api", + "sidebar_label": "Object API [⚛️]" }, "refguide/object": { "title": "Observable Objects", @@ -165,12 +165,12 @@ "sidebar_label": "observable" }, "refguide/observe": { - "title": "Intercept & Observe", - "sidebar_label": "intercept & observe" + "title": "refguide/observe", + "sidebar_label": "intercept & observe [⚛️]" }, "refguide/on-become-observed": { "title": "onBecomeObserved", - "sidebar_label": "onBecomeObserved" + "sidebar_label": "onBecomeObserved [⚛️]" }, "refguide/reaction": { "title": "reaction", @@ -182,7 +182,7 @@ }, "refguide/spy": { "title": "Spy", - "sidebar_label": "spy" + "sidebar_label": "spy [⚛️]" }, "refguide/tojson": { "title": "toJS", diff --git a/website/sidebars.json b/website/sidebars.json index 3bce92f96..21fba1a36 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -2,10 +2,10 @@ "docs": { "Basics": [ "README", + "intro/how-to-read", "intro/installation", "intro/overview", "intro/concepts", - "intro/how-to-read", "faq/faq" ], "MobX and React": [ @@ -40,9 +40,9 @@ "refguide/autorun", "refguide/reaction", "refguide/when", - "refguide/observe", "best/dispose-reactions", "best/what-does-mobx-react-to", + "refguide/observe", "refguide/on-become-observed" ], "Debugging MobX": [ @@ -58,9 +58,9 @@ ], "Tips & Tricks": [ "best/store", - "refguide/configure", "best/decorators", - "best/limitations-without-proxies" + "best/limitations-without-proxies", + "refguide/configure" ], "Extending MobX": [ "refguide/extending", From a1d151628431296bbc91a018432faf1a48ab48dd Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 15:23:06 +0200 Subject: [PATCH 0443/1043] Tweaks to layout. --- docs/README.md | 4 ---- docs/intro/how-to-read.md | 4 +++- docs/intro/installation.md | 2 +- notes-docs.md | 31 ++++++++----------------------- website/i18n/en.json | 3 ++- website/siteConfig.js | 3 ++- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/docs/README.md b/docs/README.md index e0b676151..84bc2d339 100644 --- a/docs/README.md +++ b/docs/README.md @@ -50,10 +50,6 @@ Installation: `npm install mobx --save`. React bindings: `npm install mobx-react [More about installing MobX](http://mobxjs.github.io/mobx/intro/installation.html) -## Translations - -- [中文](http://cn.mobx.js.org) - ## Introduction MobX is a battle tested library that makes state management simple and scalable by transparently applying functional reactive programming (TFRP). diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index 59702e0f0..8d4f5673f 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -32,6 +32,8 @@ Here are a few suggestions about the next things to read: - To get some ideas on how to organize your application's data stores, read [Defining data stores](../best/store.md). -- If the behavior of MobX confuses you, it's useful to read [What does MobX react to?](../best/what-does-mobx-react-do.md). +- If the behavior of MobX confuses you, it's useful to read [What does MobX react to?](../best/what-does-mobx-react-to.md). + +- Get [quick overview of the API](../refguide/api.md), also linked in the top navigation bar. This should give you a good grounding in day-to-day use of MobX. There is plenty more available you can then read at your own leisure. diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 056d0fd41..81934192a 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -23,7 +23,7 @@ The main entry point of the MobX 6 package ships with ES5 code for backward comp ## Older JavaScript environments -By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). For example, when running Microsoft Internet Explorer or React Native (if < v0.59 or when using the Hermes engine) on Android. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). +By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). Examples are Internet Explorer (before Edge), Node.js < 6, iOS < 10, Android before RN 0.59, or Hermes runtime. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). You have to explicitly enable the fallback implementation by configuring [`useProxies`](../refguide/configure#useproxies): diff --git a/notes-docs.md b/notes-docs.md index 3cfafb48c..a5c15d86e 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -23,43 +23,27 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - "The props object and the state object of an observer component are automatically made observable to make it easier to create @computed properties that derive from props inside such a component." Does the props bit still apply to function component. Though computed doesn't apply anyhow, unless `useLocalStore` is in use. -- How to name "compatible property tracking" as opposed to proxy-based? How does one configure it, or it is an automatic fallback? - - What to do about translations? They will be out of date. - Is there a way to regenerate assets? flow.png for instance uses decorators and needs to be updated. -- When we introduce actions we need a link to an actions section that describes how to turn off strict state reinforcing. - -- How do we document `extendObservable` in the face of the existence of `makeObservable`? - -- Should peek() be brought back on arrays for non-decorator support? I have assumed it is still gone in the docs. - -- The async action document instead of offering "one way to do it" offers many different ways to do it. This may be unavoidable, but perhaps there is a way to at least focus this document. runInAction in particular seems like a pattern that doesn't add that much compared to just extracting actions as methods, especially in combination with makeAutoObservable. - -- Should this `computedRequiresAction` be the default? Or not have it at all? - -- Can you configure `computed` with options when used with `makeObservable`? I assume yes. - -- I am unclear about the order of `makeObservable` / `makeAutoObservable` in the constructor. Does it matter? Is there a good convention? What happens if you don't set a prop and then already talk about it in `makeObservable`? What about `makeAutoObservable`? +* Should this `computedRequiresAction` be the default? Or not have it at all? -- Does 'makeAutoObservable' work with computedFn? Should we be able to declare this explicitly with `makeObservable`? +* Does 'makeAutoObservable' work with computedFn? Should we be able to declare this explicitly with `makeObservable`? -- Should we use `mobx-react-lite` in examples primarily? What's up with the +* Should we use `mobx-react-lite` in examples primarily? What's up with the observer batching story though? -- createTransformer from mobx-utils is documented in the main docs but NOT - in mobx-utils. Should move it to mobx-utils? `expr` is also documented but we can instead directly refer to mobx-utils. +* What to do with the stateless HMR document? Is it still relevant? ## Todo -- [ ] Netlify preview for docs PR. +- [x] Netlify preview for docs PR. - [ ] Any code sandbox links need to be updated. jsfiddle as well, move it to codesandbox. -- [ ] Codemod might change to a new package to reduce size. Documentation needs to be updated. +- [x] Codemod might change to a new package to reduce size. Documentation needs to be updated. - [ ] There are a lot of references to external documentation resources. They can probably use a pruning. -- [ ] We can still write a separate document that introduces "observable" and explains you need to wrap things in `action` if you want to modify things. Is that the right way forward? - [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? -- [ ] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. +- [x] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. - [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. @@ -70,6 +54,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] Find a good place for `onReactionError`. - [ ] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. - [ ] Move API overview into UI. +- [ ] Either flatten docs into a single directory or follow new structure. ## Structure thoughts diff --git a/website/i18n/en.json b/website/i18n/en.json index 1cf9a6912..c8263e80b 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -194,7 +194,8 @@ } }, "links": { - "Documentation": "Documentation", + "API": "API", + "中文": "中文", "Github": "Github" }, "categories": { diff --git a/website/siteConfig.js b/website/siteConfig.js index 329c46870..906312412 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -51,7 +51,8 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ - { doc: "intro/concepts", label: "Documentation" }, + { doc: "refguide/api", label: "API"}, + {href: "http://cn.mobx.js.org", label: "中文"}, { href: "https://github.com/mobxjs/mobx", label: "Github" } ], From 242bcb001a39d4f661bf73e5f4c3a4ba81aeff1c Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 15:32:48 +0200 Subject: [PATCH 0444/1043] Move sponsors / backers into its own page. --- docs/README.md | 132 +------------------------------------ docs/backers-sponsors.md | 138 +++++++++++++++++++++++++++++++++++++++ notes-docs.md | 104 +---------------------------- website/i18n/en.json | 4 ++ website/siteConfig.js | 3 +- 5 files changed, 148 insertions(+), 233 deletions(-) create mode 100644 docs/backers-sponsors.md diff --git a/docs/README.md b/docs/README.md index 84bc2d339..8ff52efc0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -212,134 +212,4 @@ And finally kudos for all the people that believed in, tried, validated and even ## Donating Was MobX key in making your project a success? -Join our [open collective](https://opencollective.com/mobx#)! - -### Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mobx#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -### Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/mobx#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Join our [open collective](https://opencollective.com/mobx#)! Thank you to our existing [backers and sponsors](backers-sponsors.md). diff --git a/docs/backers-sponsors.md b/docs/backers-sponsors.md new file mode 100644 index 000000000..c523fce45 --- /dev/null +++ b/docs/backers-sponsors.md @@ -0,0 +1,138 @@ +--- +title: MobX Backers and Sponsors +hide_title: true +--- + +# MobX Backers and Sponsors + +Thanks to your backers and sponsors for their generous support! + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/mobx#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/mobx#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/notes-docs.md b/notes-docs.md index a5c15d86e..5830def35 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -45,7 +45,8 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? - [x] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. -- [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar +- [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar. +- [ ] This is now incorrect unless we have a way to maintain it. "Become a sponsor and get your logo on our README on Github with a link to your site." Perhaps change to "gold & silver level sponsors" or something? - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. - [ ] Consider breaking up computed.md into a basic and "advanced" document. - [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? @@ -55,106 +56,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. - [ ] Move API overview into UI. - [ ] Either flatten docs into a single directory or follow new structure. - -## Structure thoughts - -I've made a start of introducing a new structure. Right now the directories -are rather flat and filenames don't always reflect the titles. This encourages people to add and modify documentation without regard to structure, which makes it easy to reference things that haven't been introduced yet. I think it would help to adjust the directory structure to reflect the content. - -The goal of this structure is: good flow that introduces the most important bits -first to a typical React developer. In each directory, have the most important -bits come earlier, the less important or advanced bits later. - -Here is a proposed structure: - -- Basics - - - Introduction - - - Installation - - - The gist of MobX (or quickstart?) - - - Concepts & Principles - - - FAQ - -- MobX and React - - - React integration - - - Optimizing React components - - - React pitfalls - - - React class components - -- Making things observable - - - makeObservable / makeAutoObservable - - - observable - - - objects - - - arrays - - - maps - - - Boxed values - -- Updating observables - - - action - - - Asynchronous actions - -- Computed values - - - computed - - - Computed options - -- Effects for observables - - - autorun - - - when - - - reaction - - - always dispose reactions - - - What does MobX react to? - -- Debugging MobX - - - Using trace for debugging - -- Utilities - - - toJS - - - Spy - - - Object API - -- Organizing your application - - - Best practices - - - Defining data stores (mention mobx-state-tree, mobx-keystone) - -- Additional topics - - - Decorators in MobX - - - Limitations without Proxy Support - -Mine the API docs page to deduplicate content and move it into the -rest of the docs. - -API docs page (with one-liners and links) linked somewhere in the page layout. +- [ ] How to keep the root README in sync with the docs readme? ## Fragments diff --git a/website/i18n/en.json b/website/i18n/en.json index c8263e80b..87ee412fc 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -5,6 +5,9 @@ "previous": "Previous", "tagline": "Simple, scalable state management", "docs": { + "backers-sponsors": { + "title": "MobX Backers and Sponsors" + }, "best/actions": { "title": "Asynchronous actions", "sidebar_label": "Asynchronous actions" @@ -196,6 +199,7 @@ "links": { "API": "API", "中文": "中文", + "Sponsors": "Sponsors", "Github": "Github" }, "categories": { diff --git a/website/siteConfig.js b/website/siteConfig.js index 906312412..f87b85cae 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -52,7 +52,8 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ { doc: "refguide/api", label: "API"}, - {href: "http://cn.mobx.js.org", label: "中文"}, + { href: "http://cn.mobx.js.org", label: "中文"}, + { doc: "backers-sponsors", label: "Sponsors"}, { href: "https://github.com/mobxjs/mobx", label: "Github" } ], From d3e67ed1c3cbb6aa96c0ea3671a4a4b501aec62e Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 15:34:33 +0200 Subject: [PATCH 0445/1043] Remove API from sidebars, as it's in the top bar now. --- website/sidebars.json | 1 - 1 file changed, 1 deletion(-) diff --git a/website/sidebars.json b/website/sidebars.json index 21fba1a36..2a8745e25 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -51,7 +51,6 @@ "refguide/spy" ], "Utilities": [ - "refguide/api", "refguide/tojson", "refguide/object-api", "refguide/mobx-utils" From 6d6e2b7fb10e717eed603a9ec8e30adebbc4701f Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 15:42:18 +0200 Subject: [PATCH 0446/1043] More about sponsors... --- docs/README.md | 4 +++- notes-docs.md | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8ff52efc0..8f3f5da5a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](http://mobxjs.github.io/mobx/backers-sponsors.html#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). **🥇Gold sponsors (\$3000+ total contribution):**
    Mendix @@ -108,6 +108,8 @@ To get more detail about this example, see [the gist of MobX](http://mobxjs.gith To learn about the underlying concepts together with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html) +Then see what to [read next](http://mobxjs.github/mobx/intro/how-to-read.html). + ### MobX and Decorators Wait! This example doesn't use decorators. Haven't you seen MobX code before that uses them? In MobX 6 we have chosen to move away from them for maximum compatibility with standard JavaScript. diff --git a/notes-docs.md b/notes-docs.md index 5830def35..32bd84f4a 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -45,8 +45,9 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] Update the 'Getting started tutorial'? It's maintained separately from the documentation - should we attempt to integrate it? The problem with that it is has live code. Docusaurus can run React snippets but the HTML page has very fancy animations. Update it as is? - [x] Remove reference to the https://github.com/mobxjs/mobx-react-boilerplate projects, modify github README there that it's out of date and retired. - [ ] makeAutoObservable is handy, but you probably shouldn't use it on a React component to make local state observable. We should say that somewhere. -- [ ] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar. +- [x] mweststrate: Only sponsors are needed. For backers / sponsors and sponsoring in general I think we should add an entry in the top menu bar. - [ ] This is now incorrect unless we have a way to maintain it. "Become a sponsor and get your logo on our README on Github with a link to your site." Perhaps change to "gold & silver level sponsors" or something? +- [ ] There is also this document https://github.com/mobxjs/mobx/blob/master/sponsors.md for one time contributions maintained separately. - [ ] What to do about the egghead lessons? They use the decorator syntax and may not enforce actions by default. -> consolidate into a single page and explain the decorator story and action on it. - [ ] Consider breaking up computed.md into a basic and "advanced" document. - [ ] API overview duplicates a lot of the material already discussed elsewhere. Break it into pieces. Introduce a separate API page which has a one line description and a link to the details? From f912ddfd11aded813d40e2a122cc700b357892f8 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Thu, 9 Jul 2020 15:43:29 +0200 Subject: [PATCH 0447/1043] Move down 'further resources'. --- docs/README.md | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8f3f5da5a..14a982d42 100644 --- a/docs/README.md +++ b/docs/README.md @@ -168,30 +168,6 @@ A ton of credits for [Mendix](https://github.com/mendix), for providing the flex And finally kudos for all the people that believed in, tried, validated and even [sponsored](https://github.com/mobxjs/mobx/blob/master/sponsors.md) MobX. -## Further resources and documentation - -- egghead.io course -- [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -- Videos: - - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) -- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) -- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [MobX homepage](http://mobxjs.github.io) -- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -- [Tutorials](https://github.com/mobxjs/awesome-mobx#tutorials) -- [Blogs](https://github.com/mobxjs/awesome-mobx#blogs) -- [Videos](https://github.com/mobxjs/awesome-mobx#videos) -- [Boilerplates](https://github.com/mobxjs/awesome-mobx#boilerplates) -- [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - ## What others are saying... > Guise, #mobx isn't pubsub, or your grandpa's observer pattern. Nay, it is a carefully orchestrated observable dimensional portal fueled by the power cosmic. It doesn't do change detection, it's actually a level 20 psionic with soul knife, slashing your viewmodel into submission. @@ -215,3 +191,27 @@ And finally kudos for all the people that believed in, tried, validated and even Was MobX key in making your project a success? Join our [open collective](https://opencollective.com/mobx#)! Thank you to our existing [backers and sponsors](backers-sponsors.md). + +## Further resources and documentation + +- egghead.io course +- [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) +- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- Videos: + - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) + - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. + - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) + - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) +- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) +- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) +- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) +- [MobX homepage](http://mobxjs.github.io) +- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) +- [Tutorials](https://github.com/mobxjs/awesome-mobx#tutorials) +- [Blogs](https://github.com/mobxjs/awesome-mobx#blogs) +- [Videos](https://github.com/mobxjs/awesome-mobx#videos) +- [Boilerplates](https://github.com/mobxjs/awesome-mobx#boilerplates) +- [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) From bd313900a8edda6050647fe418ef022f01321507 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 10 Jul 2020 12:46:22 +0200 Subject: [PATCH 0448/1043] Replace the atom with the rocket. I realized the atom is too much like the React logo, which would be confusing. --- docs/best/decorators.md | 4 ++-- docs/best/limitations-without-proxies.md | 4 ++-- docs/faq/faq.md | 12 +++++----- docs/intro/how-to-read.md | 6 +++-- docs/react/react-class-components.md | 4 ++-- docs/react/react-performance.md | 2 +- docs/refguide/action.md | 6 ++--- docs/refguide/boxed.md | 4 ++-- docs/refguide/computed-behavior.md | 4 ++-- docs/refguide/computed-options.md | 4 ++-- docs/refguide/computed.md | 4 ++-- docs/refguide/configure.md | 4 ++-- docs/refguide/extend-observable.md | 4 ++-- docs/refguide/extending.md | 4 ++-- docs/refguide/internals.md | 4 ++-- docs/refguide/introspection-utils.md | 2 +- docs/refguide/mobx-utils.md | 4 ++-- docs/refguide/modifiers.md | 4 ++-- docs/refguide/object-api.md | 4 ++-- docs/refguide/observable.md | 2 +- docs/refguide/observe.md | 4 ++-- docs/refguide/on-become-observed.md | 4 ++-- docs/refguide/spy.md | 4 ++-- website/i18n/en.json | 30 ++++++++++++------------ 24 files changed, 65 insertions(+), 63 deletions(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 85be3bff6..ece311767 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,9 +1,9 @@ --- -sidebar_label: Decorators in MobX [⚛️] +sidebar_label: Decorators in MobX [🚀] hide_title: true --- -# Decorators in MobX [⚛️] +# Decorators in MobX [🚀] MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md index 2d0eea6c7..f0466f314 100644 --- a/docs/best/limitations-without-proxies.md +++ b/docs/best/limitations-without-proxies.md @@ -1,9 +1,9 @@ --- -sidebar_label: Limitations without Proxy [⚛️] +sidebar_label: Limitations without Proxy [🚀] hide_title: true --- -# Limitations without Proxy support [⚛️] +# Limitations without Proxy support [🚀] MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy), there are some limitations: diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 94f765a55..593e609e3 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -74,25 +74,25 @@ You don't need to. MobX already optimizes rendering, and it works with most kinds of data, including cycles and classes. So other programming paradigms like classic MVC can now be easily applied in applications that combine ReactJS with MobX. -[⚛️] Flux implementations that do not work with the requirement that the data in their stores is immutable should work well with MobX. Redux does have this immutability requirement. Note that both mobx-state-tree and mobx-keystone add additional constraints to support better integration with Redux. +[🚀] Flux implementations that do not work with the requirement that the data in their stores is immutable should work well with MobX. Redux does have this immutability requirement. Note that both mobx-state-tree and mobx-keystone add additional constraints to support better integration with Redux. ##### How does MobX compare to other Reactive frameworks? -[⚛️] See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. +[🚀] See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. ##### Can I record states and re-hydrate them? The frameworks built on top of MobX [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/) can both do this for you. -[⚛️] To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) has some examples. +[🚀] To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) has some examples. ##### Can MobX be combined with RxJS? -[⚛️] Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. +[🚀] Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. ##### When to use RxJS instead of MobX? -[⚛️] For anything that involves explictly working with the concept of time, +[🚀] For anything that involves explictly working with the concept of time, or when you need to reason about the historical values / events of an observable (and not just the latest), RxJs is recommended as it provides more low-level primitives. Whenever you want to react to _state_ instead of _events_, MobX offers an easier and more high-level approach. In practice, combining RxJS and MobX might result in really powerful constructions. @@ -108,5 +108,5 @@ MobX works just as well server side, and is already combined with jQuery (see th ##### Can you tell me how it works? -[⚛️] Sure, join the [gitter chat](https://gitter.im/mobxjs/mobx) or check out the code. Or, submit an issue to motivate me to make some nice drawings :). +[🚀] Sure, join the [gitter chat](https://gitter.im/mobxjs/mobx) or check out the code. Or, submit an issue to motivate me to make some nice drawings :). And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index 8d4f5673f..bff1b9a86 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -10,7 +10,7 @@ The documentation follows the principle that the most commonly used concepts are introduced before specialized information. This applies to the headings in the table of concepts as well as the pages under those headings. -We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [⚛️] marker. You can use MobX very effectively without knowing about them, so feel free to skip them and move on to the next section! +We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [🚀] marker. You can use MobX very effectively without knowing about them, so feel free to skip them and move on to the next section! ## Guided tour @@ -26,7 +26,9 @@ Here are a few suggestions about the next things to read: - It's also useful to at scan through the sections on [observable arrays](../refguide/array.md) and [observable maps](../refguide/map.md) to see what extra methods are available beyond the built-in JS `Array` and `Map` -- Learn about [action](../refguide/action.md). Read the discussion about [asynchronous actions](../best/actions.md). +- Learn about [action](../refguide/action.md). Also read the discussion about [asynchronous actions](../best/actions.md). + +- The basics of [computed](../refguide/computed.md). - Read about [`autorun`](../refguide/autorun.md), if only because it's used in examples. diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index b1f55ba64..4048c5af3 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -119,7 +119,7 @@ The previous example looks a bit cumbersome. We recommended switching class components to function components if you can, and to use `useState` for maintaining simple state. -[⚛️] But decorators are still supported -- here is the same example with +[🚀] But decorators are still supported -- here is the same example with decorators: ```javascript @@ -157,7 +157,7 @@ including how to enable them. ### Don't mark (some) React lifecycle methods as `action.bound` on `observer` React components -[⚛️] If you modify any observable data in method in your React component, that method +[🚀] If you modify any observable data in method in your React component, that method should be marked as an `action`. For event handlers, `action.bound` is handy, as `this` then refers to the instance your component class. diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md index 3faeb85a9..af4ad404d 100644 --- a/docs/react/react-performance.md +++ b/docs/react/react-performance.md @@ -88,7 +88,7 @@ There is nothing wrong with the latter, but a change in the `name` property will ### Function props -[⚛️] You may notice that to deference values late you have to create lots of small observer components where each is customized to render some different part of data, for example: +[🚀] You may notice that to deference values late you have to create lots of small observer components where each is customized to render some different part of data, for example: ```javascript const PersonNameDisplayer = observer(({ person }) => ) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 09f016cc3..6ee1970f5 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -64,7 +64,7 @@ are asynchronous. See [asynchronous actions](../best/actions.md). ## action.bound -[⚛️] The `action` function follows the normal rules for binding in JavaScript. +[🚀] The `action` function follows the normal rules for binding in JavaScript. However, `action.bound` can be used to automatically bind actions to the targeted object. This ensures that `this` points to the right object when you use the action as a callback later. @@ -91,7 +91,7 @@ setInterval(ticker.increment, 1000) ## bound arrow functions -[⚛️] You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: +[🚀] You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: ```javascript class Ticker { @@ -121,5 +121,5 @@ Returns `true` if the given function is marked as an `action`. ## Disabling mandatory actions -[⚛️] By default, MobX 6 and later require that you use actions to make state changes. +[🚀] By default, MobX 6 and later require that you use actions to make state changes. You can however configure MobX to disable this behavior, see [`enforceActions`](configure.md#enforceactions). diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index 64f8eb286..f8534d1d0 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -1,10 +1,10 @@ --- title: Observable Boxes -sidebar_label: boxes [⚛️] +sidebar_label: boxes [🚀] hide_title: true --- -# Observable Boxes [⚛️] +# Observable Boxes [🚀] Usage: diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index 5c87f6840..bd0e4255d 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -1,10 +1,10 @@ --- title: How computed works -sidebar_label: How computed works [⚛️] +sidebar_label: How computed works [🚀] hide_title: true --- -# How `computed` works [⚛️] +# How `computed` works [🚀] Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index f32498476..f657e7cb7 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -1,10 +1,10 @@ --- title: Options for computed -sidebar_label: Options for computed [⚛️] +sidebar_label: Options for computed [🚀] hide_title: true --- -# Options for computed [⚛️] +# Options for computed [🚀] Usually `computed` behaves the way you want it to out of the box, but it's possible to customize its behavior by passing in an `options` argument: diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 6dac3e0ec..a960a24b9 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -112,7 +112,7 @@ _Note: always define the setter *after* the getter, some TypeScript versions are ## Computed with arguments -[⚛️] Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: +[🚀] Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: ```javascript import { observable } from "mobx" @@ -153,5 +153,5 @@ Returns `true` if the designated property is a computed value. ## More about computed -[⚛️] You can pass [options into `computed`](computed-options.md). If you experience +[🚀] You can pass [options into `computed`](computed-options.md). If you experience unexpected behavior, you can also read more about the [detailed behavior of `computed`](computed-behavior.md). diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 24b2a6317..deaea0a79 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,10 +1,10 @@ --- title: Configuring MobX -sidebar_label: Configuring MobX [⚛️] +sidebar_label: Configuring MobX [🚀] hide_title: true --- -# Configuring MobX [⚛️] +# Configuring MobX [🚀] Usage: diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index 520b9741e..e22ec2a28 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -1,9 +1,9 @@ --- -sidebar_label: extendObservable [⚛️] +sidebar_label: extendObservable [🚀] hide_title: true --- -# extendObservable [⚛️] +# extendObservable [🚀] Usage: diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 469fe3d82..cbf3b6c0e 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,9 +1,9 @@ --- -sidebar_label: New observable types [⚛️] +sidebar_label: New observable types [🚀] hide_title: true --- -# Creating new observable types [⚛️] +# Creating new observable types [🚀] ## Atoms diff --git a/docs/refguide/internals.md b/docs/refguide/internals.md index 81aa2bedf..b4676c7bf 100644 --- a/docs/refguide/internals.md +++ b/docs/refguide/internals.md @@ -1,10 +1,10 @@ --- title: Internal functions -sidebar_label: Internal functions [⚛️] +sidebar_label: Internal functions [🚀] hide_title: true --- -# Internal functions [⚛️] +# Internal functions [🚀] The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX. diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md index 29ef0fe7d..0cde102a8 100644 --- a/docs/refguide/introspection-utils.md +++ b/docs/refguide/introspection-utils.md @@ -35,7 +35,7 @@ Returns a tree structure with all reactions / computations that are observing th ### `getAtom` -[⚛️] Usage: +[🚀] Usage: - `getAtom(thing, property?)`. diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 07fad21f7..0e586249b 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,9 +1,9 @@ --- title: mobx-utils -sidebar_label: mobx-utils [⚛️] +sidebar_label: mobx-utils [🚀] hide_title: true --- -# mobx-utils [⚛️] +# mobx-utils [🚀] [MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions and common patterns for MobX. diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index 6d07a07ef..0093dc5e0 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -1,10 +1,10 @@ --- title: Observable modifiers -sidebar_label: Observable modifiers [⚛️] +sidebar_label: Observable modifiers [🚀] hide_title: true --- -# Observable modifiers [⚛️] +# Observable modifiers [🚀] When you use `makeObservable`, `makeAutoObservable`, `extendObservable` and `observable.object` you can use annotations to specify how observable properties behave: diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index f96a4a39f..5a9cab819 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,9 +1,9 @@ --- -sidebar_label: Object API [⚛️] +sidebar_label: Object API [🚀] hide_title: true --- -## Object API [⚛️] +## Object API [🚀] The Object API is a utility API that enables manipulating observable maps, objects and arrays with the same generic API. diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index e21530811..cde1ee075 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -34,7 +34,7 @@ For examples of the declarative use of `observable` with `makeObservable`, see [ ## Using `observable` programmatically -[⚛️] You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. +[🚀] You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. You can't use `observable` to make objects with a prototype observable; as that is the responsibility of its constructor function. Use `makeObservable` or `makeAutoObservable` in its constructor. diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index 9faf061a2..c5a5fa098 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -1,9 +1,9 @@ --- -sidebar_label: intercept & observe [⚛️] +sidebar_label: intercept & observe [🚀] hide_title: true --- -# Intercept & Observe [⚛️] +# Intercept & Observe [🚀] `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). diff --git a/docs/refguide/on-become-observed.md b/docs/refguide/on-become-observed.md index fa74b1f81..b65d1dc4d 100644 --- a/docs/refguide/on-become-observed.md +++ b/docs/refguide/on-become-observed.md @@ -1,10 +1,10 @@ --- title: onBecomeObserved -sidebar_label: onBecomeObserved [⚛️] +sidebar_label: onBecomeObserved [🚀] hide_title: true --- -# `onBecomeObserved` and `onBecomeUnobserved` [⚛️] +# `onBecomeObserved` and `onBecomeUnobserved` [🚀] Usage: diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index a65423890..0f40a4b4c 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -1,10 +1,10 @@ --- -sidebar_label: spy [⚛️] +sidebar_label: spy [🚀] title: Spy hide_title: true --- -# Spy [⚛️] +# Spy [🚀] Usage: diff --git a/website/i18n/en.json b/website/i18n/en.json index 87ee412fc..80416e10c 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -14,7 +14,7 @@ }, "best/decorators": { "title": "best/decorators", - "sidebar_label": "Decorators in MobX [⚛️]" + "sidebar_label": "Decorators in MobX [🚀]" }, "best/dispose-reactions": { "title": "Always dispose reactions", @@ -22,7 +22,7 @@ }, "best/limitations-without-proxies": { "title": "best/limitations-without-proxies", - "sidebar_label": "Limitations without Proxy [⚛️]" + "sidebar_label": "Limitations without Proxy [🚀]" }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", @@ -101,15 +101,15 @@ }, "refguide/boxed": { "title": "Observable Boxes", - "sidebar_label": "boxes [⚛️]" + "sidebar_label": "boxes [🚀]" }, "refguide/computed-behavior": { "title": "How computed works", - "sidebar_label": "How computed works [⚛️]" + "sidebar_label": "How computed works [🚀]" }, "refguide/computed-options": { "title": "Options for computed", - "sidebar_label": "Options for computed [⚛️]" + "sidebar_label": "Options for computed [🚀]" }, "refguide/computed": { "title": "computed", @@ -117,15 +117,15 @@ }, "refguide/configure": { "title": "Configuring MobX", - "sidebar_label": "Configuring MobX [⚛️]" + "sidebar_label": "Configuring MobX [🚀]" }, "refguide/extend-observable": { "title": "refguide/extend-observable", - "sidebar_label": "extendObservable [⚛️]" + "sidebar_label": "extendObservable [🚀]" }, "refguide/extending": { "title": "refguide/extending", - "sidebar_label": "New observable types [⚛️]" + "sidebar_label": "New observable types [🚀]" }, "refguide/flow": { "title": "flow", @@ -133,7 +133,7 @@ }, "refguide/internals": { "title": "Internal functions", - "sidebar_label": "Internal functions [⚛️]" + "sidebar_label": "Internal functions [🚀]" }, "refguide/introspection-utils": { "title": "Introspection APIs", @@ -149,15 +149,15 @@ }, "refguide/mobx-utils": { "title": "mobx-utils", - "sidebar_label": "mobx-utils [⚛️]" + "sidebar_label": "mobx-utils [🚀]" }, "refguide/modifiers": { "title": "Observable modifiers", - "sidebar_label": "Observable modifiers [⚛️]" + "sidebar_label": "Observable modifiers [🚀]" }, "refguide/object-api": { "title": "refguide/object-api", - "sidebar_label": "Object API [⚛️]" + "sidebar_label": "Object API [🚀]" }, "refguide/object": { "title": "Observable Objects", @@ -169,11 +169,11 @@ }, "refguide/observe": { "title": "refguide/observe", - "sidebar_label": "intercept & observe [⚛️]" + "sidebar_label": "intercept & observe [🚀]" }, "refguide/on-become-observed": { "title": "onBecomeObserved", - "sidebar_label": "onBecomeObserved [⚛️]" + "sidebar_label": "onBecomeObserved [🚀]" }, "refguide/reaction": { "title": "reaction", @@ -185,7 +185,7 @@ }, "refguide/spy": { "title": "Spy", - "sidebar_label": "spy [⚛️]" + "sidebar_label": "spy [🚀]" }, "refguide/tojson": { "title": "toJS", From 078b99566a20f1ff96d9b1515db4f5b357634ef4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 10 Jul 2020 13:18:05 +0200 Subject: [PATCH 0449/1043] Add this to code sandbox. --- docs/intro/overview.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/intro/overview.md b/docs/intro/overview.md index c5eb9f76b..40c5ee4e6 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -39,14 +39,14 @@ Generally speaking any function can become a reactive view that observes its dat But here is an (ES6) example of a view in the form of a React component. ```javascript -import React from "react" -import ReactDOM from "react-dom" -import { observer } from "mobx-react" +import * as React from "react" +import { render } from "react-dom" +import { observer } from "mobx-react-lite" const TimerView = observer(({ timer }) => ( )) -ReactDOM.render(, document.body) +render(, document.getElementById("root")) ``` (For the implementation of `resetTimer` method see the next section) @@ -90,7 +90,7 @@ These methods, `increaseTimer` and `resetTimer` are just like you would write th **_MobX helps you do things in a simple straightforward way_**. -Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). +Feel free to try this example on [CodeSandbox](https://codesandbox.io/s/the-gist-of-mobx-piqqp?file=/src/index.js). To learn more about the concepts and principles underlying MobX, together with a more worked out example, read [Concepts & Principles](concepts.md). To learn more about how to use MobX with React, read [React integration](../react/react-integration.md). From 232bf8d981ba28c2bd50e1aa6246f06fbd1596ea Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 10 Jul 2020 13:18:25 +0200 Subject: [PATCH 0450/1043] A few todo items. --- notes-docs.md | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/notes-docs.md b/notes-docs.md index 32bd84f4a..896da1c42 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -54,10 +54,32 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] The broken displayName issue with React.memo and thus with observer. Now marked as broken in the docs, but should be updated once fixed. - [ ] The debugging information for `observer` components in the React devtools does not match the screenshot in the mobx-react readme anymore. It does seem to work as intended according to the issue though. - [ ] Find a good place for `onReactionError`. -- [ ] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. +- [x] Invent a "obscure/advanced/special interest" marker and use it on documents that aren't important to newcomers. - [ ] Move API overview into UI. - [ ] Either flatten docs into a single directory or follow new structure. -- [ ] How to keep the root README in sync with the docs readme? +- [ ] How to keep the root README in sync with the docs readme? Keep the sponsors but otherwise place a link to the docs website. +- [ ] How is LINKS.md related to the docs? Need to clean this up. +- [ ] Use mobx-react-lite where possible in examples and codesandbox. +- [ ] Remove batching import from mobx-react-lite from codesandbox when possible. +- [ ] Add a typescript document to docs with an example. + +## Code sandbox todo + +- [ ] spy.md Simple codesandbox trace example: https://codesandbox.io/s/nr58ylyn4m + +- [ ] faq.md MobX works just as well server side, and is already combined with jQuery (see this [Fiddle](http://jsfiddle.net/mweststrate/vxn7qgdw) + +- [ ] concepts.md (https://jsfiddle.net/mweststrate/wv3yopo0/) + +- [ ] overview.md Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). + +- LINKS.md Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). same one was overview.md + +- LINKS.md - A simple webshop using [React + mobx](https://jsfiddle.net/mweststrate/46vL0phw) or [JQuery + mobx](http://jsfiddle.net/mweststrate/vxn7qgdw). + +- LINKS.md [Simple timer](https://jsfiddle.net/mweststrate/wgbe4guu/) application in JSFiddle. + +- LINKS.md [Simple ES5 MobX examples](https://github.com/mattruby/mobx-examples) Bite sized MobX examples all setup to run in jsFiddle. ## Fragments From dfcb5ebdbe7b5a400a24516458d34dbff753210b Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 10 Jul 2020 13:29:30 +0200 Subject: [PATCH 0451/1043] CodeSandbox for Concepts & Principles. --- docs/intro/concepts.md | 26 +++++++++++++++++--------- notes-docs.md | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index d56ec82be..6fcc8852e 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -1,5 +1,4 @@ --- -title: Concepts & Principles sidebar_label: Concepts & Principles hide_title: true --- @@ -31,16 +30,17 @@ class Todo { title = "" finished = false - constructor() { + constructor(title) { makeObservable(this, { title: observable, finished: observable, toggle: action }) + this.title = title } toggle() { - this.finished = !finished + this.finished = !this.finished } } ``` @@ -115,9 +115,9 @@ In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_pro If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/react/react-integration.html) function from the `mobx-react` package. ```javascript -import React from "react" -import ReactDOM from "react-dom" -import { observer } from "mobx-react" +import * as React from "react" +import { render } from "react-dom" +import { observer } from "mobx-react-lite" const TodoListView = observer(({ todoList }) => (
    @@ -137,14 +137,22 @@ const TodoView = observer(({ todo }) => ( )) -const store = new TodoList() -ReactDOM.render(, document.getElementById("mount")) +const store = new TodoList([new Todo("Get Coffee"), new Todo("Write simpler code")]) +render(, document.getElementById("root")) ``` `observer` turns React (function) components into derivations of the data they render. When using MobX there are no smart or dumb components. All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. -However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). +However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. + +##### Try it out! + +You can try this out yourself on [CodeSandbox](https://codesandbox.io/s/concepts-principles-il8lt?file=/src/index.js:1161-1252). + +You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). + +##### Learn more To learn more about how React works with MobX, read [React integration](../react/react-integration.md). diff --git a/notes-docs.md b/notes-docs.md index 896da1c42..1f255db91 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -71,7 +71,7 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ - [ ] concepts.md (https://jsfiddle.net/mweststrate/wv3yopo0/) -- [ ] overview.md Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). +- [x] overview.md Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). - LINKS.md Or fork this [JSFiddle](https://jsfiddle.net/mweststrate/wgbe4guu/). same one was overview.md From ebdda189748fdbcfc58934188c87f034d58175d4 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Fri, 10 Jul 2020 13:39:37 +0200 Subject: [PATCH 0452/1043] Move over trace example to MobX docs. --- docs/best/trace.md | 4 ++-- notes-docs.md | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/best/trace.md b/docs/best/trace.md index 782ee5f66..0cd285f59 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -22,7 +22,7 @@ In debugger mode, the debug information will also reveal the full derivation tre ## Live examples -Simple codesandbox trace example: https://codesandbox.io/s/nr58ylyn4m +[Simple CodeSandbox `trace` example](https://codesandbox.io/s/trace-dnhbz?file=/src/index.js:309-338) Here's a deployed example for exploring the stack: https://csb-nr58ylyn4m-hontnuliaa.now.sh/ Be sure to play with chrome debugger's blackbox feature! @@ -44,7 +44,7 @@ const MyComponent = observer(() => { Enable trace by using the `reaction` argument of an reaction / autorun: ```javascript -mobx.autorun("loggerzz", reaction => { +mobx.autorun("logger", reaction => { reaction.trace() console.log(user.fullname) }) diff --git a/notes-docs.md b/notes-docs.md index 1f255db91..42f075bc5 100644 --- a/notes-docs.md +++ b/notes-docs.md @@ -36,6 +36,8 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ * What to do with the stateless HMR document? Is it still relevant? +- window.nameStore = nameStore in trace sandbox? + ## Todo - [x] Netlify preview for docs PR. @@ -65,11 +67,11 @@ https://deploy-preview-2382--mobx-docs.netlify.app/ ## Code sandbox todo -- [ ] spy.md Simple codesandbox trace example: https://codesandbox.io/s/nr58ylyn4m +- [x] trace.md Simple codesandbox trace example: https://codesandbox.io/s/nr58ylyn4m -- [ ] faq.md MobX works just as well server side, and is already combined with jQuery (see this [Fiddle](http://jsfiddle.net/mweststrate/vxn7qgdw) +- [ ] faq.md MobX works just as well server side, and is already combined with jQuery (see this [Fiddle](http://jsfiddle.net/mweststrate/vxn7qgdw). This is a very ancient example, what to do? -- [ ] concepts.md (https://jsfiddle.net/mweststrate/wv3yopo0/) +- [x] concepts.md (https://jsfiddle.net/mweststrate/wv3yopo0/) - [x] overview.md Feel free to try this example on [JSFiddle](http://jsfiddle.net/mweststrate/wgbe4guu/). From 5d86c19431f5fe15e0d650e63236f45187c55765 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 12:15:00 +0100 Subject: [PATCH 0453/1043] Updated notes --- notes.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/notes.md b/notes.md index 338c5fbde..0202f0e85 100644 --- a/notes.md +++ b/notes.md @@ -51,21 +51,27 @@ - [x] verify perf / memory changes -> general perf is similar (< 10% slower, class instanation is twice as slow...!?). Not sure if that is a problem or the result of difference in babel config in the first place (e.g. define props) - [x] investigate skipped tests - [x] process TODO's - - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html - [x] ~weakmap for hasMaps in Map (and Set?)~ no: that would only works for objectish keys which is an exception and would require separate map collection - [x] include #2343 - - [ ] default observable requires reaction? - [x] kill globalstate options? - - [ ] no binding by default? https://twitter.com/getify/status/1258137826241241088 - [x] kill / fix flow types - [x] enable search on docs - - [ ] update ad links + - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html + - [ ] default observable requires reaction? + - [ ] no binding by default? https://twitter.com/getify/status/1258137826241241088 + - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] fix https://github.com/mobxjs/mobx/issues/2394 + - [ ] use autObservable options for codemod (if no superclass) + - [ ] merge https://github.com/mobxjs/mobx/pull/2389 + - [ ] set up discussions - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable + - [ ] update useLocalStore in mobx-react-lite to use + autoMakeObservable + - [ ] fix batching setup - [ ] post 6.0 - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 + - [ ] set up continous delivery ## Docs / migration guide From 0061b3f8d109873b3c3e9e56f9e1e8ad38e45979 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 19:33:17 +0100 Subject: [PATCH 0454/1043] Don't bind by default but provide `autoBind` option --- notes.md | 4 +- src/api/extendobservable.ts | 3 +- src/api/makeObservable.ts | 27 ++++++++----- src/api/observable.ts | 4 +- test/v5/base/make-observable.ts | 70 +++++++++++++++++++++++++++++++-- 5 files changed, 92 insertions(+), 16 deletions(-) diff --git a/notes.md b/notes.md index 0202f0e85..b93197985 100644 --- a/notes.md +++ b/notes.md @@ -58,12 +58,13 @@ - [x] enable search on docs - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html - [ ] default observable requires reaction? - - [ ] no binding by default? https://twitter.com/getify/status/1258137826241241088 + - [x] no binding by default? https://twitter.com/getify/status/1258137826241241088 - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] fix https://github.com/mobxjs/mobx/issues/2394 - [ ] use autObservable options for codemod (if no superclass) - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - [ ] set up discussions + - [ ] fix UMD build depending on `global` - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use @@ -138,6 +139,7 @@ Why declare fields * Fixed #2379 * [ ] Breaking: strict mode defaults to observed now * [ ] killed option `computedConfigurable` as it was the default already +* [ ] document: `autoBind` options for observable / extendObservable / makeObserver ## NOTES diff --git a/src/api/extendobservable.ts b/src/api/extendobservable.ts index 332216d5b..10172d06f 100644 --- a/src/api/extendobservable.ts +++ b/src/api/extendobservable.ts @@ -44,7 +44,8 @@ export function extendObservable( key, descs[key as any], !annotations ? true : key in annotations ? annotations[key] : true, - true + true, + !!options?.autoBind ) }) } finally { diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index e51bfe6e3..a903d35d8 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -45,12 +45,14 @@ function makeAction(target, key, name, fn, asAutoAction) { function getInferredAnnotation( desc: PropertyDescriptor, - defaultAnnotation: Annotation | undefined + defaultAnnotation: Annotation | undefined, + autoBind: boolean ): Annotation | boolean { if (desc.get) return computed if (desc.set) return false // ignore pure setters // if already wrapped in action, don't do that another time, but assume it is already set up properly - if (isFunction(desc.value)) return isAction(desc.value) ? false : autoAction.bound + if (isFunction(desc.value)) + return isAction(desc.value) ? false : autoBind ? autoAction.bound : autoAction // if (!desc.configurable || !desc.writable) return false return defaultAnnotation ?? observable.deep } @@ -74,13 +76,14 @@ export function makeProperty( key: PropertyKey, descriptor: PropertyDescriptor, annotation: Annotation | boolean, - forceCopy: boolean // extend observable will copy even unannotated properties + forceCopy: boolean, // extend observable will copy even unannotated properties + autoBind: boolean ): void { const { target_: target } = adm const defaultAnnotation: Annotation | undefined = observable // ideally grap this from adm's defaultEnahncer instead! const origAnnotation = annotation if (annotation === true) { - annotation = getInferredAnnotation(descriptor, defaultAnnotation) + annotation = getInferredAnnotation(descriptor, defaultAnnotation, autoBind) } if (annotation === false) { if (forceCopy) { @@ -164,6 +167,7 @@ export function makeObservable, options?: CreateObservableOptions ): T { + const autoBind = !!options?.autoBind const adm = asObservableObject( target, options?.name, @@ -182,7 +186,7 @@ export function makeObservable { let annotation = annotations[key] const [desc, owner] = getDescriptorInChain(target, key) - makeProperty(adm, owner, key, desc, annotation, false) + makeProperty(adm, owner, key, desc, annotation, false, autoBind) } ownKeys(annotations).forEach(make) } finally { @@ -212,7 +216,7 @@ export function makeAutoObservable, options: CreateObservableOptions | undefined ) { + const autoBind = !!options?.autoBind const defaultAnnotation: Annotation = options?.deep ? observable.deep : options?.defaultDecorator ?? observable.deep Object.entries(getOwnPropertyDescriptors(target)).forEach(([key, descriptor]) => { if (key in collector || key === "constructor") return - collector[key] = getInferredAnnotation(descriptor, defaultAnnotation) + collector[key] = getInferredAnnotation(descriptor, defaultAnnotation, autoBind) }) } -function extractAnnotationsFromProto(proto: any, collector: AnnotationsMap) { +function extractAnnotationsFromProto( + proto: any, + collector: AnnotationsMap, + options?: CreateObservableOptions +) { Object.entries(getOwnPropertyDescriptors(proto)).forEach(([key, prop]) => { if (key in collector || key === "constructor") return if (prop.get) { collector[key as any] = computed } else if (isFunction(prop.value)) { - collector[key as any] = autoAction.bound + collector[key as any] = options?.autoBind ? autoAction.bound : autoAction } }) } diff --git a/src/api/observable.ts b/src/api/observable.ts index c0c44fae1..53b7425df 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -43,6 +43,7 @@ export type CreateObservableOptions = { deep?: boolean defaultDecorator?: Annotation proxy?: boolean + autoBind?: boolean } // Predefined bags of create observable options, to avoid allocating temporarily option objects @@ -196,7 +197,8 @@ const observableFactories: IObservableFactory = { ? base : createDynamicObservableObject(base), props, - decorators + decorators, + options ) }, ref: createDecorator(OBSERVABLE_REF), diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index 145bd3ea1..dc14d99c9 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -108,8 +108,8 @@ test("makeObservable has sane defaults", () => { x: true, y: false, double: true, - unbound: action, - bound: true + unbound: true, + bound: action.bound // @ts-expect-error // TODO: enable with TS 3.9 z: true }) @@ -128,6 +128,38 @@ test("makeObservable has sane defaults", () => { expect(t.bound.call(undefined)).toBe(t) }) +test("makeObservable supports autoBind", () => { + class Test { + unbound() { + return this + } + + bound() { + return this + } + + constructor() { + makeObservable( + this, + { + unbound: action, + bound: true + }, + { + autoBind: true + } + ) + } + } + + const t = new Test() + expect(isObservableObject(t)).toBe(true) + expect(isAction(t.unbound)).toBe(true) + expect(isAction(t.bound)).toBe(true) + expect(t.unbound.call(undefined)).toBe(undefined) + expect(t.bound.call(undefined)).toBe(t) +}) + test("makeAutoObservable has sane defaults", () => { class Test { x = 3 @@ -158,7 +190,36 @@ test("makeAutoObservable has sane defaults", () => { expect(isComputedProp(t, "double")).toBe(true) expect(isAction(t.unbound)).toBe(true) expect(isAction(t.bound)).toBe(true) - expect(t.unbound.call(undefined)).toBe(t) // will be bound! + expect(t.unbound.call(undefined)).toBe(undefined) + expect(t.bound.call(undefined)).toBe(undefined) +}) + +test("makeAutoObservable supports autoBind", () => { + class Test { + unbound() { + return this + } + + bound() { + return this + } + + constructor() { + makeAutoObservable( + this, + { + unbound: false + }, + { autoBind: true } + ) + } + } + + const t = new Test() + expect(isObservableObject(t)).toBe(true) + expect(isAction(t.unbound)).toBe(false) + expect(isAction(t.bound)).toBe(true) + expect(t.unbound.call(undefined)).toBe(undefined) expect(t.bound.call(undefined)).toBe(t) }) @@ -181,7 +242,8 @@ test("makeAutoObservable allows overrides", () => { constructor() { makeAutoObservable(this, { - unbound: action, + unbound: true, + bound: action.bound, y: false // @ts-expect-error // TODO: enable with TS 3.9 z: true From 522524a0be4fdb2ba404d2b43058f5678e277b59 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 19:36:14 +0100 Subject: [PATCH 0455/1043] Bumped to typescript 3.9 --- package.json | 2 +- test/v5/base/make-observable.ts | 16 ++++++++++++---- yarn.lock | 8 ++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 71c7b6e26..d81f001ab 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "tape": "^5.0.0", "ts-jest": "^25.4.0", "tsdx": "^0.13.2", - "typescript": "^3.8.3" + "typescript": "^3.9.6" }, "keywords": [ "mobx", diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index dc14d99c9..5e4056262 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -110,9 +110,13 @@ test("makeObservable has sane defaults", () => { double: true, unbound: true, bound: action.bound - // @ts-expect-error - // TODO: enable with TS 3.9 z: true }) + if (3 - 1 === 4) { + makeObservable(this, { + // @ts-expect-error + z: true + }) + } } } @@ -245,9 +249,13 @@ test("makeAutoObservable allows overrides", () => { unbound: true, bound: action.bound, y: false - // @ts-expect-error - // TODO: enable with TS 3.9 z: true }) + if (3 - 1 === 4) { + makeObservable(this, { + // @ts-expect-error + z: true + }) + } } } diff --git a/yarn.lock b/yarn.lock index 18516de81..9cbf98cde 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9395,10 +9395,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.7.3, typescript@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +typescript@^3.7.3, typescript@^3.9.6: + version "3.9.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" From a3fe2a9adccaeddb544b2cb841e13361a2dd00d6 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 20:15:49 +0100 Subject: [PATCH 0456/1043] Fixed UMD dependency on `global` --- notes.md | 12 ++++++------ package.json | 2 +- src/core/globalstate.ts | 6 +++--- src/internal.ts | 1 + src/mobx.ts | 4 +++- src/utils/global.ts | 4 ++++ 6 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/utils/global.ts diff --git a/notes.md b/notes.md index b93197985..2dc172d23 100644 --- a/notes.md +++ b/notes.md @@ -56,23 +56,23 @@ - [x] kill globalstate options? - [x] kill / fix flow types - [x] enable search on docs - - [ ] // TODO: support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html - - [ ] default observable requires reaction? - [x] no binding by default? https://twitter.com/getify/status/1258137826241241088 + - [ ] default observable requires reaction? - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] fix https://github.com/mobxjs/mobx/issues/2394 - - [ ] use autObservable options for codemod (if no superclass) - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - - [ ] set up discussions - - [ ] fix UMD build depending on `global` + - [x] fix UMD build depending on `global` - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - - [ ] fix batching setup + - [ ] fix React unstable batch setup - [ ] post 6.0 + - [ ] set up discussions + - [ ] use autObservable options for codemod (if no superclass)? - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - [ ] set up continous delivery + - [ ] support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html also in Immer? ## Docs / migration guide diff --git a/package.json b/package.json index d81f001ab..dfa9ef0d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "6.0.0-rc.0", + "version": "6.0.0-rc.1", "description": "Simple, scalable state management.", "main": "dist/index.js", "module": "dist/mobx.esm.js", diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 785c60e83..4b5ec4812 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -1,4 +1,4 @@ -import { IDerivation, IObservable, Reaction, die } from "../internal" +import { IDerivation, IObservable, Reaction, die, getGlobal } from "../internal" /** * These values will persist if global state is reset @@ -140,9 +140,8 @@ export class MobXGlobals { let canMergeGlobalState = true let isolateCalled = false -declare const global: any - export let globalState: MobXGlobals = (function () { + let global = getGlobal() if (global.__mobxInstanceCount > 0 && !global.__mobxGlobals) canMergeGlobalState = false if (global.__mobxGlobals && global.__mobxGlobals.version !== new MobXGlobals().version) canMergeGlobalState = false @@ -173,6 +172,7 @@ export function isolateGlobalState() { die(36) isolateCalled = true if (canMergeGlobalState) { + let global = getGlobal() if (--global.__mobxInstanceCount === 0) global.__mobxGlobals = undefined globalState = new MobXGlobals() } diff --git a/src/internal.ts b/src/internal.ts index f327147cd..3204878f9 100644 --- a/src/internal.ts +++ b/src/internal.ts @@ -5,6 +5,7 @@ it will cause undefined errors (for example because super classes or local varia With this file that will still happen, but at least in this file we can magically reorder the imports with trial and error until the build succeeds again. */ +export * from "./utils/global" export * from "./errors" export * from "./utils/utils" export * from "./api/decorators" diff --git a/src/mobx.ts b/src/mobx.ts index 3d48c2def..a86e744ba 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -16,8 +16,10 @@ * */ import { dieHard } from "./errors" +import { getGlobal } from "./utils/global" ;["Symbol", "Map", "Set", "Symbol"].forEach(m => { - if (typeof global[m] === "undefined") { + let g = getGlobal() + if (typeof g[m] === "undefined") { dieHard(`MobX requires global '${m}' to be available or polyfilled`) } }) diff --git a/src/utils/global.ts b/src/utils/global.ts new file mode 100644 index 000000000..468fb150b --- /dev/null +++ b/src/utils/global.ts @@ -0,0 +1,4 @@ +export function getGlobal(): any { + // @ts-ignore + return typeof global !== "undefined" ? global : window +} From 983aeee0f787298017ba7a9b256da5edb17d498b Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 22:12:36 +0100 Subject: [PATCH 0457/1043] Revert "Add spy typings" --- CHANGELOG.md | 1 - src/core/spy.ts | 87 ++----------------- src/types/observablearray.ts | 14 ++- src/types/observablemap.ts | 12 +-- src/types/observableobject.ts | 21 ++--- src/types/observableset.ts | 8 +- src/types/observablevalue.ts | 8 +- test/v4/base/__snapshots__/extras.js.snap | 2 - test/v4/base/__snapshots__/object-api.js.snap | 2 - .../v4/base/__snapshots__/observables.js.snap | 16 ---- test/v4/base/__snapshots__/spy.js.snap | 37 -------- test/v5/base/__snapshots__/extras.js.snap | 2 - test/v5/base/__snapshots__/flow.js.snap | 8 -- test/v5/base/__snapshots__/object-api.js.snap | 2 - .../v5/base/__snapshots__/observables.js.snap | 16 ---- test/v5/base/__snapshots__/spy.js.snap | 39 --------- 16 files changed, 27 insertions(+), 248 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d554deac7..1bbc552d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,6 @@ - Don't omit action name in production [#2263](https://github.com/mobxjs/mobx/issues/2263) by [@elektronik2k5](https://github.com/elektronik2k5) - Update readme to reflect correct scripts by [@elektronik2k5](https://github.com/elektronik2k5) - `prettier` related tweaks by [@elektronik2k5](https://github.com/elektronik2k5) -- Add full types for the spy() function by [@phiresky](https://github.com/phiresky) # 5.15.4 / 4.15.4 diff --git a/src/core/spy.ts b/src/core/spy.ts index 656a50578..6e59d429d 100644 --- a/src/core/spy.ts +++ b/src/core/spy.ts @@ -1,98 +1,23 @@ -import { Lambda, globalState, once, ISetDidChange, IMapDidChange } from "../internal" +import { Lambda, globalState, once } from "../internal" export function isSpyEnabled() { return __DEV__ && !!globalState.spyListeners.length } -export type ArraySpyEvent = - | { - type: "update" - observableKind: "array" - name: string - object: unknown - index: number - newValue: unknown - oldValue: unknown - } - | { - type: "splice" - observableKind: "array" - name: string - object: unknown - index: number - removed: unknown[] - added: unknown[] - removedCount: number - addedCount: number - } -export type ObjectSpyEvent = - | { - type: "add" - observableKind: "object" - name: string - key: string | number | symbol - newValue: unknown - } - | { - type: "remove" - observableKind: "object" - name: string - key: string | number | symbol - oldValue: unknown - } - | { - type: "update" - observableKind: "object" - key: string | number | symbol - name: string - object: unknown - newValue: unknown - oldValue: unknown - } -export type BoxSpyEvent = - | { - type: "create" - observableKind: "box" - name: string - newValue: unknown - } - | { - type: "update" - observableKind: "box" - name: string - newValue: unknown - oldValue: unknown - } -export type PureSpyEvent = - | { type: "scheduled-reaction"; name: string } - | { type: "reaction"; name: string } - | { type: "compute"; name: string } - | { type: "error"; name: string; message: string; error: string } - | { type: "action"; name: string; object: unknown; arguments: unknown[] } - | ObjectSpyEvent - | ArraySpyEvent - | BoxSpyEvent - | (Omit, "name"> & { name: string; key: unknown }) - | (Omit, "name"> & { name: string }) - | { type: "compute"; object: unknown; name: string } - | { type: "report-end-only" } - -type SpyEvent = PureSpyEvent & { spyReportStart?: true; spyReportEnd?: true } - -export function spyReport(event: SpyEvent) { +export function spyReport(event) { if (!__DEV__) return // dead code elimination can do the rest if (!globalState.spyListeners.length) return const listeners = globalState.spyListeners for (let i = 0, l = listeners.length; i < l; i++) listeners[i](event) } -export function spyReportStart(event: PureSpyEvent) { +export function spyReportStart(event) { if (!__DEV__) return - const change = { ...event, spyReportStart: true as const } + const change = { ...event, spyReportStart: true } spyReport(change) } -const END_EVENT: SpyEvent = { spyReportEnd: true, type: "report-end-only" } +const END_EVENT = { spyReportEnd: true } export function spyReportEnd(change?) { if (!__DEV__) return @@ -100,7 +25,7 @@ export function spyReportEnd(change?) { else spyReport(END_EVENT) } -export function spy(listener: (change: SpyEvent) => void): Lambda { +export function spy(listener: (change: any) => void): Lambda { if (!__DEV__) { console.warn(`[mobx.spy] Is a no-op in production builds`) return function () {} diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index d1e3613d1..c6d736010 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -248,19 +248,18 @@ export class ObservableArrayAdministration const notify = hasListeners(this) const change = notify || notifySpy - ? ({ + ? { object: this.proxy_, type: UPDATE, - observableKind: "array", index, newValue, oldValue - } as const) + } : null // The reason why this is on right hand side here (and not above), is this way the uglifier will drop it, but it won't // cause any runtime overhead in development mode without NODE_ENV set, unless spying is enabled - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.atom_.name_ }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.atom_.name_ }) this.atom_.reportChanged() if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -271,19 +270,18 @@ export class ObservableArrayAdministration const notify = hasListeners(this) const change = notify || notifySpy - ? ({ + ? { object: this.proxy_, type: SPLICE, - observableKind: "array", index, removed, added, removedCount: removed.length, addedCount: added.length - } as const) + } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.atom_.name_ }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.atom_.name_ }) this.atom_.reportChanged() // conform: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe if (notify) notifyListeners(this, change) diff --git a/src/types/observablemap.ts b/src/types/observablemap.ts index 9626e6ef5..13fdf5edc 100644 --- a/src/types/observablemap.ts +++ b/src/types/observablemap.ts @@ -48,7 +48,6 @@ export type IMapDidChange = object: ObservableMap name: K // actual the key or index, but this is based on the ancient .observe proposal for consistency type: "update" - observableKind: "map" newValue: V oldValue: V } @@ -56,14 +55,12 @@ export type IMapDidChange = object: ObservableMap name: K type: "add" - observableKind: "map" newValue: V } | { object: ObservableMap name: K type: "delete" - observableKind: "map" oldValue: V } @@ -169,14 +166,13 @@ export class ObservableMap notify || notifySpy ? >{ type: DELETE, - observableKind: "map", object: this, oldValue: (this.data_.get(key)).value_, name: key } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) transaction(() => { this.keysAtom_.reportChanged() this.updateHasMapEntry_(key, false) @@ -208,14 +204,13 @@ export class ObservableMap notify || notifySpy ? >{ type: UPDATE, - observableKind: "map" as const, object: this, oldValue: (observable as any).value_, name: key, newValue } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) observable.setNewValue_(newValue as V) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -242,13 +237,12 @@ export class ObservableMap notify || notifySpy ? >{ type: ADD, - observableKind: "map", object: this, name: key, newValue } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() } diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index b633e7923..d690323b6 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -122,17 +122,16 @@ export class ObservableObjectAdministration const notifySpy = __DEV__ && isSpyEnabled() const change = notify || notifySpy - ? ({ + ? { type: UPDATE, - observableKind: "object", object: this.proxy_ || instance, oldValue: (observable as any).value_, name: key, newValue - } as const) + } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) ;(observable as ObservableValue).setNewValue_(newValue) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() @@ -231,15 +230,14 @@ export class ObservableObjectAdministration delete this.target_[key] const change = notify || notifySpy - ? ({ + ? { type: REMOVE, - observableKind: "object", object: this.proxy_ || target, oldValue: oldValue, name: key - } as const) + } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() } finally { @@ -267,16 +265,15 @@ export class ObservableObjectAdministration const notifySpy = __DEV__ && isSpyEnabled() const change = notify || notifySpy - ? ({ + ? { type: ADD, - observableKind: "object", object: this.proxy_ || this.target_, name: key, newValue - } as const) + } : null - if (__DEV__ && notifySpy) spyReportStart({ ...change!, name: this.name_, key }) + if (__DEV__ && notifySpy) spyReportStart({ ...change, name: this.name_, key }) if (notify) notifyListeners(this, change) if (__DEV__ && notifySpy) spyReportEnd() if (this.pendingKeys_) { diff --git a/src/types/observableset.ts b/src/types/observableset.ts index ebe92c1a7..f50bfc720 100644 --- a/src/types/observableset.ts +++ b/src/types/observableset.ts @@ -38,13 +38,11 @@ export type ISetDidChange = | { object: ObservableSet type: "add" - observableKind: "set" newValue: T } | { object: ObservableSet type: "delete" - observableKind: "set" oldValue: T } @@ -133,12 +131,11 @@ export class ObservableSet implements Set, IInterceptable>{ type: ADD, - observableKind: "set", object: this, newValue: value } : null - if (notifySpy && __DEV__) spyReportStart({ ...change!, name: this.name_ }) + if (notifySpy && __DEV__) spyReportStart(change) if (notify) notifyListeners(this, change) if (notifySpy && __DEV__) spyReportEnd() } @@ -162,13 +159,12 @@ export class ObservableSet implements Set, IInterceptable>{ type: DELETE, - observableKind: "set", object: this, oldValue: value } : null - if (notifySpy && __DEV__) spyReportStart({ ...change!, name: this.name_ }) + if (notifySpy && __DEV__) spyReportStart({ ...change, name: this.name_ }) transaction(() => { this.atom_.reportChanged() this.data_.delete(value) diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 2b79d11fa..73adc4be7 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -64,12 +64,7 @@ export class ObservableValue extends Atom this.value_ = enhancer(value, undefined, name_) if (__DEV__ && notifySpy && isSpyEnabled()) { // only notify spy if this is a stand-alone observable - spyReport({ - type: CREATE, - observableKind: "box", - name: this.name_, - newValue: "" + this.value_ - }) + spyReport({ type: CREATE, name: this.name_, newValue: "" + this.value_ }) } } @@ -86,7 +81,6 @@ export class ObservableValue extends Atom if (__DEV__ && notifySpy) { spyReportStart({ type: UPDATE, - observableKind: "box", name: this.name_, newValue, oldValue diff --git a/test/v4/base/__snapshots__/extras.js.snap b/test/v4/base/__snapshots__/extras.js.snap index 37e48c53d..02ff4de2e 100644 --- a/test/v4/base/__snapshots__/extras.js.snap +++ b/test/v4/base/__snapshots__/extras.js.snap @@ -5,7 +5,6 @@ Array [ Object { "name": "ObservableValue@9", "newValue": 4, - "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -24,7 +23,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, ] `; diff --git a/test/v4/base/__snapshots__/object-api.js.snap b/test/v4/base/__snapshots__/object-api.js.snap index 27548a7ba..784abc025 100644 --- a/test/v4/base/__snapshots__/object-api.js.snap +++ b/test/v4/base/__snapshots__/object-api.js.snap @@ -43,7 +43,6 @@ Array [ "title": "get tea", }, }, - "observableKind": "object", "type": "add", }, }, @@ -55,7 +54,6 @@ Array [ "title": "get tea", }, }, - "observableKind": "object", "oldValue": Object { "title": "get coffee", }, diff --git a/test/v4/base/__snapshots__/observables.js.snap b/test/v4/base/__snapshots__/observables.js.snap index b8db15ff6..b2fb4ff74 100644 --- a/test/v4/base/__snapshots__/observables.js.snap +++ b/test/v4/base/__snapshots__/observables.js.snap @@ -6,41 +6,35 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@1", "newValue": 4, - "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "end1", Object { "key": "a", "name": "ObservableObject@1", "newValue": 5, - "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "end2", Object { @@ -62,7 +56,6 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 6, - "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", @@ -83,21 +76,18 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "post trans2", Object { "key": "a", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "post trans3", ] @@ -112,27 +102,23 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": false, - "observableKind": "object", "oldValue": true, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "b", "name": "ObservableObject@1", "newValue": true, - "observableKind": "object", "oldValue": false, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "transpreend", Object { @@ -162,14 +148,12 @@ Array [ "key": "b", "name": "ObservableObject@1", "newValue": 2, - "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "transpreend", Object { diff --git a/test/v4/base/__snapshots__/spy.js.snap b/test/v4/base/__snapshots__/spy.js.snap index 9156bebb2..52446be64 100644 --- a/test/v4/base/__snapshots__/spy.js.snap +++ b/test/v4/base/__snapshots__/spy.js.snap @@ -18,7 +18,6 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", @@ -43,7 +42,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, ] `; @@ -53,70 +51,59 @@ Array [ Object { "name": "ObservableValue@1", "newValue": "2", - "observableKind": "box", "type": "create", }, Object { "name": "ObservableValue@1", "newValue": 3, - "observableKind": "box", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 4, - "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 5, - "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 6, - "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 7, - "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [ @@ -126,7 +113,6 @@ Array [ "addedCount": 2, "index": 0, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -134,7 +120,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [ @@ -144,7 +129,6 @@ Array [ "addedCount": 2, "index": 2, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -152,14 +136,12 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [], "addedCount": 0, "index": 0, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [ 1, ], @@ -169,69 +151,58 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "index": 2, "name": "ObservableArray@3", "newValue": 5, - "observableKind": "array", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", "newValue": 1, - "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", - "observableKind": "map", "oldValue": 1, "spyReportStart": true, "type": "delete", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 5, - "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 6, - "observableKind": "map", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "Autorun@7", @@ -248,7 +219,6 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 4, - "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -267,31 +237,26 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 5, - "observableKind": "box", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 6, - "observableKind": "box", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ComputedValue@6", @@ -316,14 +281,12 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 7, - "observableKind": "box", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ComputedValue@6", diff --git a/test/v5/base/__snapshots__/extras.js.snap b/test/v5/base/__snapshots__/extras.js.snap index 37e48c53d..02ff4de2e 100644 --- a/test/v5/base/__snapshots__/extras.js.snap +++ b/test/v5/base/__snapshots__/extras.js.snap @@ -5,7 +5,6 @@ Array [ Object { "name": "ObservableValue@9", "newValue": 4, - "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -24,7 +23,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, ] `; diff --git a/test/v5/base/__snapshots__/flow.js.snap b/test/v5/base/__snapshots__/flow.js.snap index 80d218c42..68907ca8f 100644 --- a/test/v5/base/__snapshots__/flow.js.snap +++ b/test/v5/base/__snapshots__/flow.js.snap @@ -25,14 +25,12 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 2, - "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "spyReportEnd": true, @@ -49,27 +47,23 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 5, - "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@10", "newValue": 4, - "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "spyReportEnd": true, @@ -86,14 +80,12 @@ Array [ "key": "a", "name": "ObservableObject@10", "newValue": 3, - "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "spyReportEnd": true, diff --git a/test/v5/base/__snapshots__/object-api.js.snap b/test/v5/base/__snapshots__/object-api.js.snap index 47e616ce9..8fb4bf210 100644 --- a/test/v5/base/__snapshots__/object-api.js.snap +++ b/test/v5/base/__snapshots__/object-api.js.snap @@ -31,7 +31,6 @@ Array [ "title": "get tea", }, "object": "skip", - "observableKind": "object", "type": "add", }, }, @@ -39,7 +38,6 @@ Array [ "observe": Object { "name": "a", "object": "skip", - "observableKind": "object", "oldValue": Object { "title": "get coffee", }, diff --git a/test/v5/base/__snapshots__/observables.js.snap b/test/v5/base/__snapshots__/observables.js.snap index b8db15ff6..b2fb4ff74 100644 --- a/test/v5/base/__snapshots__/observables.js.snap +++ b/test/v5/base/__snapshots__/observables.js.snap @@ -6,41 +6,35 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "a", "name": "ObservableObject@1", "newValue": 4, - "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "end1", Object { "key": "a", "name": "ObservableObject@1", "newValue": 5, - "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "end2", Object { @@ -62,7 +56,6 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": 6, - "observableKind": "object", "oldValue": 5, "spyReportStart": true, "type": "update", @@ -83,21 +76,18 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "post trans2", Object { "key": "a", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "post trans3", ] @@ -112,27 +102,23 @@ Array [ "key": "a", "name": "ObservableObject@1", "newValue": false, - "observableKind": "object", "oldValue": true, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "b", "name": "ObservableObject@1", "newValue": true, - "observableKind": "object", "oldValue": false, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "transpreend", Object { @@ -162,14 +148,12 @@ Array [ "key": "b", "name": "ObservableObject@1", "newValue": 2, - "observableKind": "object", "oldValue": 1, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, "transpreend", Object { diff --git a/test/v5/base/__snapshots__/spy.js.snap b/test/v5/base/__snapshots__/spy.js.snap index 748b4d97e..f61975e5b 100644 --- a/test/v5/base/__snapshots__/spy.js.snap +++ b/test/v5/base/__snapshots__/spy.js.snap @@ -18,7 +18,6 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 3, - "observableKind": "object", "oldValue": 2, "spyReportStart": true, "type": "update", @@ -43,7 +42,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "arguments": Array [ @@ -57,14 +55,12 @@ Array [ "key": "x", "name": "ObservableObject@1", "newValue": 4, - "observableKind": "object", "oldValue": 3, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ObservableObject@1.y", @@ -89,70 +85,59 @@ Array [ Object { "name": "ObservableValue@1", "newValue": "2", - "observableKind": "box", "type": "create", }, Object { "name": "ObservableValue@1", "newValue": 3, - "observableKind": "box", "oldValue": 2, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 4, - "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "c", "name": "ObservableObject@2", "newValue": 5, - "observableKind": "object", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 6, - "observableKind": "object", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "d", "name": "ObservableObject@2", "newValue": 7, - "observableKind": "object", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [ @@ -162,7 +147,6 @@ Array [ "addedCount": 2, "index": 0, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -170,7 +154,6 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [ @@ -180,7 +163,6 @@ Array [ "addedCount": 2, "index": 2, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [], "removedCount": 0, "spyReportStart": true, @@ -188,14 +170,12 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "added": Array [], "addedCount": 0, "index": 0, "name": "ObservableArray@3", - "observableKind": "array", "removed": Array [ 1, ], @@ -205,69 +185,58 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "index": 2, "name": "ObservableArray@3", "newValue": 5, - "observableKind": "array", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", "newValue": 1, - "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "g", "name": "ObservableMap@4", - "observableKind": "map", "oldValue": 1, "spyReportStart": true, "type": "delete", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 5, - "observableKind": "map", "spyReportStart": true, "type": "add", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "key": "i", "name": "ObservableMap@4", "newValue": 6, - "observableKind": "map", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "Autorun@7", @@ -284,7 +253,6 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 4, - "observableKind": "box", "oldValue": 3, "spyReportStart": true, "type": "update", @@ -303,31 +271,26 @@ Array [ }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 5, - "observableKind": "box", "oldValue": 4, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ObservableValue@1", "newValue": 6, - "observableKind": "box", "oldValue": 5, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ComputedValue@6", @@ -352,14 +315,12 @@ Array [ Object { "name": "ObservableValue@1", "newValue": 7, - "observableKind": "box", "oldValue": 6, "spyReportStart": true, "type": "update", }, Object { "spyReportEnd": true, - "type": "report-end-only", }, Object { "name": "ComputedValue@6", From 18d3087ee0f96dfa69aa0180f0ec9ad667c36cae Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 10 Jul 2020 22:21:48 +0100 Subject: [PATCH 0458/1043] Attempt to fix #2394 --- notes.md | 4 ++-- website/i18n/en.json | 2 +- website/siteConfig.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/notes.md b/notes.md index 2dc172d23..75d1b3830 100644 --- a/notes.md +++ b/notes.md @@ -59,8 +59,7 @@ - [x] no binding by default? https://twitter.com/getify/status/1258137826241241088 - [ ] default observable requires reaction? - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - - [ ] fix https://github.com/mobxjs/mobx/issues/2394 - - [ ] merge https://github.com/mobxjs/mobx/pull/2389 + - [x] fix https://github.com/mobxjs/mobx/issues/2394 - [x] fix UMD build depending on `global` - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 @@ -68,6 +67,7 @@ autoMakeObservable - [ ] fix React unstable batch setup - [ ] post 6.0 + - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - [ ] set up discussions - [ ] use autObservable options for codemod (if no superclass)? - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 diff --git a/website/i18n/en.json b/website/i18n/en.json index 80416e10c..d25763b3e 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -45,7 +45,7 @@ "sidebar_label": "Frequently Asked Questions" }, "intro/concepts": { - "title": "Concepts & Principles", + "title": "intro/concepts", "sidebar_label": "Concepts & Principles" }, "intro/how-to-read": { diff --git a/website/siteConfig.js b/website/siteConfig.js index f87b85cae..dbb4d6c48 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -31,7 +31,7 @@ const siteConfig = { // For github.io type URLs, you would set the url and baseUrl like: // url: 'https://facebook.github.io', // baseUrl: '/test-site/', - url: "https://mobx.js.org/", // Your website URL + url: "https://mobx.js.org", // Your website URL baseUrl: "/", // Base URL for your project */ docsUrl: "", // trim 'docs/ prefix cname: "mobx.js.org", // needed for github pages to work under a domain From 9e40293e6b4141379812991716f97491c0913e63 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 11 Jul 2020 11:33:53 +0100 Subject: [PATCH 0459/1043] WIP --- notes.md | 5 +++-- test/v5/base/make-observable.ts | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/notes.md b/notes.md index 75d1b3830..b4e78cf52 100644 --- a/notes.md +++ b/notes.md @@ -57,10 +57,11 @@ - [x] kill / fix flow types - [x] enable search on docs - [x] no binding by default? https://twitter.com/getify/status/1258137826241241088 - - [ ] default observable requires reaction? - - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [x] fix https://github.com/mobxjs/mobx/issues/2394 - [x] fix UMD build depending on `global` + - [ ] check coverage + - [ ] default observable requires reaction? + - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use diff --git a/test/v5/base/make-observable.ts b/test/v5/base/make-observable.ts index 5e4056262..54bc760ec 100644 --- a/test/v5/base/make-observable.ts +++ b/test/v5/base/make-observable.ts @@ -11,6 +11,7 @@ import { autorun, extendObservable } from "../../../src/mobx" +import { mobxDecoratorsSymbol, configure } from "../../../src/internal" test("makeObservable picks up decorators", () => { class Test { @@ -427,3 +428,17 @@ test("extendObservable can be used late and support non-enumerable getters #2386 expect(isComputedProp(i, "double")).toBe(true) expect(isAction(i.inc)).toBe(true) }) + +test("makeObservable doesn't trigger in always mode'", () => { + configure({ + enforceActions: "always" + }) + class C { + x = 3 + constructor() { + makeAutoObservable(this) + } + } + + expect(new C()).toBeTruthy() +}) From 28c8f44abbc962237520de9fee4907e255a14a1c Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 11 Jul 2020 18:41:55 +0100 Subject: [PATCH 0460/1043] Some fixes after analysing coverage report --- notes.md | 5 +++-- src/api/action.ts | 5 ----- src/api/observable.ts | 14 +------------- src/errors.ts | 7 ------- src/mobx.ts | 4 ++-- src/types/observablearray.ts | 8 +------- src/types/observableobject.ts | 8 ++++---- src/utils/utils.ts | 20 +++++++++----------- test/v4/base/observables.js | 15 --------------- test/v5/base/observables.js | 15 --------------- test/v5/base/typescript-decorators.ts | 20 +++++++++++++++++++- 11 files changed, 39 insertions(+), 82 deletions(-) diff --git a/notes.md b/notes.md index b4e78cf52..10bcc7183 100644 --- a/notes.md +++ b/notes.md @@ -59,9 +59,10 @@ - [x] no binding by default? https://twitter.com/getify/status/1258137826241241088 - [x] fix https://github.com/mobxjs/mobx/issues/2394 - [x] fix UMD build depending on `global` + - [x] ~default observable requires reaction?~ - [ ] check coverage - - [ ] default observable requires reaction? - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) + - [ ] re-execute perf checks - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use @@ -99,7 +100,6 @@ Why declare fields * [ ] Breaking: can no longer re-decorate fields already decorated by a superclass * [ ] Breaking: methods will be actions by default in `extendObservable` / `observable` * [ ] Breaking: `decorate` has been removed -* [ ] Breaking: `observableRequiresReaction` is now the default * [ ] Breaking: `enforceActions` is now defaulted to `observed`, but now generates a warning rather than an error * [ ] Breaking: `runInAction` now longer supports a name as first argument. Use an action or named function instead * [ ] Breaking: `computed` does not accept setter function as second argument anymore, use `options.set` instead @@ -141,6 +141,7 @@ Why declare fields * [ ] Breaking: strict mode defaults to observed now * [ ] killed option `computedConfigurable` as it was the default already * [ ] document: `autoBind` options for observable / extendObservable / makeObserver +* [ ] document: linting options ## NOTES diff --git a/src/api/action.ts b/src/api/action.ts index 9009c61a9..fea89e51a 100644 --- a/src/api/action.ts +++ b/src/api/action.ts @@ -1,5 +1,4 @@ import { - addHiddenProp, createAction, executeAction, Annotation, @@ -72,7 +71,3 @@ export function runInAction(fn: () => T): T { export function isAction(thing: any) { return isFunction(thing) && thing.isMobxAction === true } - -export function defineBoundAction(target: any, propertyName: string, fn: Function) { - addHiddenProp(target, propertyName, createAction(propertyName, fn.bind(target))) -} diff --git a/src/api/observable.ts b/src/api/observable.ts index 53b7425df..b78e5912c 100644 --- a/src/api/observable.ts +++ b/src/api/observable.ts @@ -28,7 +28,6 @@ import { globalState, assign, die, - isString, isStringish } from "../internal" @@ -56,19 +55,8 @@ export const defaultCreateObservableOptions: CreateObservableOptions = { } Object.freeze(defaultCreateObservableOptions) -function assertValidOption(key: string) { - if (!/^(deep|name|equals|defaultDecorator|proxy)$/.test(key)) - die(`invalid option for (extend)observable: ${key}`) -} - export function asCreateObservableOptions(thing: any): CreateObservableOptions { - if (thing == null) return defaultCreateObservableOptions - if (isString(thing)) return { name: "" + thing, deep: true, proxy: true } - if (__DEV__) { - if (typeof thing !== "object") return die("expected options object") - Object.keys(thing).forEach(assertValidOption) - } - return thing as CreateObservableOptions + return thing || defaultCreateObservableOptions } export function getEnhancerFromOption(options: CreateObservableOptions): IEnhancer { diff --git a/src/errors.ts b/src/errors.ts index 395a23ca2..c89edd00d 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -87,10 +87,3 @@ export function die(error: string | keyof typeof errors, ...args: any[]): never : `[MobX] ${error}` ) } - -/** - * Like die, but errors will be preserved in prod builds - */ -export function dieHard(error: string): never { - throw new Error(`[MobX] ${error}`) -} diff --git a/src/mobx.ts b/src/mobx.ts index a86e744ba..dc9f09f62 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -15,12 +15,12 @@ * - utils/ Utility stuff. * */ -import { dieHard } from "./errors" +import { die } from "./errors" import { getGlobal } from "./utils/global" ;["Symbol", "Map", "Set", "Symbol"].forEach(m => { let g = getGlobal() if (typeof g[m] === "undefined") { - dieHard(`MobX requires global '${m}' to be available or polyfilled`) + die(`MobX requires global '${m}' to be available or polyfilled`) } }) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index c6d736010..d31028ce7 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -81,9 +81,6 @@ const arrayTraps = { const adm: ObservableArrayAdministration = target[$mobx] if (name === $mobx) return adm if (name === "length") return adm.getArrayLength_() - if (typeof name === "number") { - adm.get_(name) - } if (typeof name === "string" && !isNaN(name as any)) { adm.get_(parseInt(name)) } @@ -97,9 +94,6 @@ const arrayTraps = { if (name === "length") { adm.setArrayLength_(value) } - if (typeof name === "number") { - adm.set_(name, value) - } if (typeof name === "symbol" || isNaN(name)) { target[name] = value } else { @@ -475,7 +469,7 @@ addArrayExtension("reduce", reduceLikeFunc) addArrayExtension("reduceRight", reduceLikeFunc) function addArrayExtension(funcName, funcFactory) { - if (Array.prototype[funcName] === "function") { + if (typeof Array.prototype[funcName] === "function") { arrayExtensions[funcName] = funcFactory(funcName) } } diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index d690323b6..f9b316d47 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -20,7 +20,6 @@ import { interceptChange, isObject, isPlainObject, - isPropertyConfigurable, isSpyEnabled, notifyListeners, referenceEnhancer, @@ -163,7 +162,7 @@ export class ObservableObjectAdministration enhancer: IEnhancer = this.defaultEnhancer_ ) { const { target_: target } = this - assertPropertyConfigurable(target, propName) + if (__DEV__) assertPropertyConfigurable(target, propName) if (hasInterceptors(this)) { const change = interceptChange(this, { @@ -197,8 +196,9 @@ export class ObservableObjectAdministration options.name = options.name || `${this.name_}.${stringifyKey(propName)}` options.context = this.proxy_ || target this.values_.set(propName, new ComputedValue(options)) - if (propertyOwner === target || isPropertyConfigurable(propertyOwner, propName)) - defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)) + // Doesn't seem we need this condition: + // if (propertyOwner === target || isPropertyConfigurable(propertyOwner, propName)) + defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)) } remove_(key: PropertyKey) { diff --git a/src/utils/utils.ts b/src/utils/utils.ts index f7fa754fd..367337be4 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -103,18 +103,16 @@ export function addHiddenFinalProp(object: any, propName: PropertyKey, value: an }) } -export function isPropertyConfigurable(object: any, prop: PropertyKey): boolean { - const descriptor = getDescriptor(object, prop) - return !descriptor || (descriptor.configurable !== false && descriptor.writable !== false) -} - export function assertPropertyConfigurable(object: any, prop: PropertyKey) { - if (__DEV__ && !isPropertyConfigurable(object, prop)) - die( - `Cannot make property '${stringifyKey( - prop - )}' observable, it is not configurable and writable in the target object` - ) + if (__DEV__) { + const descriptor = getDescriptor(object, prop) + if (descriptor?.configurable === false || descriptor?.writable === false) + die( + `Cannot make property '${stringifyKey( + prop + )}' observable, it is not configurable and writable in the target object` + ) + } } export function createInstanceofPredicate( diff --git a/test/v4/base/observables.js b/test/v4/base/observables.js index 91ffc5c73..8b7be6d01 100644 --- a/test/v4/base/observables.js +++ b/test/v4/base/observables.js @@ -400,21 +400,6 @@ test("props4", function () { expect(x.sum).toBe(13) }) -test("extend observable multiple prop maps", function () { - const x = { a: 1 } - expect(() => { - mobx.extendObservable( - x, - {}, - {}, - { - c: 3, - d: 4 - } - ) - }).toThrow(/invalid option for \(extend\)observable: c/) -}) - test("object enumerable props", function () { const x = mobx.observable({ a: 3, diff --git a/test/v5/base/observables.js b/test/v5/base/observables.js index ecfe9dedb..86bbc596e 100644 --- a/test/v5/base/observables.js +++ b/test/v5/base/observables.js @@ -400,21 +400,6 @@ test("props4", function () { expect(x.sum).toBe(13) }) -test("extend observable multiple prop maps", function () { - const x = { a: 1 } - expect(() => { - mobx.extendObservable( - x, - {}, - {}, - { - c: 3, - d: 4 - } - ) - }).toThrow(/invalid option for \(extend\)observable: c/) -}) - test("object enumerable props", function () { const x = mobx.observable({ a: 3, diff --git a/test/v5/base/typescript-decorators.ts b/test/v5/base/typescript-decorators.ts index 4c1c29c0e..2db712dcd 100644 --- a/test/v5/base/typescript-decorators.ts +++ b/test/v5/base/typescript-decorators.ts @@ -156,7 +156,7 @@ test("box", () => { get width() { return this.height * this.sizes.length * this.someFunc() * (this.uninitialized ? 2 : 1) } - @action + @action("test") addSize() { this.sizes.push(3) this.sizes.push(4) @@ -1025,6 +1025,24 @@ test("@observable.shallow (TS)", () => { t.equal(a.arr[1] === todo2, true) }) +test("@observable.shallow - 2 (TS)", () => { + class A { + @observable.shallow arr: Record = { x: { todo: 1 } } + constructor() { + makeObservable(this) + } + } + + const a = new A() + const todo2 = { todo: 2 } + a.arr.y = todo2 + t.equal(mobx.isObservable(a.arr), true) + t.equal(mobx.isObservableProp(a, "arr"), true) + t.equal(mobx.isObservable(a.arr.x), false) + t.equal(mobx.isObservable(a.arr.y), false) + t.equal(a.arr.y === todo2, true) +}) + test("@observable.deep (TS)", () => { class A { @observable.deep arr = [{ todo: 1 }] From c20acf510bae6ec3ea2b4e902658699948aeea92 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 12 Jul 2020 21:57:33 +0100 Subject: [PATCH 0461/1043] WIP on configurig and migrating MobX --- docs/best/decorators.md | 66 ++++-------------------- docs/best/limitations-without-proxies.md | 58 --------------------- docs/faq/migrate-to-6.md | 47 +++++++++++++++++ docs/intro/overview.md | 1 + docs/refguide/configure.md | 56 ++++++++++++++++---- tsconfig.test.json | 3 +- website/i18n/en.json | 2 +- website/sidebars.json | 6 +-- website/siteConfig.js | 8 ++- 9 files changed, 114 insertions(+), 133 deletions(-) delete mode 100644 docs/best/limitations-without-proxies.md create mode 100644 docs/faq/migrate-to-6.md diff --git a/docs/best/decorators.md b/docs/best/decorators.md index ece311767..98e9fb785 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -45,84 +45,44 @@ MobX before version 6 did not require the `makeObservable(this)` call in the con We intend to continue to support decorators in this form. -## Decorator differences +Note: When migrating from MobX 4/5 to 6, we recommend to always run the code mode, as even in the case where you keep using decorators, the `makeObservable` calls need to be generated. See the [migration guide](../faq/migrate-to-6) for details. -- You cannot pass (options)[../refguide/computed-options] into `@computed` when `computed` is used as a decorator. `computed.struct` is available to enable strucural comparison. +## Using `observer` as decorator -## Upgrading your code with the `mobx-undecorate` codemod +The `observer` function from `mobx-react` is both a function and a decorator that can be used on class components: -If you are an existing MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. - -The [`mobx-undecorate`](https://www.npmjs.com/package/mobx-undecorate) package provides a codemod that can automatically update your code to be conformant to MobX 6. There is no need to install it; instead you download and execute it using the [`npx`](https://www.npmjs.com/package/npx) tool which you do need to install if you haven't already. - -To get rid of all uses of MobX decorators and replace them with the equivalent `makeObservable` calls, go to the directory that contains your source code and run: - -```shell -npx mobx-undecorate -``` - -MobX will continue to support decorators -- so if you want to retain them -and only introduce `makeObservable(this)` where required, you can use the `--keepDecorators` option: - -```shell -npx mobx-undecorate --keepDecorators +```javascript +@observer +class Timer extends React.Component { + /* ... */ +} ``` -### limitations of `mobx-undecorate` - -The `mobx-undecorate` command has to introduce a constructor in classes that do not yet have one. If base class of the constructor expects arguments, the codemod cannot introduce these arguments for the subclass being upgraded, and the `super` call won't pass them either. You have to fix these manually. - -`mobx-undecorate` outputs warnings for these cases when it's run. - -We do have a special case for React class components to do the right thing and -pass along `props` to the superclass. - ## How to enable decorator support We do not recommend new codebases that use MobX use decorators until the point when they become an official part of the language, but you can still use them. It does require setup for transpilation: you have to use Babel or TypeScript. ### TypeScript -Enable the compiler option `"experimentalDecorators": true` in your `tsconfig.json`. +Enable the compiler option `"experimentalDecorators": true` and `"useDefineForClassFields": true` in your `tsconfig.json`. ### Babel 7 -Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators`. And enable it in your `.babelrc` file: +Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators`. And enable it in your `.babelrc` file (note that the order is important): ```json { "plugins": [ ["@babel/plugin-proposal-decorators", { "legacy": true }], - ["@babel/plugin-proposal-class-properties", { "loose": true }] + ["@babel/plugin-proposal-class-properties", { "loose": false }] ] } ``` -Note that the `legacy` mode is important (as is putting the decorators proposal first). - ### Decorator syntax and Create React App (v2) Decorators are only supported out of the box when using TypeScript in `create-react-app@^2.1.1` and newer. In older versions or when using vanilla JavaScript use eject, or the [customize-cra](https://github.com/arackaf/customize-cra) package. -### Using `observer` from `mobx-react` - -The `observer` function from `mobx-react` is both a decorator and a function, that means that all these syntax variants will work: - -```javascript -const Timer = observer((props) => ( - /* rendering */ -)) - -const Timer = observer(class Timer extends React.Component { - /* ... */ -}) - -@observer -class Timer extends React.Component { - /* ... */ -} -``` - ## Disclaimer: Limitations of decorator syntax: _The current transpiler implementations of decorator syntax are quite limited and don't behave exactly the same. @@ -136,7 +96,3 @@ The following patterns are not officially supported by the MobX community: - Decorating static class members - Combining decorators provided by MobX with other decorators - Hot module reloading (HMR) / React-hot-loader might not work as expected - -Decorated properties might not be visible yet on class instances as _own_ property until the first read / write to that property occurred. - -(N.B.: not supported doesn't mean it doesn't work, it means that if it doesn't work, reported issues will not be processed until the official spec has been moved forward) diff --git a/docs/best/limitations-without-proxies.md b/docs/best/limitations-without-proxies.md deleted file mode 100644 index f0466f314..000000000 --- a/docs/best/limitations-without-proxies.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -sidebar_label: Limitations without Proxy [🚀] -hide_title: true ---- - -# Limitations without Proxy support [🚀] - -MobX 6 works on any ES 5 environment, but if your environment or browser does not have [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy), there are some limitations: - -- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. -- Adding properties to existing observable objects after creation is not automatically picked up. Either use observable maps instead, or use the the build in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. - -Luckily, most environments support Proxies these days. MobX is configured -to fail if `Proxy` is not available, but you can [change that](../refguide/configure.md#useproxies), for instance: - -```javascript -import { configure } from "mobx" - -configure({ useProxies: "never" }) // or "ifavailable" -``` - -## Arrays - -_This limitation only applies if MobX runs in an environment without Proxy support_ - -Due to limitations of native arrays, if Proxy support is not available, `observable.array` will create a faux-array (array-like object) instead of a real array. -In practice, these arrays work just as well as native arrays and all native methods are supported, including index assignments, up-to and including the length of the array. - -Bear in mind however that `Array.isArray(observable([1, 2, 3]))` returns `false`. -Some native array manipulation methods as well as external libraries use `Array.isArray` and fail to work properly if it returns `false`. Examples include `Array.concat` as well as libraries like `lodash`. - -So whenever you need to pass an observable array to an external library or use the observable array as an argument to native array manipulation methods, you should _create a shallow copy by using `array.slice()`_, which will cause `Array.isArray(observable([]).slice())` to yield `true`. Alternatively you can use the `toJS` -method on observable array. As long as the external library has no intent to modify the array, this works as expected. - -You can use [`isObservableArray(observable)`](../refguide/array.md#isobservablearray) to check whether something is an observable array, and [`isArrayLike`](../refguide/array.md#isarraylike) to check whether something is an array at all, observable or not. - -## Objects - -_This limitation only applies if MobX run in an environment without Proxy support. -If you are sure you are in an environment that does have Proxy support and it -still does not work, it could be you forgot to mark the object observable._ - -In an environment that does not support Proxies, MobX observable _objects_ do not detect or react to property assignments that weren't declared observable before. So, if you do: - -```javascript -object.someNewProp = value -``` - -is not picked up by MobX. - -So MobX observable objects act as records with predefined keys. - -You can use `extendObservable(target, props)` to introduce new observable properties to an object. -However object iterators like `for .. in` or `Object.keys()` won't react to this automatically. -If you need a dynamically keyed object in an environment without Proxy support, for example to store users by id, create observable _maps_ using [`observable.map`](../refguide/map.md) or use the utility methods as exposed by the [Object API](../refguide/object-api.md). -For more info see [what will MobX react to?](https://mobx.js.org/best/react.html#what-does-mobx-react-to). - -See this [blog post](https://medium.com/@trekinbami/observe-changes-in-dynamically-keyed-objects-with-mobx-and-react-24b4f857bae9) for the different options available to work with dynamically keyed objects in environments without Proxy support. diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md new file mode 100644 index 000000000..ae0d1e63f --- /dev/null +++ b/docs/faq/migrate-to-6.md @@ -0,0 +1,47 @@ +--- +sidebar_label: Migrating to MobX 6 [🚀] +hide_title: true +--- + +# TODO + +on latest MobX 4 / 5 + +From 4: set useProxies: "never" + +With or without proxies + +No loose fields + TS option) + + ["@babel/plugin-proposal-class-properties", { "loose": false }] + +TS +"useDefineForClassFields": true + +## Upgrading your code with the `mobx-undecorate` codemod + +If you are an existing MobX user you have code that uses a lot of decorators, or the equivalent calls to `decorate`. + +The [`mobx-undecorate`](https://www.npmjs.com/package/mobx-undecorate) package provides a codemod that can automatically update your code to be conformant to MobX 6. There is no need to install it; instead you download and execute it using the [`npx`](https://www.npmjs.com/package/npx) tool which you do need to install if you haven't already. + +To get rid of all uses of MobX decorators and replace them with the equivalent `makeObservable` calls, go to the directory that contains your source code and run: + +```shell +npx mobx-undecorate +``` + +MobX will continue to support decorators -- so if you want to retain them +and only introduce `makeObservable(this)` where required, you can use the `--keepDecorators` option: + +```shell +npx mobx-undecorate --keepDecorators +``` + +### limitations of `mobx-undecorate` + +The `mobx-undecorate` command has to introduce a constructor in classes that do not yet have one. If base class of the constructor expects arguments, the codemod cannot introduce these arguments for the subclass being upgraded, and the `super` call won't pass them either. You have to fix these manually. + +`mobx-undecorate` outputs warnings for these cases when it's run. + +We do have a special case for React class components to do the right thing and +pass along `props` to the superclass. diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 40c5ee4e6..ca2cd2adb 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -87,6 +87,7 @@ setInterval(() => { ``` These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. +Notice that making updates asynchronously doesn't require any special wiring; since MobX is a \_re_active system, it doesn't matter how or even when state updates are triggered; the reactivity system will propagate changes in any case. **_MobX helps you do things in a simple straightforward way_**. diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index deaea0a79..6af359af4 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,10 +1,54 @@ --- title: Configuring MobX -sidebar_label: Configuring MobX [🚀] +sidebar_label: Configuring MobX hide_title: true --- -# Configuring MobX [🚀] +# Configuring MobX + +MobX has several configuration depending on how you prefer to use MobX, which JavaScript engines you want to target, and whether you want MobX to hint at best practices. +Most configuration options can be set by using the `configure` method as provided by MobX. + +## Proxy support + +By default MobX uses proxies to make arrays and plain objects observable. Proxies provide the best performance and most concistent behavior accross environments. +However, if you are targetting an environment that doesn't support proxies, proxy support has to be disabled. +Most notably this is the case when targetting Internet Explorer or React Native without using the Hermes engine. + +Proxy support can be disabled by using `configure`: + +```typescript +import { configure } from "mobx" + +configure({ + useProxies: "never" +}) +``` + +Accepted values for the `useProxies` configuration are: + +- `"always"` (default): MobX is expected to only run in environments with [`Proxy` support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). MobX will error if these are not available. +- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations](../best/limitations-without-proxies.md). +- `"ifavailable"`: (Experimental option) Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. The benefit of this mode is that MobX will try to warn if API's or language features that wouldn't work in ES5 enviroments are used, triggering errors when hitting an ES5 limitation when running on a modern environment. + +Note: before MobX 6 one had to pick either MobX 4 for older engines, or MobX 5 for new engines. However, MobX 6 supports both, although polyfills for certain api's like Map will be required when targetting older JavaScript engines. + +Note: Proxies cannot be polyfilled. Even though polyfills do exist, they don't support the full spec and are unsuitable for MobX. Don't use them. + +### Limitations without Proxy support + +1. Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. For example using observable arrays in concat arrays doesn't work as expected. So '.slice()' them first. +2. Adding or deleting properties to existing observable plain objects after creation is not automatically picked up. If you intend to use objects as index based lookup maps, in other words, as dymamic collection of things, use observable maps instead. + +## Decorator support + +For enabling experimental decorator support see [Decorators](../best/decorators). + +## Linting + +TODO + +## Further options Usage: @@ -132,11 +176,3 @@ configure({ } }) ``` - -### `useProxies` - -Accepted values: - -- `"always"` (default): MobX is expected to only run in environments with [`Proxy` support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). It is an error if these are not available. -- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations](../best/limitations-without-proxies.md). -- `"ifavailable"`: Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. This causes various [limitations](../best/limitations-without-proxies.md). You still need to write code taking these limitations into account. diff --git a/tsconfig.test.json b/tsconfig.test.json index ee052daf4..b9529aa6d 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -5,7 +5,8 @@ "lib": ["esnext"], "noUnusedLocals": false, "moduleResolution": "node", - "experimentalDecorators": true + "experimentalDecorators": true, + "useDefineForClassFields": true }, "include": ["src/**/*.ts", "test/**/*.ts"] } diff --git a/website/i18n/en.json b/website/i18n/en.json index d25763b3e..06b69c4a7 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -117,7 +117,7 @@ }, "refguide/configure": { "title": "Configuring MobX", - "sidebar_label": "Configuring MobX [🚀]" + "sidebar_label": "Configuring MobX" }, "refguide/extend-observable": { "title": "refguide/extend-observable", diff --git a/website/sidebars.json b/website/sidebars.json index 2a8745e25..2a3fa64f3 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -56,10 +56,10 @@ "refguide/mobx-utils" ], "Tips & Tricks": [ - "best/store", + "refguide/configure", "best/decorators", - "best/limitations-without-proxies", - "refguide/configure" + "best/store", + "faq/migrate-to-6" ], "Extending MobX": [ "refguide/extending", diff --git a/website/siteConfig.js b/website/siteConfig.js index dbb4d6c48..e3ad45a18 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -57,6 +57,8 @@ const siteConfig = { { href: "https://github.com/mobxjs/mobx", label: "Github" } ], + // docsSideNavCollapsible: true, + // If you have users set above, you add it here: users, @@ -95,11 +97,7 @@ myOtherFont: [ // Add custom scripts here that would be placed in # Resources diff --git a/docs/backers-sponsors.md b/docs/backers-sponsors.md index c523fce45..048acedd4 100644 --- a/docs/backers-sponsors.md +++ b/docs/backers-sponsors.md @@ -3,6 +3,8 @@ title: MobX Backers and Sponsors hide_title: true --- + + # MobX Backers and Sponsors Thanks to your backers and sponsors for their generous support! diff --git a/docs/best/actions.md b/docs/best/actions.md index 8f2a625f9..157fff8ba 100644 --- a/docs/best/actions.md +++ b/docs/best/actions.md @@ -4,6 +4,8 @@ title: Asynchronous actions hide_title: true --- + + # Asynchronous actions If you wrap a function in `action` or mark it as such with `makeObservable`, diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 98e9fb785..47bede765 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -3,6 +3,8 @@ sidebar_label: Decorators in MobX [🚀] hide_title: true --- + + # Decorators in MobX [🚀] MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. diff --git a/docs/best/dispose-reactions.md b/docs/best/dispose-reactions.md index 39cc21bc1..cb63bf185 100644 --- a/docs/best/dispose-reactions.md +++ b/docs/best/dispose-reactions.md @@ -4,6 +4,8 @@ sidebar_label: Always dispose reactions hide_title: true --- + + # Always dispose reactions All forms of `autorun`, `reaction`, `when`, `observe` and `intercept` are only garbage collected if all objects they observe are garbage collected themselves. diff --git a/docs/best/stateless-HMR.md b/docs/best/stateless-HMR.md index 5a4b4f2c4..efd5b234d 100644 --- a/docs/best/stateless-HMR.md +++ b/docs/best/stateless-HMR.md @@ -4,9 +4,9 @@ sidebar_label: Hot Module Reloading with Stateless Components hide_title: true --- -# Hot Module Reloading with Stateless Components + -
    +# Hot Module Reloading with Stateless Components One thing that can be a challenge when getting started with MobX (and React in general) is understanding why Hot Module Reloading (HMR) sometimes breaks. When you initially get it working, it seems like magic (and it kind of is), however there's at least one rough edge with regard to HMR and React: stateless components. Since stateless components don't explicitly identify themselves as React components, HMR doesn't quite know what to do with them, and so you'll often see warnings in your console like this: diff --git a/docs/best/store.md b/docs/best/store.md index d576949ea..2deb56829 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -4,6 +4,8 @@ title: Best Practices for building large scale maintainable projects hide_title: true --- + + # Best Practices for building large scale maintainable projects This section contains some best practices we discovered at Mendix while working with MobX. diff --git a/docs/best/trace.md b/docs/best/trace.md index 0cd285f59..8f04c65d6 100644 --- a/docs/best/trace.md +++ b/docs/best/trace.md @@ -4,6 +4,8 @@ title: Using `trace` for debugging hide_title: true --- + + # Using `trace` for debugging Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 9998fa265..86615b055 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -3,6 +3,8 @@ sidebar_label: Understanding MobX hide_title: true --- + + # What does MobX react to? MobX usually reacts to exactly the things you expect it to. diff --git a/docs/faq/faq.md b/docs/faq/faq.md index 593e609e3..d5f70972a 100644 --- a/docs/faq/faq.md +++ b/docs/faq/faq.md @@ -4,6 +4,8 @@ title: FAQ hide_title: true --- + + ## FAQ ##### Which browsers are supported? diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index 53bb58a6a..0337a1bd4 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -3,6 +3,8 @@ sidebar_label: Migrating to MobX 6 [🚀] hide_title: true --- + + MobX 6 is quite different from MobX 5. This pages covers a migration guide from MobX 4 and 5 to 6, and an extensive list of all the changes. # Migrating to MobX 6 diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 303ff7298..096c7b23e 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -3,6 +3,8 @@ sidebar_label: Concepts & Principles hide_title: true --- + + # Concepts & Principles ## Concepts diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index bff1b9a86..17ef8d70d 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -4,6 +4,8 @@ sidebar_label: How to read this documentation hide_title: true --- + + # How to read this documentation The documentation follows the principle that the most commonly used concepts are diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 81934192a..aed62c398 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -4,6 +4,8 @@ sidebar_label: Installation hide_title: true --- + + # Installation MobX works in any ES5 environment, which includes browsers and NodeJS: diff --git a/docs/intro/overview.md b/docs/intro/overview.md index ca2cd2adb..087809e63 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -4,6 +4,8 @@ sidebar_label: The gist of MobX hide_title: true --- + + # The gist of MobX So far it all might sound a bit fancy, but making an app reactive using MobX boils down to just these three steps: diff --git a/docs/react/react-class-components.md b/docs/react/react-class-components.md index 4048c5af3..0dc775804 100644 --- a/docs/react/react-class-components.md +++ b/docs/react/react-class-components.md @@ -4,6 +4,8 @@ sidebar_label: React class components hide_title: true --- + + # React class components [React integration](react-integration.md) discusses the basic patterns for diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index 4b7568bda..61afbc311 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -4,6 +4,8 @@ sidebar_label: React integration hide_title: true --- + + # React integration While MobX works independently from React they are most commonly used together. In [the gist of Mobx](../intro/overview.md) as well as the [conceptual introduction](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md index af4ad404d..91477dd62 100644 --- a/docs/react/react-performance.md +++ b/docs/react/react-performance.md @@ -4,6 +4,8 @@ title: Optimizing rendering React components hide_title: true --- + + # Optimizing rendering React components MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). diff --git a/docs/react/react-pitfalls.md b/docs/react/react-pitfalls.md index 6d4e13264..1fb4ffa56 100644 --- a/docs/react/react-pitfalls.md +++ b/docs/react/react-pitfalls.md @@ -4,6 +4,8 @@ sidebar_label: MobX and React pitfalls hide_title: true --- + + # MobX and React pitfalls ## MobX only tracks data accessed for `observer` components if they are directly accessed by `render` diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 6ee1970f5..a9df0da83 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -4,6 +4,8 @@ sidebar_label: action hide_title: true --- + + # action Usage: diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 8e4b0c682..38bc6dea0 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -4,6 +4,8 @@ sidebar_label: API overview hide_title: true --- + + # MobX API Reference # Core API diff --git a/docs/refguide/array.md b/docs/refguide/array.md index 2218df610..3e858edfe 100644 --- a/docs/refguide/array.md +++ b/docs/refguide/array.md @@ -4,6 +4,8 @@ sidebar_label: arrays hide_title: true --- + + # Observable Arrays Usage: diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 2f12d3d0d..feff14761 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -4,6 +4,8 @@ sidebar_label: autorun hide_title: true --- + + # Autorun Usage: diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md index f8534d1d0..c1daee8ac 100644 --- a/docs/refguide/boxed.md +++ b/docs/refguide/boxed.md @@ -4,6 +4,8 @@ sidebar_label: boxes [🚀] hide_title: true --- + + # Observable Boxes [🚀] Usage: diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index bd0e4255d..25ef1a655 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -4,6 +4,8 @@ sidebar_label: How computed works [🚀] hide_title: true --- + + # How `computed` works [🚀] Here we go into some more details concerning how computed behaves. Since `computed` tries to be tranparent in its behavior you normally do not need to be aware of them, but is useful to know if something unexpected happens. diff --git a/docs/refguide/computed-options.md b/docs/refguide/computed-options.md index f657e7cb7..5164d770b 100644 --- a/docs/refguide/computed-options.md +++ b/docs/refguide/computed-options.md @@ -4,6 +4,8 @@ sidebar_label: Options for computed [🚀] hide_title: true --- + + # Options for computed [🚀] Usually `computed` behaves the way you want it to out of the box, but it's possible to customize its behavior by passing in an `options` argument: diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index a960a24b9..3d5559ca7 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -4,6 +4,8 @@ sidebar_label: computed hide_title: true --- + + # computed Computed values are values that can be derived from the existing state or other computed values. diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index b4f6cda4f..7bc0e6ade 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -4,6 +4,8 @@ sidebar_label: Configuring MobX hide_title: true --- + + # Configuring MobX MobX has several configuration depending on how you prefer to use MobX, which JavaScript engines you want to target, and whether you want MobX to hint at best practices. diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md index e22ec2a28..b3ce0e76c 100644 --- a/docs/refguide/extend-observable.md +++ b/docs/refguide/extend-observable.md @@ -3,6 +3,8 @@ sidebar_label: extendObservable [🚀] hide_title: true --- + + # extendObservable [🚀] Usage: diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index cbf3b6c0e..c6135ed18 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -3,6 +3,8 @@ sidebar_label: New observable types [🚀] hide_title: true --- + + # Creating new observable types [🚀] ## Atoms diff --git a/docs/refguide/flow.md b/docs/refguide/flow.md index e03fc9cb1..dc851ade3 100644 --- a/docs/refguide/flow.md +++ b/docs/refguide/flow.md @@ -4,6 +4,8 @@ sidebar_label: flow hide_title: true --- + + # flow Usage: diff --git a/docs/refguide/internals.md b/docs/refguide/internals.md index b4676c7bf..99a231851 100644 --- a/docs/refguide/internals.md +++ b/docs/refguide/internals.md @@ -4,6 +4,8 @@ sidebar_label: Internal functions [🚀] hide_title: true --- + + # Internal functions [🚀] The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX. diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md index 0cde102a8..2b59c409a 100644 --- a/docs/refguide/introspection-utils.md +++ b/docs/refguide/introspection-utils.md @@ -4,6 +4,8 @@ sidebar_label: Introspection APIs hide_title: true --- + + # Introspection APIs The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 0c84d4c67..78f8154db 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -4,6 +4,8 @@ sidebar_label: makeObservable / makeAutoObservable hide_title: true --- + + # makeObservable / makeAutoObservable Usage: diff --git a/docs/refguide/map.md b/docs/refguide/map.md index 183ff25aa..c37b52d65 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -4,6 +4,8 @@ sidebar_label: maps hide_title: true --- + + # Observable Maps Usage: diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 0e586249b..0e16bf871 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -4,6 +4,8 @@ sidebar_label: mobx-utils [🚀] hide_title: true --- + + # mobx-utils [🚀] [MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions and common patterns for MobX. diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index 0093dc5e0..e4ef2fdb8 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -4,6 +4,8 @@ sidebar_label: Observable modifiers [🚀] hide_title: true --- + + # Observable modifiers [🚀] When you use `makeObservable`, `makeAutoObservable`, `extendObservable` and `observable.object` you can use annotations to specify how observable properties behave: diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 5a9cab819..4f6403a5a 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -3,6 +3,8 @@ sidebar_label: Object API [🚀] hide_title: true --- + + ## Object API [🚀] The Object API is a utility API that enables manipulating observable maps, objects and arrays with the same generic API. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 972d1f6f2..f760caede 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -4,6 +4,8 @@ sidebar_label: objects hide_title: true --- + + # Observable Objects Usage: diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index cde1ee075..a9cd69a46 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -4,6 +4,8 @@ sidebar_label: observable hide_title: true --- + + # observable Usage: diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index c5a5fa098..c89b424ce 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -3,6 +3,8 @@ sidebar_label: intercept & observe [🚀] hide_title: true --- + + # Intercept & Observe [🚀] `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). diff --git a/docs/refguide/on-become-observed.md b/docs/refguide/on-become-observed.md index b65d1dc4d..c79bda44e 100644 --- a/docs/refguide/on-become-observed.md +++ b/docs/refguide/on-become-observed.md @@ -4,6 +4,8 @@ sidebar_label: onBecomeObserved [🚀] hide_title: true --- + + # `onBecomeObserved` and `onBecomeUnobserved` [🚀] Usage: diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md index 90a917606..cb9cea481 100644 --- a/docs/refguide/reaction.md +++ b/docs/refguide/reaction.md @@ -4,6 +4,8 @@ sidebar_label: reaction hide_title: true --- + + # Reaction Usage: diff --git a/docs/refguide/set.md b/docs/refguide/set.md index e07956e40..39e862d83 100644 --- a/docs/refguide/set.md +++ b/docs/refguide/set.md @@ -4,6 +4,8 @@ sidebar_label: sets hide_title: true --- + + # Observable Sets Usage: diff --git a/docs/refguide/spy.md b/docs/refguide/spy.md index 0f40a4b4c..b94754523 100644 --- a/docs/refguide/spy.md +++ b/docs/refguide/spy.md @@ -4,6 +4,8 @@ title: Spy hide_title: true --- + + # Spy [🚀] Usage: diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md index 9a0e2cbec..b96531d7f 100644 --- a/docs/refguide/tojson.md +++ b/docs/refguide/tojson.md @@ -4,6 +4,8 @@ title: toJS hide_title: true --- + + # toJS `toJS(value, options?)` diff --git a/docs/refguide/when.md b/docs/refguide/when.md index 9bc6dc3cc..955c20adb 100644 --- a/docs/refguide/when.md +++ b/docs/refguide/when.md @@ -4,6 +4,8 @@ sidebar_label: when hide_title: true --- + + # when Usage: diff --git a/notes.md b/notes.md index ab2a01d74..c4dca651f 100644 --- a/notes.md +++ b/notes.md @@ -62,14 +62,14 @@ - [x] ~default observable requires reaction?~ - [x] check coverage - [x] re-execute perf checks - - [ ] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - - [ ] make cheatsheet + - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - [ ] fix React unstable batch setup - [ ] post 6.0 + - [ ] make cheatsheet - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - [ ] set up discussions - [ ] use autObservable options for codemod (if no superclass)? diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 780a8903c..1fc39b1c2 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -82,3 +82,89 @@ article p img { color: #2c6ac7; text-decoration: underline; } + +/* Carbon */ +#carbonads { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, + Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +#carbonads { + display: block; + overflow: hidden; + max-width: 728px; + position: relative; + background-color: hsl(0, 0%, 99%); + border: solid 1px #eee; + font-size: 22px; + box-sizing: content-box; + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; +} + +#carbonads > span { + display: block; +} + +#carbonads a { + color: inherit; + text-decoration: none; +} + +#carbonads a:hover { + color: inherit; +} + +.carbon-wrap { + display: flex; + align-items: center; +} + +.carbon-img { + display: block; + margin: 0; + line-height: 1; +} + +.carbon-img img { + display: block; + height: 90px; + width: auto; +} + +.carbon-text { + display: block; + padding: 0 1em; + line-height: 1.35; + text-align: left; +} + +.carbon-poweredby { + display: block; + position: absolute; + bottom: 0; + right: 0; + padding: 6px 10px; + background: repeating-linear-gradient( + -45deg, + transparent, + transparent 5px, + hsla(0, 0%, 0%, 0.025) 5px, + hsla(0, 0%, 0%, 0.025) 10px + ) + hsla(203, 11%, 95%, 0.8); + text-align: center; + text-transform: uppercase; + letter-spacing: 0.5px; + font-weight: 600; + font-size: 8px; + border-top-left-radius: 4px; + line-height: 1; +} + +@media only screen and (min-width: 320px) and (max-width: 759px) { + .carbon-text { + font-size: 14px; + } +} From 4f9c58de0963b057da7b6014fcbd14ae4c98ff50 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 21 Jul 2020 21:19:39 +0100 Subject: [PATCH 0471/1043] Cherrypicked some changes from master branch --- README.md | 1 - docs/README.md | 1 - docs/best/what-does-mobx-react-to.md | 2 +- docs/faq/migrate-to-6.md | 2 +- docs/refguide/computed-behavior.md | 22 ++++++++++++ docs/refguide/map.md | 2 +- website/static/css/custom.css | 51 ++++++---------------------- 7 files changed, 36 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 825f811be..86ee3d81f 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,6 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo CodeFirst Bugsnag Curology -casino.net **🥉Bronze sponsors (\$500+ total contributions):**
    Algolia diff --git a/docs/README.md b/docs/README.md index 14a982d42..9ad5123d3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,6 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo CodeFirst Bugsnag Curology -casino.net **🥉Bronze sponsors (\$500+ total contributions):**
    Algolia diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 86615b055..7df7ee532 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -294,7 +294,7 @@ runInAction(() => { }) ``` -This will react. Even though `author.name` is not dereferenced by the the function passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. +This will react. Even though `author.name` is not dereferenced by the function passed to `autorun` itself, MobX will still track the dereferencing that happens in `upperCaseAuthorName`, because it happens _during_ the execution of the autorun. --- diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index 0337a1bd4..d9f5cf9ba 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -71,7 +71,7 @@ autoActions - The `decorate` API has been removed, and need to be replaced by `makeObservable` in the constructor of the targeted class. It accepts the same arguments. The `mobx-undecorate` can transform this automatically. - When using `extendObservable` / `observable`, fields that contained functions used to be turned into observables. This is no longer the case, they will be converted into autoActions. -- [Strict mode](../refguide/configure.md#enforceActions) for actions is now enabled by default in `observabed` mode. +- [Strict mode](../refguide/configure.md#enforceActions) for actions is now enabled by default in `observed` mode. - `toJS` no longer takes any options. It no longer converts Maps and Sets to plain data structures. Generic, flexible serialization of data structures is out of scope for the MobX project, and writing custom serialization methods are a much more scalable approach to serialization. (Tip: leverage `computed`s to define how class instances should be serialized). - The methods `intercept` and `observe` are no longer exposed on observable arrays and maps and boxed observables. Import them as utility from mobx instead: `import { observe, intercept } from "mobx"`, and pass the collection as first argument: `observer(collection, callback)`. Note that we still recommend to avoid those API's. - `observableMap.toPOJO()`, `observableMap.toJS()` have been dropped. use `new Map(observableMap)` instead if you want to convert an observable map to to a plain Map shallowly. diff --git a/docs/refguide/computed-behavior.md b/docs/refguide/computed-behavior.md index 25ef1a655..9fc066512 100644 --- a/docs/refguide/computed-behavior.md +++ b/docs/refguide/computed-behavior.md @@ -126,3 +126,25 @@ var disposer = upperCaseName.observe(change => console.log(change.newValue)) name.set("Dave") // prints: 'DAVE' ``` + +### Computed KeepAlive + +A computed may be initalized with the `keepAlive` flag. `keepAlive` will cause the computed to act as though it is observed by a reaction. This is a convience method and `keepAlive` does the same as the autorun in example above, but it does it a lot more efficient (it can for example keep the computed alive, but defer computation until somebody actually reads the value, something the autorun can't do). + +```javascript +class OrderLine { + @observable price = 0 + @observable amount = 1 + constructor(price) { + this.price = price + } + @computed({ keepAlive: true }) + get total() { + return this.price * this.amount + } +} +``` + +### Autorun vs keepAlive + +The only case where autorun would be more beneficial than a `keepAlive` computed, is during a manual management case in which you call the returned disposer to nicely clean up the computed value if it is no longer used typically you would do that in a destructor of a class for example. diff --git a/docs/refguide/map.md b/docs/refguide/map.md index c37b52d65..25a847a1a 100644 --- a/docs/refguide/map.md +++ b/docs/refguide/map.md @@ -28,7 +28,7 @@ The following methods are exposed according to the [ES6 Map spec](https://develo - `delete(key)`. Deletes the given key and its value from the map. - `get(key)`. Returns the value at the given key (or `undefined`). - `keys()`. Returns an iterator over all keys present in this map. Insertion order is preserved. -- `values()`. Returns an iterator all values present in this map. Insertion order is preserved. +- `values()`. Returns an iterator over all values present in this map. Insertion order is preserved. - `entries()`. Returns an iterator (insertion ordered) over array that for each key/value pair in the map contains an array `[key, value]`. - `forEach(callback:(value, key, map) => void, thisArg?)`. Invokes the given callback for each key / value pair in the map. - `clear()`. Removes all entries from this map. diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 1fc39b1c2..08b18b687 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -41,46 +41,17 @@ article p img { background: url("/img/github-brand.svg"); } -.re_2020 { - font-size: 14px; - box-sizing: border-box; - width: 100%; - line-height: 1.5; - display: block; - padding: 12px 11px; - text-align: left; - margin: 12px 0; - background-color: #f8f8f8; - font-family: Helvetica Neue,Helvetica,Arial,sans-serif; -} - -.re_2020_link { - display: flex; - flex-direction: row; - align-items: center; -} - -.re_2020 img { - margin-left: 8px; - margin-right: 8px; -} - -.re_2020 span { - color: rgba(0,0,0,.6); -} - -.re_2020_ad { - display: inline; - background-color: #4caf50; - color: #fff; - margin-right: 4px; - padding: 2px 6px; - border-radius: 3px; -} - -.re_2020_link .link { - color: #2c6ac7; - text-decoration: underline; +/* BLM */ +.slidingNav::before { + content: "Black Lives Matter"; + position: fixed; + left: 0; + width: 100vw; + top: 13px; + text-align: center; + pointer-events: none; + text-transform: uppercase; + font-weight: bold; } /* Carbon */ From 0f84efcedb29efecb5c03ebd216c8f1496d9fc28 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 21 Jul 2020 22:29:32 +0100 Subject: [PATCH 0472/1043] Migration guide work --- README.md | 348 +--------------------------------- docs/faq/migrate-to-6.md | 42 +++- docs/refguide/configure.md | 2 +- notes.md | 1 + website/static/css/custom.css | 6 + 5 files changed, 50 insertions(+), 349 deletions(-) diff --git a/README.md b/README.md index 86ee3d81f..e78f5b33c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,16 @@ _Simple, scalable state management_ [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) [![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/mobxjs/mobx) +--- + +
    + +## Official documentation can be found at https://mobx.js.org + +
    + +--- + MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). **🥇Gold sponsors (\$3000+ total contribution):**
    @@ -37,344 +47,6 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo DAZN Blokt -# Installation - -- Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. To enable ESNext decorators (optional), see below. -- CDN: - - https://unpkg.com/mobx/lib/mobx.umd.js - - https://cdnjs.com/libraries/mobx - -_Tip: Consider using the faster and smaller ES6 build if targetting a modern environment: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}`_ - -# Browser support - -| MobX version | Actively supported | Supported browsers | GitHub branch | -| ------------ | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| 5.\* | Yes | Any browser that supports [ES6 Proxies](https://kangax.github.io/compat-table/es6/#test-Proxy) (non polyfillable). _NOT:_ IE 11 and lower, Node 5 and lower | `master` | -| 4.\* | Yes (LTS) | Any ES5 compliant browser | `mobx4-master` | -| 1-3.\* | No | Any ES5 compliant browser | No active branch | - -- All modern browsers are supported. -- MobX >=5 runs on any browser with [ES6 proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy). In practice this means: - - no Internet Explorer (Edge is fine) - - Node.js >= 6 -- React Native: - - iOS >= 10 - - Android from RN 0.59 (or with manual JavaScript core [upgrade](https://github.com/react-community/jsc-android-buildscripts#how-to-use-it-with-my-react-native-app)) - - Hermes runtime is [not supported](https://github.com/facebook/hermes/issues/28) (Use MobX 4 instead) -- MobX 4 runs on any ES5 browser and will be actively maintained. The MobX 4 and 5 api's are the same and semantically can achieve the same, but MobX 4 has some [limitations](#mobx-4-vs-mobx-5). -- The latest versions of libraries like mobx-react, mobx-react-lite, mobx-state-tree etc are kept compatible with both MobX 4 and 5. - -## Translations - -- [中文](http://cn.mobx.js.org) - -## Getting started - -- Egghead.io course -- [Ten minute, interactive MobX + React tutorial](https://mobxjs.github.io/mobx/getting-started) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) -- [How to (not) use decorators](https://mobx.js.org/best/decorators.html) -- Videos: - - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m - - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) -- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) -- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - -## Introduction - -MobX is a battle tested, simple and scalable state management library transparently applying functional reactive programming (TFRP). The Mobx design principle is very simple: - -_Anything that can be derived from the application state, should be derived. Automatically._ - -This includes the UI, data serialization, server communication, etc. - -MobX unidirectional flow - -React and MobX together are a powerful combination. React renders the application state by providing mechanisms to translate it into a tree of renderable components. MobX provides the mechanism to store and update the application state that React then uses. - -Both React and MobX provide optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render the UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with React components by using a reactive virtual dependency state graph that is only updated when strictly needed and is never stale. - -## Core concepts - -MobX has only a few core concepts. The following snippets can be tried online using [codesandbox example](https://codesandbox.io/s/v3v0my2370). - -### Observable state - -Egghead.io lesson 1: observable & observer - -MobX adds observable capabilities to existing data structures like objects, arrays and class instances. -This can simply be done by annotating your class properties with the [@observable](http://mobxjs.github.io/mobx/refguide/observable-decorator.html) decorator (ES.Next). - -```javascript -import { observable } from "mobx" - -class Todo { - id = Math.random() - @observable title = "" - @observable finished = false -} -``` - -Using `observable` is like turning a property of an object into a spreadsheet cell. -But, unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. - -If your environment doesn't support decorator syntax, don't worry. -You can read [here](http://mobxjs.github.io/mobx/best/decorators.html) about how to set them up. -Or you can skip them altoghether, as MobX can be used fine without decorator _syntax_, by leveraging the _decorate_ utility. -Many MobX users prefer the slightly more concise decorator syntax, but the following snippet achieves the same: - -```javascript -import { decorate, observable } from "mobx" - -class Todo { - id = Math.random() - title = "" - finished = false -} -decorate(Todo, { - title: observable, - finished: observable -}) -``` - -### Computed values - -Egghead.io lesson 3: computed values - -With MobX you can define values that will be derived automatically when relevant data is modified. -By using the [`@computed`](http://mobxjs.github.io/mobx/refguide/computed-decorator.html) decorator or by using getter / setter functions when using `(extend)Observable` (Of course, you can use `decorate` here again as alternative to the `@` syntax). - -```javascript -class TodoList { - @observable todos = [] - @computed - get unfinishedTodoCount() { - return this.todos.filter(todo => !todo.finished).length - } -} -``` - -MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. -Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically and only when required. - -### Reactions - -Egghead.io lesson 9: custom reactions - -Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. -In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. - -#### React components - -Egghead.io lesson 1: observable & observer - -If you are using React, you can turn your (stateless function) components into reactive components by simply adding the [`observer`](http://mobxjs.github.io/mobx/refguide/observer-component.html) function / decorator from the `mobx-react` package onto them. - -```javascript -import React, { Component } from "react" -import ReactDOM from "react-dom" -import { observer } from "mobx-react" - -@observer -class TodoListView extends Component { - render() { - return ( -
    -
      - {this.props.todoList.todos.map(todo => ( - - ))} -
    - Tasks left: {this.props.todoList.unfinishedTodoCount} -
    - ) - } -} - -const TodoView = observer(({ todo }) => ( -
  • - (todo.finished = !todo.finished)} - /> - {todo.title} -
  • -)) - -const store = new TodoList() -ReactDOM.render(, document.getElementById("mount")) -``` - -`observer` turns React (function) components into derivations of the data they render. -When using MobX there are no smart or dumb components. -All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. -However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). - -#### Custom reactions - -Custom reactions can simply be created using the [`autorun`](http://mobxjs.github.io/mobx/refguide/autorun.html), -[`reaction`](http://mobxjs.github.io/mobx/refguide/reaction.html) or [`when`](http://mobxjs.github.io/mobx/refguide/when.html) functions to fit your specific situations. - -For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: - -```javascript -autorun(() => { - console.log(`Tasks left: ${todos.unfinishedTodoCount}`) -}) -``` - -### What will MobX react to? - -Why does a new message get printed each time the `unfinishedTodoCount` is changed? The answer is this rule of thumb: - -_MobX reacts to any existing observable property that is read during the execution of a tracked function._ - -For an in-depth explanation about how MobX determines to which observables needs to be reacted, check [understanding what MobX reacts to](https://mobx.js.org/best/react.html). - -### Actions - -Egghead.io lesson 5: actions - -Unlike many flux frameworks, MobX is unopinionated about how user events should be handled. - -- This can be done in a Flux like manner. -- Or by processing events using RxJS. -- Or by simply handling events in the most straightforward way possible, as demonstrated in the above `onClick` handler. - -In the end it all boils down to: somehow the state should be updated. - -After updating the state `MobX` will take care of the rest in an efficient, glitch-free manner. So, simple statements, like the ones below, are enough to automatically update the user interface. - -There is no technical need for firing events, calling a dispatcher, etc. A React component in the end is nothing more than a fancy representation of your state, i.e. a derivation that will be managed by MobX. - -```javascript -store.todos.push(new Todo("Get Coffee"), new Todo("Write simpler code")) -store.todos[0].finished = true -``` - -Nonetheless, MobX has an optional built-in concept of [`actions`](https://mobxjs.github.io/mobx/refguide/action.html). -Read this section as well if you want to know more about writing asynchronous actions. It's easy! -Use them to your advantage; they will help you to structure your code better and make wise decisions about when and where state should be modified. - -## MobX: Simple and scalable - -MobX is a simple, very scaleable and unobtrusive state management library. - -### Using classes and real references - -With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models. (At Mendix, for example, there are ~500 different domain classes in a single application.) - -### Referential integrity is guaranteed - -Since data doesn't need to be normalized and MobX automatically tracks the relations between state and derivations, you get referential integrity for free. - -Rendering something that is accessed through three levels of indirection? No problem. MobX will track them and re-render whenever one of the references changes. As a result, staleness bugs are eliminated. As a programmer, you might forget that changing some data might influence a seemingly unrelated component, but MobX won't forget. - -### Simpler actions are easier to maintain - -As demonstrated above, modifying state when using MobX is very straightforward. You simply write down your intentions. MobX will take care of the rest. - -### Fine grained observability is efficient - -MobX builds a graph of all the derivations in your application to find the least number of re-computations that are needed to prevent staleness. "Derive everything" might sound expensive, but MobX builds a virtual derivation graph to minimize the number of recomputations needed to keep derivations in sync with the state. - -In fact, when testing MobX at Mendix we found out that using this library to track the relations in our code is often a lot more efficient than pushing changes through our application by using handwritten events or "smart" selector based container components. - -The simple reason is that MobX will establish far more fine grained 'listeners' on your data than you would do as a programmer. - -Secondly, MobX sees the causality between derivations, so it can order them in such a way that no derivation has to run twice or introduce a glitch. - -How that works? See this [in-depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). - -### Easy interoperability - -MobX works with plain JavaScript structures. Due to its unobtrusiveness, it works with most JavaScript libraries out of the box without needing MobX specific library add-ons. - -So, you can simply keep using your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash`, etc. - -For the same reason, you can use it with both server and client side, isomorphic and react-native applications. - -The result of this is that you often need to learn fewer new concepts when using MobX in comparison to other state management solutions. - ---- - -## Credits - -MobX is inspired by reactive programming principles found in spreadsheets. It is inspired by MVVM frameworks such as MeteorJS tracker, Knockout and Vue.js. But, MobX brings Transparent Functional Reactive Programming to the next level and provides a stand alone implementation. It implements TFRP in a glitch-free, synchronous, predictable and efficient manner. - -A ton of credit goes to [Mendix](https://github.com/mendix) for providing the flexibility and support to maintain MobX and the chance to prove the philosophy of MobX in real, complex, performance critical applications. - -And finally, kudos to all the people that believed in, tried, validated and even [sponsored](https://github.com/mobxjs/mobx/blob/master/sponsors.md) MobX. - -## Further resources and documentation - -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [MobX homepage](http://mobxjs.github.io) -- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -- [Tutorials](https://github.com/mobxjs/awesome-mobx#tutorials) -- [Blogs](https://github.com/mobxjs/awesome-mobx#blogs) -- [Videos](https://github.com/mobxjs/awesome-mobx#videos) -- [Boilerplates](https://github.com/mobxjs/awesome-mobx#boilerplates) -- [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) - -## What others are saying... - -> Guise, #mobx isn't pubsub, or your grandpa's observer pattern. Nay, it is a carefully orchestrated observable dimensional portal fueled by the power cosmic. It doesn't do change detection, it's actually a level 20 psionic with soul knife, slashing your viewmodel into submission. - -> After using #mobx for lone projects for a few weeks, it feels awesome to introduce it to the team. Time: 1/2, Fun: 2X - -> Working with #mobx is basically a continuous loop of me going “this is way too simple, it definitely won’t work” only to be proven wrong - -> Try react-mobx with es6 and you will love it so much that you will hug someone. - -> I have built big apps with MobX already and comparing to the one before that which was using Redux, it is simpler to read and much easier to reason about. - -> The #mobx is the way I always want things to be! It's really surprising simple and fast! Totally awesome! Don't miss it! - -> I've been using MobX for over 2 years now, and it _still_ feels like cheating! 😎 - -## Contributing - -- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -- Use `yarn test` to run the basic test suite. -- Use `yarn test:coverage` for the test suite with coverage. -- and `yarn perf` for the performance tests. -- Please note that if you want to backport a feature / fix to MobX 4 a second PR needs to be opened to the mobx4-master branch. - -## Online one-click setup for contributing - -You can use Gitpod (a free online VS Code-like IDE) for working on issues and making PRs. With a single click it will launch a ready to code workspace with everything setup so that you can start straight away. - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/) - -# MobX 4 vs MobX 5 - -The difference between MobX 4 and MobX 5 is that the latter uses Proxies to do property tracking. As a consequence, MobX 5 runs only on Proxy supporting browsers, in contrast to MobX 4 that runs on any ES 5 environment. - -The most notable limitations of MobX 4: - -- Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. -- Adding properties to existing observable objects after creation is not automatically picked up. Instead, either use observable maps or use the the built-in [utility functions](https://mobx.js.org/refguide/object-api.html) to read / write / iterate objects that you want to dynamically add properties to. - -For more details see the [caveats page](https://mobx.js.org/best/pitfalls.html). - -## Flow support - -MobX ships with [flow typings](flow-typed/mobx.js). Flow will automatically include them when you import MobX modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. - -To use the [flow typings](flow-typed/mobx.js) shipped with MobX: - -- In `.flowconfig`, you **cannot** ignore `node_modules`. -- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). - ## Donating Was MobX key in making your project a success? diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index d9f5cf9ba..f50f10bee 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -9,18 +9,37 @@ MobX 6 is quite different from MobX 5. This pages covers a migration guide from # Migrating to MobX 6 -on latest MobX 4 / 5 +_⚠️ Disclaimer: Depending on factors like the size and complexity of your code base, your MobX usage patterns, and the quality of your automated tests, this migration guide might take you anywhere between an hour and a couple of days. Please refrain from upgrading if you are don't trust your Continous Integration or QA / test procedures enough to pick up any unexpected breakages. Unexpected behavioral changes might be caused by changes in MobX itself or the changes needed to your Babel / TypeScript build configuration. ⚠️_ -From 4: set useProxies: "never" +## Getting started -With or without proxies +1. Update `mobx` to the latest version of MobX 4/5 and solve any deprecation messages. +2. Update `mobx` to version 6. +3. If you are upgrading from MobX 4, and you will need to support Internet Explorer / React Native without proxies, call `import { configure } from "mobx"; configure({ useProxies: "never" })` at the initialization of your application, to back-out of the Proxy implementation. For details see [Proxy Support](../refguide/configure.md#proxy-support) +4. For babel users: + - If you are using Babel and have class-properties enabled, disable the legacy loose field support: `["@babel/plugin-proposal-class-properties", { "loose": false }]` + - (Optional) In MobX 6 decorators have become opt-in. If you no longer wish to use decorators, remove `plugin-proposal-decorators` from your babel configuration and dependencies. See [decorators](../best/decorators.md) for more details. +5. For Typescript users + - Add the flag `"useDefineForClassFields": true` to your compiler config. + - (Optional) In MobX 6 decorators have become opt-in. If you no longer wish to use decorators, remove / disable the `experimentalDecorators` configuration from your TypeScript config. See [decorators](../best/decorators.md) for more details. +6. The MobX default configuration has become more strict. We recommend to adopt the new defaults after completing the upgrade (see [Configuring MobX](../refguide/configure.md)). During migration, we recommend to configure MobX in the same way as it would be in v4/v5 out of the box: `import {configure} from "mobx"; configure({ enforceActions: "never" });`. After finishing the entire migration process and validating that your project works as expected, consider enabling the flags `computedRequiresReaction`, `reactionRequiresObservable` and `observableRequiresReaction` and `enforceActions: "observed"` to write more idiomatic MobX code. -No loose fields + TS option) +## Upgrading classes to use `makeObservable` - ["@babel/plugin-proposal-class-properties", { "loose": false }] +Due to standardized JavaScript limitations in how class fields are constructed, it is for MobX no longer possible to alter the behavior of class fields by means of decorators or the `decorate` utility. Instead, fields have to be made observable by the `constructor`. This can be done in three different ways: -TS -"useDefineForClassFields": true +1. Remove all decorators and call `makeObservable` in the `constructor` and explicitly define which field should be made observable using which decorator. For example: `makeObservable(this, { count: observable, tick: action, elapsedTime: computed })` (note that the second argument corresponds to what would be passed to `decorate`). This is the recommended approach if you want to drop decorators in your code base, and the project isn't too big yet +2. Leave all the decorators and call `makeObservable(this)` in the `constructor`. This will pick up the meta data generated by the decortors. This is the recommend way to if you want to limit the impact of a MobX 6 migration. +3. Remove decorators and use `makeAutoObservable(this)` in the class `constructors`. + +See [makeObservable / makeAutoObservable](../refguide/make-observable.md) for details. + +Some specifics to note: + +1. using `makeObservable` / `makeAutoObservable` needs to be done in every class definition that declares MobX based members. So if a sub-class and super-class both introduce observable members, they will both have to call `makeObservable` +2. `makeAutoObservable` will mark methods using a new decorator `autoAction`, that will apply `action` only if it is not in a derivation context. This makes it save to call automatically decorated methods also from computeds properties. + +Migrating a large code bases with lots of class might be daunting. But no worries. there is a code-mod available! ## Upgrading your code with the `mobx-undecorate` codemod @@ -41,18 +60,21 @@ and only introduce `makeObservable(this)` where required, you can use the `--kee npx mobx-undecorate --keepDecorators ``` +More options can be on the mobx-undecorate [documentation](https://www.npmjs.com/package/mobx-undecorate) + ### limitations of `mobx-undecorate` The `mobx-undecorate` command has to introduce a constructor in classes that do not yet have one. If base class of the constructor expects arguments, the codemod cannot introduce these arguments for the subclass being upgraded, and the `super` call won't pass them either. You have to fix these manually. - -`mobx-undecorate` outputs warnings for these cases when it's run. +The tool will generate a `// TODO: [mobx-undecorate]` comment in these cases. We do have a special case for React class components to do the right thing and pass along `props` to the superclass. # Changelog -## New feature +## New features + +TODO: makeObservable diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 7bc0e6ade..1b26a0dee 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -30,7 +30,7 @@ configure({ Accepted values for the `useProxies` configuration are: - `"always"` (default): MobX is expected to only run in environments with [`Proxy` support](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). MobX will error if these are not available. -- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations](../best/limitations-without-proxies.md). +- `"never"`: Proxies are never used. MobX falls back on non-proxy alternatives. This is compatible with all ES5 environments, but causes various [limitations](#limitations-without-proxies). - `"ifavailable"`: (Experimental option) Proxies are used if they are available, and otherwise MobX falls back to non-proxy alternatives. The benefit of this mode is that MobX will try to warn if API's or language features that wouldn't work in ES5 enviroments are used, triggering errors when hitting an ES5 limitation when running on a modern environment. Note: before MobX 6 one had to pick either MobX 4 for older engines, or MobX 5 for new engines. However, MobX 6 supports both, although polyfills for certain api's like Map will be required when targetting older JavaScript engines. diff --git a/notes.md b/notes.md index c4dca651f..6848a9edc 100644 --- a/notes.md +++ b/notes.md @@ -63,6 +63,7 @@ - [x] check coverage - [x] re-execute perf checks - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) + - [ ] add deprecation messages to latest mobx 5 - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 08b18b687..fc859411a 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -139,3 +139,9 @@ article p img { font-size: 14px; } } + +/* temporarily */ +body { + background: #333; + filter: invert(100%); +} From ebf538af8bc307a59cb1b1182f073f4c31969ef9 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 23 Jul 2020 20:37:22 +0100 Subject: [PATCH 0473/1043] Added DCSL to sponsors --- README.md | 1 + docs/README.md | 1 + docs/assets/dcsl.png | Bin 0 -> 29468 bytes 3 files changed, 2 insertions(+) create mode 100644 docs/assets/dcsl.png diff --git a/README.md b/README.md index e78f5b33c..5d68d4f81 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo **🥈Silver sponsors (\$100+ pm):**
    mantro GmbH CodeFirst +DCSL Software Bugsnag Curology diff --git a/docs/README.md b/docs/README.md index 9ad5123d3..09232a6bf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,6 +32,7 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo **🥈Silver sponsors (\$100+ pm):**
    mantro GmbH CodeFirst +DCSL Software Bugsnag Curology diff --git a/docs/assets/dcsl.png b/docs/assets/dcsl.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8650aecd015b372c3bef5a2064281bf7078f40 GIT binary patch literal 29468 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 literal 0 HcmV?d00001 From c69ef3f732133a1226c900e1ede285b0e1b3ef1f Mon Sep 17 00:00:00 2001 From: Jamon Holmgren Date: Fri, 24 Jul 2020 12:36:11 -0700 Subject: [PATCH 0474/1043] Replaces jQuery with vanilla JS in store example --- docs/best/store.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/best/store.md b/docs/best/store.md index 2deb56829..1d27e951b 100644 --- a/docs/best/store.md +++ b/docs/best/store.md @@ -262,7 +262,6 @@ Example of a store (using ES6 syntax): ```javascript import { makeAutoObservable, observable, computed, asStructure } from "mobx" -import jquery from "jquery" export class UiState { language = "en_US" @@ -271,15 +270,15 @@ export class UiState { // .struct makes sure observer won't be signaled unless the // dimensions object changed in a deepEqual manner windowDimensions = { - width: jquery(window).width(), - height: jquery(window).height() + width: window.innerWidth, + height: window.innerHeight } constructor() { makeAutoObservable(this, { windowDimensions: observable.struct }) - jquery.resize(() => { + window.onresize = () => { this.windowDimensions = getWindowDimensions() - }) + } } get appIsInSync() { From 7829f1faac099fe1c21470b6ef18ea2761fc8fb2 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 25 Jul 2020 00:48:44 +0100 Subject: [PATCH 0475/1043] Cleaned up readme --- .vscode/settings.json | 3 +- docs/README.md | 120 +++++++++------------------------- notes.md | 13 ++++ website/static/css/custom.css | 6 -- 4 files changed, 45 insertions(+), 97 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ec1c6dfbc..dd4e99e9b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,6 @@ "typescript.tsdk": "node_modules/typescript/lib", // "javascript.validate.enable": false // enable for flow "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"], - "fb.doctor.disabled-tests": ["CorporateNetworkDoctor"] + "fb.doctor.disabled-tests": ["CorporateNetworkDoctor"], + "cSpell.enabled": true } diff --git a/docs/README.md b/docs/README.md index 09232a6bf..8bde611c1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,9 @@ _Simple, scalable state management_ [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](http://mobxjs.github.io/mobx/backers-sponsors.html#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). +--- + +MobX is made possible by the generosity of the sponsors below, and many [individual backers](http://mobxjs.github.io/mobx/backers-sponsors.html#backers). Sponsoring directly impacts the longevity of this project. **🥇Gold sponsors (\$3000+ total contribution):**
    Mendix @@ -42,13 +44,13 @@ MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algo DAZN Blokt -# Installation +--- -MobX >=6 runs in any ES5 environment, which includes web browsers and NodeJS. +## Installation -Installation: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. +Installation: `npm install mobx --save`. For the React bindings: `npm install mobx-react --save`. -[More about installing MobX](http://mobxjs.github.io/mobx/intro/installation.html) +For more options see the [installation page](intro/installation.md). ## Introduction @@ -63,7 +65,9 @@ which includes the UI, data serialization, server communication, etc. React and MobX together are a powerful combination. React renders the application state by providing mechanisms to translate it into a tree of renderable components. MobX provides the mechanism to store and update the application state that React then uses. -Both React and MobX provide an optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with your React components by using a reactive virtual dependency state graph that is only updated when strictly needed and is never stale. +Both React and MobX provide an optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with your React components by building a reactive dependency tree that is only updated when strictly needed and is never stale. MobX will optimize your React components for you, without needing to specify data dependencies, use `memo`, or refactoring states or contexts to make things optimal. + +In fact, with MobX state can be completely separated from your UI layer. This makes testing much simpler and enables code sharing between stacks and frameworks, and leads to a natural separation of concerns. ## Example @@ -101,72 +105,12 @@ setInterval(() => { const TimerView = observer(({ timer }) => ( )) + ReactDOM.render(, document.body) ``` To get more detail about this example, see [the gist of MobX](http://mobxjs.github.io/mobx/intro/overview.html). - -To learn about the underlying concepts together with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html) - -Then see what to [read next](http://mobxjs.github/mobx/intro/how-to-read.html). - -### MobX and Decorators - -Wait! This example doesn't use decorators. Haven't you seen MobX code before that uses them? In MobX 6 we have chosen to move away from them for maximum compatibility with standard JavaScript. - -There is a codemod available to help you upgrade existing code to be compliant with MobX 6. - -The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. - -## MobX: Simple and scalable - -MobX is one of the least obtrusive libraries you can use for state management. That makes the `MobX` approach not just simple, but very scalable as well: - -### Using classes and real references - -With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models (At Mendix for example ~500 different domain classes in a single application). - -### Referential integrity is guaranteed - -Since data doesn't need to be normalized, and MobX automatically tracks the relations between state and derivations, you get referential integrity for free. Rendering something that is accessed through three levels of indirection? - -No problem, MobX will track them and re-render whenever one of the references changes. As a result staleness bugs are a thing of the past. As a programmer you might forget that changing some data might influence a seemingly unrelated component in a corner case. MobX won't forget. - -### Simpler actions are easier to maintain - -As demonstrated above, modifying state when using MobX is very straightforward. You simply write down your intentions. MobX will take care of the rest. - -### Fine grained observability is efficient - -MobX builds a graph of all the derivations in your application to find the least number of re-computations that is needed to prevent staleness. "Derive everything" might sound expensive, MobX builds a virtual derivation graph to minimize the number of recomputations needed to keep derivations in sync with the state. - -In fact, when testing MobX at Mendix we found out that using this library to track the relations in our code is often a lot more efficient than pushing changes through our application by using handwritten events or "smart" selector based container components. - -The simple reason is that MobX will establish far more fine grained 'listeners' on your data than you would do as a programmer. - -Secondly MobX sees the causality between derivations so it can order them in such a way that no derivation has to run twice or introduces a glitch. - -How that works? See this [in-depth explanation of MobX](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). - -### Easy interoperability - -MobX works with plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific library flavors. - -So you can simply keep using your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. - -For the same reason you can use it out of the box both server and client side, in isomorphic applications and with react-native. - -The result of this is that you often need to learn less new concepts when using MobX in comparison to other state management solutions. - ---- - -## Credits - -MobX is inspired by reactive programming principles as found in spreadsheets. It is inspired by MVVM frameworks like in MeteorJS tracker, knockout and Vue.js. But MobX brings Transparent Functional Reactive Programming to the next level and provides a stand alone implementation. It implements TFRP in a glitch-free, synchronous, predictable and efficient manner. - -A ton of credits for [Mendix](https://github.com/mendix), for providing the flexibility and support to maintain MobX and the chance to proof the philosophy of MobX in a real, complex, performance critical applications. - -And finally kudos for all the people that believed in, tried, validated and even [sponsored](https://github.com/mobxjs/mobx/blob/master/sponsors.md) MobX. +To learn about the underlying concepts together with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html). Or read on to see some of the benefits of MobX. ## What others are saying... @@ -182,36 +126,32 @@ And finally kudos for all the people that believed in, tried, validated and even > The #mobx is the way I always want things to be! It's really surprising simple and fast! Totally awesome! Don't miss it! -## Contributing - -- Feel free to send small pull requests. Please discuss new features or big changes in a GitHub issue first. -- Use `npm test` to run the basic test suite, `npm run coverage` for the test suite with coverage and `npm run test:performance` for the performance tests. +## The benefits of MobX -## Donating +MobX is one of the least obtrusive libraries you can use for state management. That makes the `MobX` approach not just simple, but very scalable as well. It has caused many well known companies to adopt MobX, which is used at companies like Microsoft, Amazon, Netflix, EA Games and [many more](https://github.com/mobxjs/mobx/issues/681). -Was MobX key in making your project a success? -Join our [open collective](https://opencollective.com/mobx#)! Thank you to our existing [backers and sponsors](backers-sponsors.md). +- **Mutable Data < Immutable Data < Observable Data**. Immutability is too often seen as silver bullet in programming. While it is justified in many cases, for stateful data or CRUD operations it is often a mismatch. Re-creating an object just to modify one of its attributes is not only cognitive challenging, it is inefficient as well. It does make change detection easy. But only compared to 'classic' mutable data. Observable data will pick up changes without any diffing. At all. And you will always be looking at the latest version. From anywhere. +- **Simpler actions are easier to read and maintain**. As demonstrated above, modifying state when using MobX is very straightforward. You write down your intentions imperatively. And MobX will make sure no mutation will goes undetected. +- **Fine grained observability is efficient**. MobX is a reactive library that builds a graph of all the derivations in your application to find the least number of re-computations that is needed to prevent staleness. By performing runtime analysis it will optimize at a much finer granularity than any programmer would to by hand. +- **Access any observable anywhere**. If an observable is used in a reactive context, MobX will track it. Regardless how it got there; through a closure, module import, React component prop or context? It doesn't matter. That keeps things simple and guarantees architectural freedom. +- **Structure state using any common language construct**. With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models (At Mendix for example ~500 different domain classes in a single application). MobX has few opinions, so you are free to either use classes or plain old objects. To store direct references or just identifiers. +- **Easy interoperability**. MobX works with enriched but plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific flavors. So you can simply keep using promises, async/await, generators, your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. ## Further resources and documentation -- egghead.io course - [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [Official MobX 4 documentation and API overview](https://mobxjs.github.io/mobx/refguide/api.html) ([MobX 3](https://github.com/mobxjs/mobx/blob/54557dc319b04e92e31cb87427bef194ec1c549c/docs/refguide/api.md), [MobX 2](https://github.com/mobxjs/mobx/blob/7c9e7c86e0c6ead141bb0539d33143d0e1f576dd/docs/refguide/api.md)) +- egghead.io course (Based on MobX 3) +- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate. - Videos: + - [Introduction to MobX & React in 2020](https://www.youtube.com/watch?v=pnhIJA64ByY) - 17m by Leigh Halliday. - [ReactNext 2016: Real World MobX](https://www.youtube.com/watch?v=Aws40KOx90U) - 40m [slides](https://docs.google.com/presentation/d/1DrI6Hc2xIPTLBkfNH8YczOcPXQTOaCIcDESdyVfG_bE/edit?usp=sharing) - [Practical React with MobX](https://www.youtube.com/watch?v=XGwuM_u7UeQ). In depth introduction and explanation to MobX and React by Matt Ruby on OpenSourceNorth (ES5 only) - 42m. - - LearnCode.academy MobX tutorial [Part I: MobX + React is AWESOME (7m)](https://www.youtube.com/watch?v=_q50BXqkAfI) [Part II: Computed Values and Nested/Referenced Observables (12m.)](https://www.youtube.com/watch?v=nYvNqKrl69s) - - [Screencast: intro to MobX](https://www.youtube.com/watch?v=K8dr8BMU7-8) - 8m + - [MobX and the unique symbiosis of predictability and speed](https://www.youtube.com/watch?v=NBYbBbjZeX4&list=PL8sJahqnzh8JJD7xahG5zXkjfM5GOgcPA&index=21&t=0s) - HolyJS 2019 conf, 59 min - [Talk: State Management Is Easy, React Amsterdam 2016 conf](https://www.youtube.com/watch?v=ApmSsu3qnf0&feature=youtu.be) ([slides](https://speakerdeck.com/mweststrate/state-management-is-easy-introduction-to-mobx)) -- Boilerplates [MobX awesome list](https://github.com/mobxjs/awesome-mobx#boilerplates) -- Related projects [MobX awesome list](https://github.com/mobxjs/awesome-mobx#related-projects-and-utilities) -- More tutorials, blogs, videos, and other helpful resources can be found on the [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) -- [The MobX book](https://books.google.nl/books?id=ALFmDwAAQBAJ&pg=PP1&lpg=PP1&dq=michel+weststrate+mobx+quick+start+guide:+supercharge+the+client+state+in+your+react+apps+with+mobx&source=bl&ots=D460fxti0F&sig=ivDGTxsPNwlOjLHrpKF1nweZFl8&hl=nl&sa=X&ved=2ahUKEwiwl8XO--ncAhWPmbQKHWOYBqIQ6AEwAnoECAkQAQ#v=onepage&q=michel%20weststrate%20mobx%20quick%20start%20guide%3A%20supercharge%20the%20client%20state%20in%20your%20react%20apps%20with%20mobx&f=false) by Pavan Podila and Michel Weststrate (which despite its name is in-depth!) -- [MobX homepage](http://mobxjs.github.io) -- [API overview](http://mobxjs.github.io/mobx/refguide/api.html) -- [Tutorials](https://github.com/mobxjs/awesome-mobx#tutorials) -- [Blogs](https://github.com/mobxjs/awesome-mobx#blogs) -- [Videos](https://github.com/mobxjs/awesome-mobx#videos) -- [Boilerplates](https://github.com/mobxjs/awesome-mobx#boilerplates) - [MobX awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx) + +## Credits + +MobX is inspired by reactive programming principles as found in spreadsheets. It is inspired by MVVM frameworks like in MeteorJS tracker, knockout and Vue.js. But MobX brings Transparent Functional Reactive Programming to the next level and provides a stand alone implementation. It implements TFRP in a glitch-free, synchronous, predictable and efficient manner. + +A ton of credits for [Mendix](https://github.com/mendix), for providing the flexibility and support to maintain MobX and the chance to proof the philosophy of MobX in a real, complex, performance critical applications. diff --git a/notes.md b/notes.md index 6848a9edc..b659b60e5 100644 --- a/notes.md +++ b/notes.md @@ -64,6 +64,9 @@ - [x] re-execute perf checks - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] add deprecation messages to latest mobx 5 + - [ ] merge 2398 + - [ ] fix docs + - [ ] fix interactive tut - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use @@ -110,6 +113,16 @@ Why declare fields ## NOTES +--- + +### MobX and Decorators + +Wait! This example doesn't use decorators. Haven't you seen MobX code before that uses them? In MobX 6 we have chosen to move away from them for maximum compatibility with standard JavaScript. + +There is a codemod available to help you upgrade existing code to be compliant with MobX 6. + +## The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. + ## Blog - mobx 6 is more backward compatible than its predecessor diff --git a/website/static/css/custom.css b/website/static/css/custom.css index fc859411a..08b18b687 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -139,9 +139,3 @@ article p img { font-size: 14px; } } - -/* temporarily */ -body { - background: #333; - filter: invert(100%); -} From 0f9b608cdb2b00f54b452214564ae832ab3befc3 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 25 Jul 2020 01:04:59 +0100 Subject: [PATCH 0476/1043] Some improvements in decorator setup --- docs/best/decorators.md | 5 +++-- docs/intro/how-to-read.md | 2 -- docs/intro/installation.md | 18 ++++++++++-------- notes.md | 8 -------- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 47bede765..28cf24659 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -46,8 +46,8 @@ class TodoList { MobX before version 6 did not require the `makeObservable(this)` call in the constructor, but because it makes the implementation of decorator simpler and more compatible, it now does. This instructs MobX to make the instances observable following the information in the decorators -- the decorators take the place of the second argument to `makeObservable`. We intend to continue to support decorators in this form. - -Note: When migrating from MobX 4/5 to 6, we recommend to always run the code mode, as even in the case where you keep using decorators, the `makeObservable` calls need to be generated. See the [migration guide](../faq/migrate-to-6) for details. +Any existing MobX 4/5 codebase can be migrated to use `makeObservable` calls by our [code-mod](https://www.npmjs.com/package/mobx-undecorate). +When migrating from MobX 4/5 to 6, we recommend to always run the code-mod, to make sure the necessary `makeObservable` calls are generated. See the [migration guide](../faq/migrate-to-6) for details. ## Using `observer` as decorator @@ -77,6 +77,7 @@ Install support for decorators: `npm i --save-dev @babel/plugin-proposal-class-p "plugins": [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose": false }] + // In contrast to MobX 4/5, "loose" must be false! ^ ] } ``` diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index 17ef8d70d..3087240a5 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -24,8 +24,6 @@ Here are a few suggestions about the next things to read: - [`makeObservable` / `makeAutoObservable`](../refguide/make-observable.md). -- Scan through the rules of [`observable`](../refguide/observable.md). - - It's also useful to at scan through the sections on [observable arrays](../refguide/array.md) and [observable maps](../refguide/map.md) to see what extra methods are available beyond the built-in JS `Array` and `Map` - Learn about [action](../refguide/action.md). Also read the discussion about [asynchronous actions](../best/actions.md). diff --git a/docs/intro/installation.md b/docs/intro/installation.md index aed62c398..96d051939 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -16,21 +16,23 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: - CDN: - cndjs: https://cdnjs.com/libraries/mobx - - Unpkg: `` + - unpkg: https://unpkg.com/mobx/lib/mobx.umd.js - ⚠️ When using a CDN, it is best to check the url in your browser and see what version it resolves to, so that your users aren't accidentally served a newer version in the future when updates are release. So use an url like: https://unpkg.com/mobx@5.15.4/lib/mobx.umd.production.min.js instead. Substitute `production.min` with `development` in the URL for a development build. -## Modern JavaScript environments +## MobX on older JavaScript environments -The main entry point of the MobX 6 package ships with ES5 code for backward compatibility -- it works in any ES5 environment. But if you only intend to run MobX 6 in modern environments, consider using consider using the faster and smaller ES6 build: `lib/mobx.es6.js`. For example by setting up a webpack alias: `resolve: { alias: { mobx: __dirname + "/node_modules/mobx/lib/mobx.es6.js" }}` +By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). Examples are Internet Explorer (before Edge), Node.js < 6, iOS < 10, Android before RN 0.59, or Android on iOS. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../refguide/configure.md#limitations-without-proxy-support). -## Older JavaScript environments - -By default MobX uses proxies for optimal performance and compatibility. However, on older JavaScript engines `Proxy` is not available (see [Proxy support](https://kangax.github.io/compat-table/es6/#test-Proxy)). Examples are Internet Explorer (before Edge), Node.js < 6, iOS < 10, Android before RN 0.59, or Hermes runtime. In such cases, MobX can fallback to an ES5 compatible implementation which works almost identically, though there are a few [limitations without Proxy support](../best/limitations-without-proxies.md). - -You have to explicitly enable the fallback implementation by configuring [`useProxies`](../refguide/configure#useproxies): +You will have to explicitly enable the fallback implementation by configuring [`useProxies`](../refguide/configure#useproxies): ```javascript import { configure } from "mobx" configure({ useProxies: "never" }) // or "ifavailable" ``` + +## MobX and Decorators + +If you have used MobX before, or if you followed online tutorials, you probably saw MobX with decorators like `@observable`. +In MobX 6 we have chosen to move away by default from decorators for maximum compatibility with standard JavaScript. +They can still be used though if you [enable decorators](../best/decorators.md). diff --git a/notes.md b/notes.md index b659b60e5..95d748462 100644 --- a/notes.md +++ b/notes.md @@ -115,14 +115,6 @@ Why declare fields --- -### MobX and Decorators - -Wait! This example doesn't use decorators. Haven't you seen MobX code before that uses them? In MobX 6 we have chosen to move away from them for maximum compatibility with standard JavaScript. - -There is a codemod available to help you upgrade existing code to be compliant with MobX 6. - -## The [decorators guide](http://mobxjs.github.io/mobx/best/decorators.html) has more information. - ## Blog - mobx 6 is more backward compatible than its predecessor From 132fdf81d472ef6cb5635335647d46bf3c05375d Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 25 Jul 2020 15:12:24 +0100 Subject: [PATCH 0477/1043] Doc improvements --- docs/README.md | 5 ++++- docs/intro/installation.md | 2 +- docs/intro/overview.md | 22 +++++++++++----------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8bde611c1..afd6d396b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -130,12 +130,15 @@ To learn about the underlying concepts together with a larger example, please re MobX is one of the least obtrusive libraries you can use for state management. That makes the `MobX` approach not just simple, but very scalable as well. It has caused many well known companies to adopt MobX, which is used at companies like Microsoft, Amazon, Netflix, EA Games and [many more](https://github.com/mobxjs/mobx/issues/681). +The reason for MobX's popularity boil down to this: _With MobX you write typically less and more straight-forward code, that is better optimized than comparable solutions_. In other words, it maximizes productivity. + - **Mutable Data < Immutable Data < Observable Data**. Immutability is too often seen as silver bullet in programming. While it is justified in many cases, for stateful data or CRUD operations it is often a mismatch. Re-creating an object just to modify one of its attributes is not only cognitive challenging, it is inefficient as well. It does make change detection easy. But only compared to 'classic' mutable data. Observable data will pick up changes without any diffing. At all. And you will always be looking at the latest version. From anywhere. - **Simpler actions are easier to read and maintain**. As demonstrated above, modifying state when using MobX is very straightforward. You write down your intentions imperatively. And MobX will make sure no mutation will goes undetected. - **Fine grained observability is efficient**. MobX is a reactive library that builds a graph of all the derivations in your application to find the least number of re-computations that is needed to prevent staleness. By performing runtime analysis it will optimize at a much finer granularity than any programmer would to by hand. -- **Access any observable anywhere**. If an observable is used in a reactive context, MobX will track it. Regardless how it got there; through a closure, module import, React component prop or context? It doesn't matter. That keeps things simple and guarantees architectural freedom. +- **Access any observable anywhere**. If an observable is used in a reactive context, MobX will track it. Regardless how it got there; through a closure, module import, React component prop or context? It doesn't matter. That keeps things simple and guarantees architectural freedom. This doesn't mean that there shouldn't be any limitations on how data is organized. But the limitations shouldn't be driven by the limitations of the state management libraries, but rather by the conceptual design decisions your team makes. - **Structure state using any common language construct**. With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models (At Mendix for example ~500 different domain classes in a single application). MobX has few opinions, so you are free to either use classes or plain old objects. To store direct references or just identifiers. - **Easy interoperability**. MobX works with enriched but plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific flavors. So you can simply keep using promises, async/await, generators, your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. +- **Asynchronous processes aren't special**. They are merely multiple synchronous actions spread over time. Because observable data structures allow you to hold on to references, asynchronous processes aren't more complicated than they should be. ## Further resources and documentation diff --git a/docs/intro/installation.md b/docs/intro/installation.md index 96d051939..d81ecfae8 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -12,7 +12,7 @@ MobX works in any ES5 environment, which includes browsers and NodeJS: - Yarn: `yarn add mobx`. React bindings: `yarn add mobx-react` -- NPM: `npm install mobx --save`. React bindings: `npm install mobx-react --save`. +- NPM: `npm install mobx --save`. React bindings: `npm install mobx-react-lite --save`. - CDN: - cndjs: https://cdnjs.com/libraries/mobx diff --git a/docs/intro/overview.md b/docs/intro/overview.md index 087809e63..7eca4e051 100644 --- a/docs/intro/overview.md +++ b/docs/intro/overview.md @@ -12,9 +12,8 @@ So far it all might sound a bit fancy, but making an app reactive using MobX boi ## 1. Define your state and make it observable -Store state in any data structure you like; objects, array, classes. -Cyclic data structures, references, it doesn't matter. -Just make sure that all properties that you want to change over time are marked by MobX to make them observable. +Store state in any data structure you like; plain objects, array, classes, cyclic data structures, references, it doesn't matter for the workings of MobX. +Just make sure that all properties that you want to change over time are marked 'observable' so that MobX can track them. Here is a simple example: ```javascript import { makeAutoObservable } from "mobx" @@ -37,8 +36,8 @@ you can now create views that automatically update whenever relevant data in a ` MobX will find the minimal way to update your views. This single fact saves you tons of boilerplate and is [wickedly efficient](https://mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/). -Generally speaking any function can become a reactive view that observes its data, and MobX can be applied in any ES5 conformant JavaScript environment. -But here is an (ES6) example of a view in the form of a React component. +Generally speaking any function can become a reactive view that observes its data. +But here is an example of a React component to create a view on the timer state: ```javascript import * as React from "react" @@ -57,10 +56,7 @@ render(, document.getElementById("root")) The third thing to do is to modify the state. That is what your app is all about after all. - -Let's alter the timer every second, and see that the UI will update automatically when needed. Let's also implement that `resetTimer` method. - -Here's the new `Timer` model with a few methods added that modify state: +Here's the new `Timer` model with a few methods added that modify the state: ```javascript import { makeAutoObservable } from "mobx" @@ -88,8 +84,12 @@ setInterval(() => { }, 1000) ``` -These methods, `increaseTimer` and `resetTimer` are just like you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. -Notice that making updates asynchronously doesn't require any special wiring; since MobX is a \_re_active system, it doesn't matter how or even when state updates are triggered; the reactivity system will propagate changes in any case. +These methods, `increaseTimer` and `resetTimer` are just like how you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. + +Note that making updates asynchronously doesn't require any special wiring; since MobX is a \_re_active system, it doesn't matter how or even when state updates are triggered; the reactivity system will propagate changes in any case. + +Methods that modify state are called _actions_ in MobX terminology. In contrast to _views_ which compute new information based on the current state. +Every method should serve at most one of those two goals. **_MobX helps you do things in a simple straightforward way_**. From 929109b043b685630fc8e90293c7d02e40c6202d Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 25 Jul 2020 16:23:03 +0100 Subject: [PATCH 0478/1043] Merge concepts and overview --- docs/README.md | 4 +- docs/intro/concepts.md | 88 ++++++++++++++++++++----------------- docs/intro/overview.md | 99 ------------------------------------------ website/i18n/en.json | 4 +- website/sidebars.json | 7 ++- 5 files changed, 54 insertions(+), 148 deletions(-) delete mode 100644 docs/intro/overview.md diff --git a/docs/README.md b/docs/README.md index afd6d396b..de520f904 100644 --- a/docs/README.md +++ b/docs/README.md @@ -109,8 +109,8 @@ const TimerView = observer(({ timer }) => ( ReactDOM.render(, document.body) ``` -To get more detail about this example, see [the gist of MobX](http://mobxjs.github.io/mobx/intro/overview.html). -To learn about the underlying concepts together with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html). Or read on to see some of the benefits of MobX. +To learn about the core concepts of MobX with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html) or take the [10 minute interactive introduction to MobX and React](https://mobx.js.org/getting-started). +Read on to learn about some of the benefits of using MobX. ## What others are saying... diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 096c7b23e..9a663afc2 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -1,28 +1,31 @@ --- -sidebar_label: Concepts & Principles +title: The gist of MobX +sidebar_label: The gist of MobX hide_title: true --- -# Concepts & Principles +# The gist of MobX ## Concepts -MobX distinguishes the following concepts in your application. +MobX distinguishes the following three concepts in your application: -We show example code to illustrate these concepts. For clarity we don't use the convenience function `makeAutoObservable` yet in this code. +1. State +2. Actions +3. Derivations -In the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can dive deeper into this example and build a user interface using [React](https://facebook.github.io/react/) around it. +Let's take a closer look at these concepts. Or, alternatively, in the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started) you can interactively dive deeper into these concepts step by step and build a simple Todo list app using [React](https://facebook.github.io/react/) around it. -### 1. State +### 1. Define state and make it observable _State_ is the data that drives your application. Usually there is _domain specific state_ like a list of todo items and there is _view state_ such as the currently selected element. State is like spreadsheets cells that hold a value. -MobX adds observable capabilities to existing data structures like objects, arrays and class instances. -This can simply be done by using `makeObservable` in its constructor to annotate your class properties as `observable`. +Store state in any data structure you like; plain objects, array, classes, cyclic data structures, references, it doesn't matter for the workings of MobX. +Just make sure that all properties that you want to change over time are marked `observable` so that MobX can track them. Here is a simple example: ```javascript import { makeObservable, observable, action } from "mobx" @@ -47,29 +50,31 @@ class Todo { } ``` +(Tip: this example could be shortened by using [`makeAutoObservable`](../refguide/make-observable.md) instead, but by being explicit we can show the different concepts in detail) + Using `observable` is like turning a property of an object into a spreadsheet cell. But unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. But what about `toggle`, which we marked `action`? -### 2. Actions +### 2. Update state using actions An _action_ is any piece of code that changes the _state_. User events, backend data pushes, scheduled events, etc. -An action is like a user that enters a new value in a spreadsheet cell. +An action is like a user that enters a new value into a spreadsheet cell. -In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX requires that you mark any code that changes an `observable` as an [`action`](../refguide/action.md). -By marking methods this way you make MobX automatically apply transactions for optimal performance. +In the `Todo` model you can see that we have a method `toggle` that changes the value of `finished`. `finished` is marked as `observable`. MobX recommends that you mark any code that changes `observable`s as [`action`](../refguide/action.md), so that MobX can automatically apply transactions for optimal performance. -This helps you structure your code and prevents you from inadvertantly changing state when you don't want to. This is the default behavior and is recommended. -You can however loosen [_strict mode_](../refguide/api##-enforceactions-) to allow you to modify state outside actions as well. +Using actions helps you to structure your code and prevents from inadvertently changing state when you don't want to. +Methods that modify state are called _actions_ in MobX terminology. In contrast to _views_ which compute new information based on the current state. +Every method should serve at most one of those two goals. -### 3. Derivations +### 3. Create derivations that automatically respond to state changes _Anything_ that can be derived from the _state_ without any further interaction is a derivation. Derivations exist in many forms: - The _user interface_. -- _Derived data_, such as the number of todos left. +- _Derived data_, such as the number of `todos` left. - _Backend integrations_ like sending changes to the server. MobX distinguishes two kind of derivations: @@ -80,7 +85,7 @@ MobX distinguishes two kind of derivations: People starting with MobX tend to use reactions too often. The golden rule is: if you want to create a value based on the current state, use `computed`. -#### Computed +#### 3.1. Model derived values using computed You created a computed value by defining a property using a JS getter function (`get`) and then marking it with `computed` with `makeObservable`. @@ -103,18 +108,20 @@ class TodoList { MobX will ensure that `unfinishedTodoCount` is updated automatically when a todo is added or when one of the `finished` properties is modified. -Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically, and only when required. +Computations like these resemble formulas in spreadsheet programs like MS Excel. They update automatically, but only when required. That is, if something is interested in their outcome. -#### Reactions +#### 3.2. Model side effects using reactions For you as a user to be able to see a change in state or computed values on the screen a _reaction_ is needed that repaints part of the GUI. -Reactions are similar to a computed value, but instead of producing a new value, a reaction produces a side effect for things like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. -In short, reactions bridge [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. +Reactions are similar to computed values, but instead of producing information, reactions produces side effect like printing to the console, making network requests, incrementally updating the React component tree to patch the DOM, etc. +In short, reactions bridge the worlds of [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. + +By far the most used form of reactions are UI components. -##### React components +#### 3.3. Reactive React components -If you are using React, you can turn your (stateless function) components into reactive components by wrapping it with the [`observer`](http://mobxjs.github.io/mobx/react/react-integration.html) function from the `mobx-react` package. +If you are using React, you can turn your components into reactive components by wrapping them with the [`observer`](http://mobxjs.github.io/mobx/react/react-integration.html) function from the `mobx-react-lite` package. ```javascript import * as React from "react" @@ -143,34 +150,23 @@ const store = new TodoList([new Todo("Get Coffee"), new Todo("Write simpler code render(, document.getElementById("root")) ``` -`observer` turns React (function) components into derivations of the data they render. +`observer` converts React components into derivations of the data they render. When using MobX there are no smart or dumb components. -All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, but also no more than that. So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, and it will cause the `TodoListView` to render if the number of unfinished tasks has changed. -However, if you would remove the `Tasks left` line (or put it into a separate component), the `TodoListView` will no longer re-render when ticking a box. - -##### Linting - -If you find it hard to adopt the mental model of MobX, MobX can be configured to be very strict and warn at run-time whenever you deviate from these patterns. See [linting MobX](../refguide/configure.md#linting-options). - -##### Try it out! - -You can try this out yourself on [CodeSandbox](https://codesandbox.io/s/concepts-principles-il8lt?file=/src/index.js:1161-1252). - -You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). +All components render smartly but are defined in a dumb manner. MobX will simply make sure the components are always re-rendered whenever needed, and never more than that. -##### Learn more +So the `onClick` handler in the above example will force the proper `TodoView` to render as it uses the `toggle` action, but will only cause the `TodoListView` to render if the number of unfinished tasks has changed. +And if you would remove the `Tasks left` line (or put that into a separate component), the `TodoListView` will no longer re-render when ticking a task. To learn more about how React works with MobX, read [React integration](../react/react-integration.md). -##### Custom reactions +#### 3.4. Custom reactions -Custom reactions can simply be created using the [`autorun`](../refguide/autorun.md), +You will need them rarely, but custom reactions can simply be created using the [`autorun`](../refguide/autorun.md), [`reaction`](../refguide/reaction.md) or [`when`](../refguide/when.md) functions to fit your specific situations. - For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: ```javascript -/* a function that observes the state */ +/* a function that automatically observes the state */ autorun(() => { console.log("Tasks left: " + todos.unfinishedTodoCount) }) @@ -196,3 +192,13 @@ _Computed values_ are updated **lazily**. Any computed value that is not activel If a view is no longer in use it will be garbage collected automatically. All _Computed values_ should be **pure**. They are not supposed to change _state_. + +## Try it out! + +You can play with the above yourself on [CodeSandbox](https://codesandbox.io/s/concepts-principles-il8lt?file=/src/index.js:1161-1252). + +## Linting + +If you find it hard to adopt the mental model of MobX, MobX can be configured to be very strict and warn at run-time whenever you deviate from these patterns. See [linting MobX](../refguide/configure.md#linting-options). + +## Learn more diff --git a/docs/intro/overview.md b/docs/intro/overview.md deleted file mode 100644 index 7eca4e051..000000000 --- a/docs/intro/overview.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: The gist of MobX -sidebar_label: The gist of MobX -hide_title: true ---- - - - -# The gist of MobX - -So far it all might sound a bit fancy, but making an app reactive using MobX boils down to just these three steps: - -## 1. Define your state and make it observable - -Store state in any data structure you like; plain objects, array, classes, cyclic data structures, references, it doesn't matter for the workings of MobX. -Just make sure that all properties that you want to change over time are marked 'observable' so that MobX can track them. Here is a simple example: - -```javascript -import { makeAutoObservable } from "mobx" - -class Timer { - secondsPassed = 0 - - constructor() { - makeAutoObservable(this) - } -} - -const myTimer = new Timer() -``` - -## 2. Create a view that responds to changes in the State - -We didn't make our `Timer` observable for nothing; -you can now create views that automatically update whenever relevant data in a `Timer` instance changes. -MobX will find the minimal way to update your views. -This single fact saves you tons of boilerplate and is [wickedly efficient](https://mendix.com/tech-blog/making-react-reactive-pursuit-high-performing-easily-maintainable-react-apps/). - -Generally speaking any function can become a reactive view that observes its data. -But here is an example of a React component to create a view on the timer state: - -```javascript -import * as React from "react" -import { render } from "react-dom" -import { observer } from "mobx-react-lite" - -const TimerView = observer(({ timer }) => ( - -)) -render(, document.getElementById("root")) -``` - -(For the implementation of `resetTimer` method see the next section) - -## 3. Modify the State - -The third thing to do is to modify the state. -That is what your app is all about after all. -Here's the new `Timer` model with a few methods added that modify the state: - -```javascript -import { makeAutoObservable } from "mobx" - -class Timer { - secondsPassed = 0 - - constructor() { - makeAutoObservable(this) - } - - increaseTimer() { - this.secondsPassed += 1 - } - - resetTimer() { - this.secondsPassed = 0 - } -} - -const myTimer = new Timer() - -setInterval(() => { - myTimer.increaseTimer() -}, 1000) -``` - -These methods, `increaseTimer` and `resetTimer` are just like how you would write them without MobX. You can use them anywhere -- from React event handlers or in `setInterval`, for instance. - -Note that making updates asynchronously doesn't require any special wiring; since MobX is a \_re_active system, it doesn't matter how or even when state updates are triggered; the reactivity system will propagate changes in any case. - -Methods that modify state are called _actions_ in MobX terminology. In contrast to _views_ which compute new information based on the current state. -Every method should serve at most one of those two goals. - -**_MobX helps you do things in a simple straightforward way_**. - -Feel free to try this example on [CodeSandbox](https://codesandbox.io/s/the-gist-of-mobx-piqqp?file=/src/index.js). - -To learn more about the concepts and principles underlying MobX, together with a more worked out example, read [Concepts & Principles](concepts.md). To learn more -about how to use MobX with React, read [React integration](../react/react-integration.md). diff --git a/website/i18n/en.json b/website/i18n/en.json index 9a44511c0..756141c98 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -45,8 +45,8 @@ "sidebar_label": "Migrating to MobX 6 [🚀]" }, "intro/concepts": { - "title": "intro/concepts", - "sidebar_label": "Concepts & Principles" + "title": "The gist of MobX", + "sidebar_label": "The gist of MobX" }, "intro/how-to-read": { "title": "How to read this documentation", diff --git a/website/sidebars.json b/website/sidebars.json index 2a3fa64f3..e9f9ae60d 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -4,9 +4,7 @@ "README", "intro/how-to-read", "intro/installation", - "intro/overview", - "intro/concepts", - "faq/faq" + "intro/concepts" ], "MobX and React": [ "react/react-integration", @@ -59,7 +57,8 @@ "refguide/configure", "best/decorators", "best/store", - "faq/migrate-to-6" + "faq/migrate-to-6", + "faq/faq" ], "Extending MobX": [ "refguide/extending", From e4fb69e14d234dca947e519c9b2c0b3d63c4b700 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 25 Jul 2020 23:42:38 +0100 Subject: [PATCH 0479/1043] Created a one-pager make-observable --- docs/intro/concepts.md | 2 - docs/refguide/make-observable.md | 210 +++++++++++++++---------------- docs/refguide/modifiers.md | 6 +- notes.md | 1 + website/i18n/en.json | 10 +- website/sidebars.json | 16 +-- website/static/css/custom.css | 5 + 7 files changed, 122 insertions(+), 128 deletions(-) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 9a663afc2..465e8bd51 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -200,5 +200,3 @@ You can play with the above yourself on [CodeSandbox](https://codesandbox.io/s/c ## Linting If you find it hard to adopt the mental model of MobX, MobX can be configured to be very strict and warn at run-time whenever you deviate from these patterns. See [linting MobX](../refguide/configure.md#linting-options). - -## Learn more diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md index 78f8154db..f0a57524d 100644 --- a/docs/refguide/make-observable.md +++ b/docs/refguide/make-observable.md @@ -1,26 +1,55 @@ --- -title: makeObservable / makeAutoObservable -sidebar_label: makeObservable / makeAutoObservable +title: Making things observable +sidebar_label: Making things observable hide_title: true --- -# makeObservable / makeAutoObservable +# Making things observable + +Properties, entire objects, arrays, Maps and Sets can all be made observable. +The basics of making objects observable is by specifying an annotation per property by using `makeObservable`. +The most important annotations are: + +- `observable` define a trackable field that stores state. +- `action` mark a method as action that will modify state. +- `computed` mark a getters that will derive new facts from the state and cache its output. + +Collections such as arrays, Maps and Sets are made observable automatically. + +## makeObservable Usage: - `makeObservable(target, annotations?, options?)` -- `makeAutoObservable(arget, excludes?, options?)` -In `makeObservable`, a JavaScript object (including class instance) is passed into `target`. In `annotations` you can declare properties observable, getters as computed and methods as actions. +MakeObservable can be used to trap _existing_ object properties and make them observable. Any JavaScript object (including class instances) can be passed into `target`. +Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. +The `annotations` argument then maps property names to [annotations](#available-annotations) to apply (see below for the list of available annotations). + +Methods that derive information and take arguments (for example `findUsersOlderThan(age: number): User[]`) don't need any annotation. +Their read operations will still be tracked when they are called from a reaction, but their output won't be memoized to avoid memory leaks (see also [mobx-utils:computedFn](https://github.com/mobxjs/mobx-utils#computedfn)). + +
    + +MakeObservable can only annotate properties declared by its own class definition. If a sub- or superclass introduces observable fields, it will have to call `makeObservable` for those properties itself. + +Decorators note: When using [decorators](../best/decorators), the `annotations` argument can be omitted. -Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. The `annotations` argument is a mapping with declarations about properties and methods: +TypeScript note: When decorating private properties in TypeScript, you can pass the private property names as generic argument to `makeObservable` to suppress the compile error about the field not existing like this: `makeObservable<"myPrivateField" | "myOtherPrivateField>(this, { myPrivateField: observable })` + +
    + + + ```javascript import { makeObservable, observable, computed, action } from "mobx" class Doubler { + value + constructor(value) { makeObservable(this, { value: observable, @@ -40,33 +69,7 @@ class Doubler { } ``` -Annotation keys are the names of properties and methods. - -Possible annotation values are: - -- `observable`: Used on a property to declare it observable by MobX. A property can be anything that MobX can track: primitive values, arrays, objects and [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map). The property cannot be a getter or a setter. See also the rules of [`observable`](observable.md). - -- For more fine-grained control of observability you can use a selection of [modifiers](modifiers.md). - -- `action`: Used on a method that modifies observable properties. See also [action](action.md). - -- `action.bound`: Like action, but used to bind the method. See [action.bound](action.md#actionbound). - -- `computed`: Used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value from observable state. Should have no side effects and not modify state. For more read [computed](computed.md). - -- `true`: Infer annotation: getters are `computed`, methods are `action`, any property is `observable`. Usually you would use `makeAutoObservable` to infer. - -- `false`: Explicitly do not annotate this property. Normally only useful with `makeAutoObservable`. - -## `makeObservable` and decorators - -You can also use `makeObservable` with [decorators](../best/decorators.md). In this case you can leave out the annotations argument and instead declare observables, computed and actions using decorator syntax. Using decorators requires special compiler support. - -## `makeAutoObservable` - -`makeAutoObservable` behaves much like `makeObservable`, but infers all properties by default. You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. - -Here is the doubler with `makeAutoObservable`: + ```javascript import { makeAutoObservable } from "mobx" @@ -89,100 +92,95 @@ class Doubler { } ``` -This can be more compact and easy to maintain than using `makeObservable`. + -### When you call makeAutoObservable +```javascript +import { observable } from "mobx" + +function createDoubler(value) { + return observable({ + value, + get double() { + return this.value * 2 + }, + increment() { + this.value++ + } + }) +} +``` -When you call `makeAutoObservable` all properties you want to be observable -_must_ exist on the instance already. + -In the example above you see we have declared `value` as a [public instance -field](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields) -in the class body. This ensures the property exists on the instance even before -`constructor` is called, so you can use `makeAutoObservable` at the start of -your constructor. +## `makeAutoObservable` -Class field declarations are a [stage 3 language feature for -JS](https://github.com/tc39/proposal-class-fields), so while this feature is -close to standardization it's not officially part of JavaScript yet. It's -widely used though. Babel supports it with a -[plugin](https://babeljs.io/docs/en/babel-plugin-proposal-class-properties) and -`create-react-app` supports it out of the box. You can use this syntax in -TypeScript too, where it's used very widely for type declaration. +Usage: -In JavaScript a public class field looks rather redundant if you only end up setting its value in the constructor. `makeAutoObservable` also works without -public class fields, but you have to call it at the end of the constructor in this case: +- `makeAutoObservable(target, overrides?, options?)` -```javascript -import { makeAutoObservable } from "mobx" +`makeAutoObservable` is like `makeObservable` on steroids, as it infers all properties by default. You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. +See the code tabs above for an example. +This can be more compact and easier to maintain than using `makeObservable`. +However, `makeAutoObservable` cannot be used on classes that have super- or are subclassed. -class Doubler { - constructor(value) { - this.value = value - // ensure all properties exist before calling makeAutoObservable - makeAutoObservable(this) - } +Inference rules: - get double() { - return this.value * 2 - } +- Any (inherited) member that contains a `function` value will be annotated with `autoAction`. +- Any `get`ter will be annotated with `computed`. +- Any other _own_ field will be marked with `observable`. +- Members marked with `false` in the `overrides` argument will not be annotated. Use this for for example read only fields such as identifiers. - increment() { - this.value++ - } -} -``` +
    -### Excluding properties that are not observable +When you call `makeObservable` or `makeAutoObservable` all properties you want to be observable +_must_ exist on the instance already. Either by [declaring](https://github.com/tc39/proposal-class-fields) them (recommended, as done above) or otherwise by assigning them _before_ calling `makeAutoObservable` -Here is how you can exclude a property from being observable: +Providing annotations must be done unconditionally, as this makes it possible to cache the inference results. -```javascript -import { makeAutoObservable } from "mobx" +
    -class Todo { - id = Math.random() - title = "" - finished = false +## `observable` - constructor() { - makeAutoObservable(this, { id: false }) - } +Usage: - toggle() { - this.finished = !finished - } -} -``` +- `observable(source, overrides?, options?)` -`id` is not intended to be observable as it does not change after construction. -We have therefore declared it as `false` in the `exclusions` argument of -`makeAutoObservable`. +The `observable` annotation can also be called as function to make an entire object observable at once. +The `source` object will be cloned and all members will be made observable, similar to how it would be done by `makeAutoObservable`. +Likewise, an `overrides` map can be provided to specify the annotations of specific members. +See the above code block for an example. -### Excluding methods that are not actions +The object returned by `observable` will be a Proxy, which means that properties that are added later to the object will be picked up and made observable as well (except when [proxy usage](../refguide/configure.md#proxy-support) is disabled). -By default, `makeAutoObservable` considers all methods to be actions. It's common for classes to have methods that are not actions, however, but compute derived information that cannot be getters as they take arguments. +The `observable` method can also be called with collections types like [arrays](../refguide/API#observable-array), [Maps](../refguide/API#observable-map) and [Sets](../refguide/API#observable-set). Those will be cloned as well and converted into their observable counterpart. -```javascript -class Zoo { - constructor() { - this.makeAutoObservable(this, { filterByAnimalClass: false }) - } +
    - // this is an action - addAnimal(animal) { - // ... - } +Primitive values cannot be made observable by MobX since they are immutable in JavaScript (but they can be [boxed](../refguide/API.md#observable-box)). +Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. +Making class members observable is considered the responsibility of the class constructor. - // this is not an action - filterByAnimalClass(animalClass) { - // ... - } -} -``` +
    + +## Available annotations + +| Annotation | Description | +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `observable` | Defines a trackable field that stores state. Any value assigned to an `observable` field will be made recursively observable as well, if possible. That is, if and only if the value is a plain object, array, Map or Set. | +| `observable.ref` | Like `observable`, but only reassignments will be tracked. The assigned values themselves won't be made observable automatically. Use this if you intend to store for example immutable data in an observable field. | +| `observable.shallow` | Like `observable.ref` but for collections; any collection assigned will be made observable, but the contents of the collection itself won't become observable. | +| `observable.struct` | Like `observable`, except that any assigned value that is structurally equal to the current value will be ignored. | +| `action` | Mark a method as action that will modify state. See [action](../refguide/action.md) for details. | +| `action.bound` | Like action, but will also bind the action to the instance so that `this` will always be set. | +| `computed` | Can be used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value that can be cached. See [computed](../refguide/computed.md) for details. | +| `true` | Infer the best annotation. See [makeAutoObservable](#makeAutoObservable). | +| `false` | Explicitly do not annotate this property. | +| `autoAction` | Should not be used explicitly, but is used under the hood by `makeAutoObservable` to mark methods that can act as action or derivation, based on their calling context | -In this case, the method `filterByAnimalClass` cannot be identified as `computed` as it is not a getter. By default, `makeAutoObservable` would interpret it as an action. We therefore have to exclude it from consideration. +## The `options` argument -### Bound actions +The above APIs take an optional `options` argument which is an object that supports the following options: -If you want to automatically bind the action so you can use it as a callback, you can override the behavior of `makeAutoObservable` using [`action.bound`](action.md#actionbound). Alternatively you can define the methods as [arrow function](action.md#bound-arrow-functions). +- `autoBind: true`. Automatically binds all created actions to the instance. +- `deep: false`. Use `observable.ref` by default, rather than `observable` to create new observable members +- `name: `. Gives the object a debug name that is printed in error messages and reflection APIs. diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index e4ef2fdb8..616daf71a 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -10,11 +10,7 @@ hide_title: true When you use `makeObservable`, `makeAutoObservable`, `extendObservable` and `observable.object` you can use annotations to specify how observable properties behave: -- `observable`: An alias for `observable.deep`. The default. -- `observable.deep`: This is the default modifier, used by any observable. It clones and converts any (not yet observable) array, Map or plain object into its observable counterpart upon assignment to the given property -- `observable.ref`: Disables automatic observable conversion, just creates an observable reference instead. -- `observable.struct`: Like `ref`, but will ignore new values that are structurally equal to the current value. -- `observable.shallow`: Can only used in combination with collections. Turns any assigned collection into an observable, but the values of that collection will be treated as-is and are not observable themselves. +TODO: move to refguide ### Deep observability diff --git a/notes.md b/notes.md index 95d748462..d9034a7d0 100644 --- a/notes.md +++ b/notes.md @@ -67,6 +67,7 @@ - [ ] merge 2398 - [ ] fix docs - [ ] fix interactive tut + - [ ] document and introduce flow annotation - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use diff --git a/website/i18n/en.json b/website/i18n/en.json index 756141c98..8043a32ba 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -56,10 +56,6 @@ "title": "Installation", "sidebar_label": "Installation" }, - "intro/overview": { - "title": "The gist of MobX", - "sidebar_label": "The gist of MobX" - }, "LINKS": { "title": "LINKS" }, @@ -140,8 +136,8 @@ "sidebar_label": "Introspection APIs" }, "refguide/make-observable": { - "title": "makeObservable / makeAutoObservable", - "sidebar_label": "makeObservable / makeAutoObservable" + "title": "Making things observable", + "sidebar_label": "Making things observable" }, "refguide/map": { "title": "Observable Maps", @@ -203,9 +199,9 @@ "Github": "Github" }, "categories": { + "Introduction": "Introduction", "Basics": "Basics", "MobX and React": "MobX and React", - "Making things observable": "Making things observable", "Updating observables with actions": "Updating observables with actions", "Computed values": "Computed values", "Effects for observables": "Effects for observables", diff --git a/website/sidebars.json b/website/sidebars.json index e9f9ae60d..4ef0a79a5 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -1,18 +1,12 @@ { "docs": { - "Basics": [ + "Introduction": [ "README", "intro/how-to-read", "intro/installation", "intro/concepts" ], - "MobX and React": [ - "react/react-integration", - "react/react-pitfalls", - "react/react-performance", - "react/react-class-components" - ], - "Making things observable": [ + "Basics": [ "refguide/make-observable", "refguide/observable", "refguide/array", @@ -24,6 +18,12 @@ "refguide/extend-observable", "refguide/is-observable" ], + "MobX and React": [ + "react/react-integration", + "react/react-pitfalls", + "react/react-performance", + "react/react-class-components" + ], "Updating observables with actions": [ "refguide/action", "best/actions", diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 08b18b687..71456f6ed 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -41,6 +41,11 @@ article p img { background: url("/img/github-brand.svg"); } +.detail { + font-size: 0.8em; + color: #979797; +} + /* BLM */ .slidingNav::before { content: "Black Lives Matter"; From 7d68e1ecbb12b2b6ebba6aaee7036de53ff40d5e Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 26 Jul 2020 00:37:59 +0100 Subject: [PATCH 0480/1043] Tried to make docs around observables much more concise and separate into basics and refguide --- docs/best/decorators.md | 2 +- docs/faq/migrate-to-6.md | 2 +- docs/intro/concepts.md | 2 +- docs/intro/how-to-read.md | 2 +- docs/refguide/action.md | 4 +- docs/refguide/api.md | 170 +++++++++++++++++++++----- docs/refguide/array.md | 93 -------------- docs/refguide/boxed.md | 68 ----------- docs/refguide/extend-observable.md | 69 ----------- docs/refguide/make-observable.md | 186 ---------------------------- docs/refguide/map.md | 64 ---------- docs/refguide/object.md | 4 +- docs/refguide/observable.md | 188 +++++++++++++++++++++++------ notes.md | 22 ++-- website/i18n/en.json | 26 +--- website/sidebars.json | 11 +- website/siteConfig.js | 2 +- 17 files changed, 320 insertions(+), 595 deletions(-) delete mode 100644 docs/refguide/array.md delete mode 100644 docs/refguide/boxed.md delete mode 100644 docs/refguide/extend-observable.md delete mode 100644 docs/refguide/make-observable.md delete mode 100644 docs/refguide/map.md diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 28cf24659..7d6f10855 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -7,7 +7,7 @@ hide_title: true # Decorators in MobX [🚀] -MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/make-observable) instead. +MobX before version 6 encouraged the use of ES.next decorators to mark things as `observable`, `computed` and `action`. Decorators are not currently a ES standard however, and the process of standardization is taking a long time. It also looks like the standard will be different from the way decorators were implemented previously. In the interest of compatibility we have chosen to move away from them in MobX 6, and recommend the use of [`makeObservable` / `makeAutoObservable`](../refguide/observable) instead. But many existing code bases use decorators, and a lot of the documentation and tutorial material online uses them as well. The rule is that anything you can use as an annotation to `makeObservable`, such as `observable`, `action` and `computed`, you can also use as a decorator. So let's examine what that looks like: diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index f50f10bee..45f9d6b6f 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -32,7 +32,7 @@ Due to standardized JavaScript limitations in how class fields are constructed, 2. Leave all the decorators and call `makeObservable(this)` in the `constructor`. This will pick up the meta data generated by the decortors. This is the recommend way to if you want to limit the impact of a MobX 6 migration. 3. Remove decorators and use `makeAutoObservable(this)` in the class `constructors`. -See [makeObservable / makeAutoObservable](../refguide/make-observable.md) for details. +See [makeObservable / makeAutoObservable](../refguide/observable.md) for details. Some specifics to note: diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 465e8bd51..a249aa4bf 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -50,7 +50,7 @@ class Todo { } ``` -(Tip: this example could be shortened by using [`makeAutoObservable`](../refguide/make-observable.md) instead, but by being explicit we can show the different concepts in detail) +(Tip: this example could be shortened by using [`makeAutoObservable`](../refguide/observable.md) instead, but by being explicit we can show the different concepts in detail) Using `observable` is like turning a property of an object into a spreadsheet cell. But unlike spreadsheets, these values can be not only primitive values, but also references, objects and arrays. diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index 3087240a5..1c622ae65 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -22,7 +22,7 @@ Here are a few suggestions about the next things to read: - [React integration](../react/react-integration.md). -- [`makeObservable` / `makeAutoObservable`](../refguide/make-observable.md). +- [`makeObservable` / `makeAutoObservable`](../refguide/observable.md). - It's also useful to at scan through the sections on [observable arrays](../refguide/array.md) and [observable maps](../refguide/map.md) to see what extra methods are available beyond the built-in JS `Array` and `Map` diff --git a/docs/refguide/action.md b/docs/refguide/action.md index a9df0da83..8d8706ee6 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -18,7 +18,7 @@ Usage: - `makeObservable(this, {someProperty: action.bound})` Any application has actions. Actions is code that that modifies the state. -MobX requires that you declare your actions, though [makeAutoObservable](make-observable.md) can automate much of this job. Actions help you to structure your code better and offer performance benefits. +MobX requires that you declare your actions, though [makeAutoObservable](observable.md) can automate much of this job. Actions help you to structure your code better and offer performance benefits. Actions are wrapped with with [`transaction`](api.md#transaction), [`untracked`](api.md#untracked), and [`allowStateChanges`](api.md#untracked). @@ -38,7 +38,7 @@ is derived from the function or method that is wrapped. Actions should only, and always, be used on functions that _modify_ state. Functions that just perform look-ups, filters etc should _not_ be marked as actions; to allow MobX to track their invocations. -If you use `makeAutoObservable` you have to [exclude these methods explicitly from being marked as actions](make-observable.md#excluding-methods-that-are-not-actions). +If you use `makeAutoObservable` you have to [exclude these methods explicitly from being marked as actions](observable.md#excluding-methods-that-are-not-actions). ## `runInAction` diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 38bc6dea0..52fd44190 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -21,70 +21,180 @@ _Making things observable_ ### `makeObservable` -Declare observables, computeds and actions in the class -constructor. +Usage: -[«`details`»](make-observable.md) +- `makeObservable(target, annotations?, options?)` + +Convert object members into observables, computeds and actions. + +[«`details`»](observable.md#makeObservable) ### `makeAutoObservable` -Automatically derive observables, computeds and actions in the class constructor. +Usage: + +- `makeAutoObservable(target, overrides?, options?)` + +Automatically convert object members into observables, computeds and actions. + +[«`details`»](observable.md#makeAutoObservable) + +### `extendObservable` + +Usage: + +- `extendObservable(target, properties, overrides?, options?) + +Can be used to introduced new properties on the `target` object and make them observable immediately. Basically a shorthand for `Object.assign(target, properties); makeAutoObservable(target, overrides, options);`. However existing properties on `target` won't be touched. + +Old-fashioned constructor functions can leverage `extendObservable` nicely: + +```javascript +function Person(firstName, lastName) { + extendObservable(this, { firstName, lastName }) +} -[«`details`»](make-observable.md) +const person = new Person("Michel", "Weststrate") +``` + +It is possible to use `extendObservable` to add observable fields to an existing object after instantiation, but be careful that adding an observable property this way is in itself not a fact that can be observed. ### `observable` -Mark a property as observable. +Usage: + +- `observable`: Mark a property as observable. +- `observable(source, overrides?, options?)`: Clones an object and makes it observable. Source can be a plain object, [array](#observable-array), [Map](#observable-map) or [Set](#observable-set). + +[«`details`»](observable.md#observable) + +### `observable.object` + +Usage: + +- `observable.object(source, overrides?, options?)` + +Alias for `observable(source, overrides?, options?)`. Creates a clone of the provided object and makes all its properties observable. + +[«`details`»](observable.md#observable) + +### `observable.array` + +Usage + +- `observable.array(initialValues?, options?)` + +Creates a new observable array based on the provided initial values. -[«`details`»](make-observable.md) +Besides all language built-in Array functions, the following goodies are available as well on observable arrays: -### `observable(value)` +- `clear()` Remove all current entries from the array. +- `replace(newItems)` Replaces all existing entries in the array with new ones. +- `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. -Make a value observable. +To recommend observable arrays back to plain arrays, it is recommend to use the `.slice()` method, or to convert recursively, see [toJS](#toJS) -[«`details`»](observable.md) +The `{ deep: false }` option can be used to make this array shallowly observable, that is, values stored in it won't be converted to observables automatically. -### `observable.object(value, decorators?, options?)` +### `observable.map` -Creates a clone of the provided object and makes all its properties observable. +Usage: -[«`details`»](object.md) +- `observable.map(initialMap?, options?)` -### `observable.array(value, options?)` +Creates a new observable Map based on the provided initialMap. +Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. +If you don't have Proxies enabled, creating observable maps is the recommended approach to create dynamically keyed collection. -Creates a new observable array based on the provided value. +The following functions are not in the Map spec but are available on observable Maps as well: -[«`details`»](array.md) +- `toJSON()`. Returns a shallow plain object representation of this map. (For a deep copy use [toJS](#toJS)). +- `merge(values)`. Copies all entries from the provided object into this map. `values` can be a plain object, array of entries or string-keyed ES6 Map. +- `replace(values)`. Replaces the entire contents of this map with the provided values. -### `observable.map(value, options?)` +The `{ deep: false }` option can be used to make this map shallowly observable, that is, values stored in it won't be converted to observables automatically. -Creates a new observable Map based on the provided value. +### `observable.set` -[«`details`»](map.md) +Usage: -### `observable.set(value, options?)` +- `observable.set(initialSet?, options?)` Create a new observable Set based on the provided value. +Use `set` whenever you want to create a dynamic set where the addition / removal of values needs to be observed, and where values can appear only once in the collection. -[«`details`»](set.md) +The `{ deep: false }` option can be used to make this set shallowly observable, that is, values stored in it won't be converted to observables automatically. -### `observable` modifiers +### `observable.ref` -Modify observable behavior. +Usage: -[«details»](modifiers.md) +- `observable.ref` -### `extendObservable` +Like the `observable` annotation, but only reassignments will be tracked. The assigned values themselves won't be made observable automatically. Use this if you intend to store for example immutable data in an observable field. + +[«`details`»](observable.md#available-annotations) + +### `observable.shallow` + +Usage: + +- `observable.shallow` + +Like the `observable` annotation, except that any assigned value that is structurally equal to the current value will be ignored. + +[«`details`»](observable.md#available-annotations) + +### `observable.struct` + +Usage: + +- `observable.struct` + +Like `observable.ref` but for collections; any collection assigned will be made observable, but the contents of the collection itself won't become observable. + +[«`details`»](observable.md#available-annotations) -Make an existing object observable. +### `observable.deep` -[«details»](extend-observable.md) +Usage: -### `observable.box(value, options?)` +- `observable.deep` -Creates an observable _box_ that stores an observable reference to a value. +Alias for the [`observable`](#observable) annotation. -[«`details`»](boxed.md) +[«`details`»](observable.md#available-annotations) + +### `observable.box` + +- `observable.box(value, options?)` + +All primitive values in JavaScript are immutable and hence per definition not observable. +Usually that is fine, as MobX usually can just make the _property_ that contains the value observable. + +In rare cases it can be convenient to have an observable "primitive" that is not owned by an object. +For these cases it is possible to create an observable _box_ that manages such a primitive. + +So `observable.box(value)` accepts any value and stores it inside a box. +The current value can be accessed through `.get()` and updated using `.set(newValue)`. + +By default stored values will be turned into observables themselves if possible. This can be disabled by using the `deep: false` option. + +```javascript +import { observable, autorun } from "mobx" + +const cityName = observable.box("Vienna") + +autorun(() => { + console.log(cityName.get()) +}) +// prints 'Vienna' + +cityName.set("Amsterdam") +// prints 'Amsterdam' +``` + +--- ## Actions diff --git a/docs/refguide/array.md b/docs/refguide/array.md deleted file mode 100644 index 3e858edfe..000000000 --- a/docs/refguide/array.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Observable Arrays -sidebar_label: arrays -hide_title: true ---- - - - -# Observable Arrays - -Usage: - -- `observable.array(initialValues?, options?)` -- `observable(initialValues)` - -Similar to objects, arrays can be made observable using `observable.array(values)` or by passing an array to [`observable`](observable.md). -This works recursively as well, so all (future) values of the array will also be observable. If you want to create an empty observable array, create it using -`observable.array()` without arguments. - -```javascript -import { observable, autorun } from "mobx" - -var todos = observable([ - { title: "Spoil tea", completed: true }, - { title: "Make coffee", completed: false } -]) - -autorun(() => { - console.log( - "Remaining:", - todos - .filter(todo => !todo.completed) - .map(todo => todo.title) - .join(", ") - ) -}) -// Prints: 'Remaining: Make coffee' - -todos[0].completed = false -// Prints: 'Remaining: Spoil tea, Make coffee' - -todos[2] = { title: "Take a nap", completed: false } -// Prints: 'Remaining: Spoil tea, Make coffee, Take a nap' - -todos.shift() -// Prints: 'Remaining: Make coffee, Take a nap' -``` - -Besides all built-in functions, the following goodies are available as well on observable arrays: - -- `clear()` Remove all current entries from the array. -- `replace(newItems)` Replaces all existing entries in the array with new ones. -- `find(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.find` proposal. -- `findIndex(predicate: (item, index, array) => boolean, thisArg?)` Basically the same as the ES7 `Array.findIndex` proposal. -- `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. -- `intercept(interceptor)`. Can be used to intercept any change before it is applied to the array. See [observe & intercept](observe.md) -- `observe(listener, fireImmediately? = false)` Listen to changes in this array. The `listener` callback will receive arguments that express an array splice or array change, conforming to [ES7 proposal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe). It returns a disposer function to stop the listener. - -Unlike the built-in implementation of the functions `sort` and `reverse`, `observableArray.sort` and `observableArray.reverse` do not change the array in-place, but return a sorted / reversed copy only. From MobX 5 and higher this shows a warning. It is recommended to use `array.slice().sort()` instead. - -## `observable.array(values, { deep: false })` - -Any values assigned to an observable array will be default passed through [`observable`](observable.md) to make them observable. -Create a shallow array to disable this behavior and store a values as-is. You -can also use `observable.shallow` for this; see also [modifiers](modifiers.md). - -## `observable.array(values, { name: "my array" })` - -The `name` option can be used to give the array a friendly debug name, to be used in for example `spy` or the MobX dev tools. - -## `isObservableArray` - -Usage: - -- `isObservableArray(value)` - -Returns `true` if `value` is an observable array. - -## `isArrayLike` - -[Without Proxy support] - -Usage: - -- `isArrayLike(thing)` - -Returns `true` if the given thing is either a true JS-array or an observable (MobX-)array. This is intended as convenience/shorthand. Note that observable arrays can be `.slice()`d to turn them into true JS-arrays. - -## Array limitations in environments without Proxy support - -If your environment does not support Proxies, then MobX cannot make its observable array be a real JS Array. - -[More information](../best/limitations-without-proxies.md). diff --git a/docs/refguide/boxed.md b/docs/refguide/boxed.md deleted file mode 100644 index c1daee8ac..000000000 --- a/docs/refguide/boxed.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Observable Boxes -sidebar_label: boxes [🚀] -hide_title: true ---- - - - -# Observable Boxes [🚀] - -Usage: - -- `observable.box(value, options?)` - -All primitive values in JavaScript are immutable and hence per definition not observable. -Usually that is fine, as MobX usually can just make the _property_ that contains the value observable. -See also [observable objects](object.md). -In rare cases it can be convenient to have an observable "primitive" that is not owned by an object. -For these cases it is possible to create an observable _box_ that manages such a primitive. - -## `observable.box(value)` - -So `observable.box(value)` accepts any value and stores it inside a box. -The current value can be accessed through `.get()` and updated using `.set(newValue)`. - -Furthermore you can register a callback using its `.observe` method to listen to changes on the stored value. -But since MobX tracks changes to boxes automatically, in most cases it is better to use a reaction like [`mobx.autorun`](autorun.md) instead. - -So the signature of object returned by `observable.box(scalar)` is: - -- `.get()` Returns the current value. -- `.set(value)` Replaces the currently stored value. Notifies all observers. -- `intercept(interceptor)`. Can be used to intercept changes before they are applied. See [observe & intercept](observe.md) -- `.observe(callback: (change) => void, fireImmediately = false): disposerFunction`. Registers an observer function that will fire each time the stored value is replaced. Returns a function to cancel the observer. See [observe & intercept](observe.md). The `change` parameter is an object containing both the `newValue` and `oldValue` of the observable. - -## `observable.box(value, { deep: false })` - -Creates a box based on the [`ref`](modifiers.md) decorator. This means that any (future) value of box wouldn't be converted into an observable automatically. - -## Example - -```javascript -import { observable } from "mobx" - -const cityName = observable.box("Vienna") - -console.log(cityName.get()) -// prints 'Vienna' - -cityName.observe(function (change) { - console.log(change.oldValue, "->", change.newValue) -}) - -cityName.set("Amsterdam") -// prints 'Vienna -> Amsterdam' -``` - -## `observable.box(value, { name: "my array" })` - -The `name` option can be used to give the box a friendly debug name, to be used in for example `spy` or the MobX dev tools. - -## `isBoxedObservable` - -Usage: - -- `isBoxedObservable(value)` - -Returns `true` if `value` is an observable box. diff --git a/docs/refguide/extend-observable.md b/docs/refguide/extend-observable.md deleted file mode 100644 index b3ce0e76c..000000000 --- a/docs/refguide/extend-observable.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -sidebar_label: extendObservable [🚀] -hide_title: true ---- - - - -# extendObservable [🚀] - -Usage: - -- `extendObservable(target, properties, annotions?, options?)` - -`extendObservable` can be used to add observable properties to an existing target object. All key / value pairs in the `properties` object result in new observable properties on the target initialized to the given value. Any getters in the properties map are turned into computed properties. - -The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](make-observable.md). The difference between `extendObservable` and `makeAutoObservable` is that `extendObservable` sets properties and declares information about them at the same time. - -Use the `deep: false` option to make the new properties _shallow_. That is, prevent auto conversion of their _values_ to observables. - -Here we add a new observable property to an alread observable instance: - -```javascript -class Person { - firstName - lastName - - constructor(firstName, lastName) { - this.firstName = firstName - this.lastName = lastName - makeAutoObservable(this) - } -} - -const matthew = new Person("Matthew", "Henry") - -// add a new observable property to an already observable object -extendObservable(matthew, { - age: 353 -}) -``` - -Here is an example of how you could make factory function that constructs -observable instances, though normally you would use a class with `makeObservable` or `makeAutoObservable` for this purpose: - -```javascript -class Person = function (firstName, lastName) { - // initialize observable properties on a new instance - extendObservable( - this, - { - firstName: firstName, - lastName: lastName, - get fullName() { - return this.firstName + " " + this.lastName - }, - setFirstName(firstName) { - this.firstName = firstName - } - }, - { - setFirstName: action - } - ) -} -``` - -Note: `observable.object(object)` is actually an alias for `extendObservable({}, object)`. - -Note: `extendObservable` can not be used to introduce new properties on observable arrays or objects diff --git a/docs/refguide/make-observable.md b/docs/refguide/make-observable.md deleted file mode 100644 index f0a57524d..000000000 --- a/docs/refguide/make-observable.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: Making things observable -sidebar_label: Making things observable -hide_title: true ---- - - - -# Making things observable - -Properties, entire objects, arrays, Maps and Sets can all be made observable. -The basics of making objects observable is by specifying an annotation per property by using `makeObservable`. -The most important annotations are: - -- `observable` define a trackable field that stores state. -- `action` mark a method as action that will modify state. -- `computed` mark a getters that will derive new facts from the state and cache its output. - -Collections such as arrays, Maps and Sets are made observable automatically. - -## makeObservable - -Usage: - -- `makeObservable(target, annotations?, options?)` - -MakeObservable can be used to trap _existing_ object properties and make them observable. Any JavaScript object (including class instances) can be passed into `target`. -Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. -The `annotations` argument then maps property names to [annotations](#available-annotations) to apply (see below for the list of available annotations). - -Methods that derive information and take arguments (for example `findUsersOlderThan(age: number): User[]`) don't need any annotation. -Their read operations will still be tracked when they are called from a reaction, but their output won't be memoized to avoid memory leaks (see also [mobx-utils:computedFn](https://github.com/mobxjs/mobx-utils#computedfn)). - -
    - -MakeObservable can only annotate properties declared by its own class definition. If a sub- or superclass introduces observable fields, it will have to call `makeObservable` for those properties itself. - -Decorators note: When using [decorators](../best/decorators), the `annotations` argument can be omitted. - -TypeScript note: When decorating private properties in TypeScript, you can pass the private property names as generic argument to `makeObservable` to suppress the compile error about the field not existing like this: `makeObservable<"myPrivateField" | "myOtherPrivateField>(this, { myPrivateField: observable })` - -
    - - - - -```javascript -import { makeObservable, observable, computed, action } from "mobx" - -class Doubler { - value - - constructor(value) { - makeObservable(this, { - value: observable, - double: computed, - increment: action - }) - this.value = value - } - - get double() { - return this.value * 2 - } - - increment() { - this.value++ - } -} -``` - - - -```javascript -import { makeAutoObservable } from "mobx" - -class Doubler { - value - - constructor(value) { - makeAutoObservable(this) - this.value = value - } - - get double() { - return this.value * 2 - } - - increment() { - this.value++ - } -} -``` - - - -```javascript -import { observable } from "mobx" - -function createDoubler(value) { - return observable({ - value, - get double() { - return this.value * 2 - }, - increment() { - this.value++ - } - }) -} -``` - - - -## `makeAutoObservable` - -Usage: - -- `makeAutoObservable(target, overrides?, options?)` - -`makeAutoObservable` is like `makeObservable` on steroids, as it infers all properties by default. You can still use `annotations` to override this behavior, in particular to use `false` to exclude a property or method from being automatically declared. -See the code tabs above for an example. -This can be more compact and easier to maintain than using `makeObservable`. -However, `makeAutoObservable` cannot be used on classes that have super- or are subclassed. - -Inference rules: - -- Any (inherited) member that contains a `function` value will be annotated with `autoAction`. -- Any `get`ter will be annotated with `computed`. -- Any other _own_ field will be marked with `observable`. -- Members marked with `false` in the `overrides` argument will not be annotated. Use this for for example read only fields such as identifiers. - -
    - -When you call `makeObservable` or `makeAutoObservable` all properties you want to be observable -_must_ exist on the instance already. Either by [declaring](https://github.com/tc39/proposal-class-fields) them (recommended, as done above) or otherwise by assigning them _before_ calling `makeAutoObservable` - -Providing annotations must be done unconditionally, as this makes it possible to cache the inference results. - -
    - -## `observable` - -Usage: - -- `observable(source, overrides?, options?)` - -The `observable` annotation can also be called as function to make an entire object observable at once. -The `source` object will be cloned and all members will be made observable, similar to how it would be done by `makeAutoObservable`. -Likewise, an `overrides` map can be provided to specify the annotations of specific members. -See the above code block for an example. - -The object returned by `observable` will be a Proxy, which means that properties that are added later to the object will be picked up and made observable as well (except when [proxy usage](../refguide/configure.md#proxy-support) is disabled). - -The `observable` method can also be called with collections types like [arrays](../refguide/API#observable-array), [Maps](../refguide/API#observable-map) and [Sets](../refguide/API#observable-set). Those will be cloned as well and converted into their observable counterpart. - -
    - -Primitive values cannot be made observable by MobX since they are immutable in JavaScript (but they can be [boxed](../refguide/API.md#observable-box)). -Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. -Making class members observable is considered the responsibility of the class constructor. - -
    - -## Available annotations - -| Annotation | Description | -| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `observable` | Defines a trackable field that stores state. Any value assigned to an `observable` field will be made recursively observable as well, if possible. That is, if and only if the value is a plain object, array, Map or Set. | -| `observable.ref` | Like `observable`, but only reassignments will be tracked. The assigned values themselves won't be made observable automatically. Use this if you intend to store for example immutable data in an observable field. | -| `observable.shallow` | Like `observable.ref` but for collections; any collection assigned will be made observable, but the contents of the collection itself won't become observable. | -| `observable.struct` | Like `observable`, except that any assigned value that is structurally equal to the current value will be ignored. | -| `action` | Mark a method as action that will modify state. See [action](../refguide/action.md) for details. | -| `action.bound` | Like action, but will also bind the action to the instance so that `this` will always be set. | -| `computed` | Can be used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value that can be cached. See [computed](../refguide/computed.md) for details. | -| `true` | Infer the best annotation. See [makeAutoObservable](#makeAutoObservable). | -| `false` | Explicitly do not annotate this property. | -| `autoAction` | Should not be used explicitly, but is used under the hood by `makeAutoObservable` to mark methods that can act as action or derivation, based on their calling context | - -## The `options` argument - -The above APIs take an optional `options` argument which is an object that supports the following options: - -- `autoBind: true`. Automatically binds all created actions to the instance. -- `deep: false`. Use `observable.ref` by default, rather than `observable` to create new observable members -- `name: `. Gives the object a debug name that is printed in error messages and reflection APIs. diff --git a/docs/refguide/map.md b/docs/refguide/map.md deleted file mode 100644 index 25a847a1a..000000000 --- a/docs/refguide/map.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Observable Maps -sidebar_label: maps -hide_title: true ---- - - - -# Observable Maps - -Usage: - -- `observable.map(initialMap?, options?)` -- `observable(map)` - -`observable.map(values?)` creates a dynamic keyed observable map. -Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -Optionally takes an object, entries array or string keyed [ES6 map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) with initial values. - -Using ES6 Map constructor you can initialize observable map using `observable(new Map())` or for class properties with `makeObservable` using `map = new Map()`. - -Since this uses the full-blown _ES6 Map_ internally, you are free to use any type for the key and _not limited_ to string keys. - -The following methods are exposed according to the [ES6 Map spec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map): - -- `has(key)` Returns whether this map has an entry with the provided key. Note that the presence of a key is an observable fact in itself. -- `set(key, value)`. Sets the given `key` to `value`. The provided key will be added to the map if it didn't exist yet. -- `delete(key)`. Deletes the given key and its value from the map. -- `get(key)`. Returns the value at the given key (or `undefined`). -- `keys()`. Returns an iterator over all keys present in this map. Insertion order is preserved. -- `values()`. Returns an iterator over all values present in this map. Insertion order is preserved. -- `entries()`. Returns an iterator (insertion ordered) over array that for each key/value pair in the map contains an array `[key, value]`. -- `forEach(callback:(value, key, map) => void, thisArg?)`. Invokes the given callback for each key / value pair in the map. -- `clear()`. Removes all entries from this map. -- `size`. Returns the amount of entries in this map. - -The following functions are not in the ES6 spec but are available in MobX: - -- `toJS()`. Converts the observable map back to an normal Map. -- `toJSON()`. Returns a shallow plain object representation of this map. (For a deep copy use `mobx.toJS(map)`). -- `merge(values)`. Copies all entries from the provided object into this map. `values` can be a plain object, array of entries or string-keyed ES6 Map. -- `replace(values)`. Replaces the entire contents of this map with the provided values. -- `observe(listener, fireImmediately?)`. Registers a listener that fires upon each change in this map, similarly to the events that are emitted for [Object.observe](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe). See [observe & intercept](observe.md) for more details. -- `intercept(interceptor)`. Registers an interceptor that will be triggered before any changes are applied to the map. See [observe & intercept](observe.md). - -## Options - -### `observable.map(values, { deep: false })` - -Any values assigned to an observable map will be default passed through [`observable`](observable.md) to make them observable. -Create a shallow map to disable this behavior and store are values as-is. You -can also use `observable.shallow` for this; see also [modifiers](modifiers.md). - -### `observable.map(values, { name: "my map" })` - -The `name` option can be used to give the map a friendly debug name, to be used in for example `spy` or the MobX dev tools. - -## `isObservableMap` - -Usage: - -- `isObservableMap(value)` - -Returns `true` if `value` is an observable map. diff --git a/docs/refguide/object.md b/docs/refguide/object.md index f760caede..766800536 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -16,7 +16,7 @@ If a plain JavaScript object is passed to `observable` all properties inside wil (A plain object is an object that wasn't created using a constructor function / but has `Object` as its prototype, or no prototype at all.) `observable` is by default applied recursively, so if one of the encountered values is an object or array, that value will be passed through `observable` as well. -The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](make-observable.md). See also [modifiers](modifiers.md). +The `annotations` param can be used to override the declaration that is used for a specific property, like [`makeObservable` and `makeAutoObservable`](observable.md). See also [modifiers](modifiers.md). ```javascript import { observable, autorun, action } from "mobx" @@ -55,7 +55,7 @@ person.setAge(21) Some things to keep in mind when making objects observable: -- Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties using [`makeObservable` or `makeAutoObservable`](make-observable.md). +- Only plain objects will be made observable. For non-plain objects it is considered the responsibility of the constructor to initialize the observable properties using [`makeObservable` or `makeAutoObservable`](observable.md). - Property getters will be automatically turned into derived properties, just like declaring it [`computed`](computed) would do. - `observable` is applied recursively to a whole object graph automatically. Both on instantiation and to any new values that will be assigned to observable properties in the future. Observable will not recurse into non-plain objects. - These defaults are fine in 95% of the cases, but for more fine-grained on how and which properties should be made observable, see the [modifiers](modifiers.md) section. diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index a9cd69a46..58a34d291 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -1,68 +1,188 @@ --- -title: observable -sidebar_label: observable +title: Creating observables +sidebar_label: Creating observables hide_title: true --- -# observable +# Creating observables + +Properties, entire objects, arrays, Maps and Sets can all be made observable. +The basics of making objects observable is by specifying an annotation per property by using `makeObservable`. +The most important annotations are: + +- `observable` define a trackable field that stores state. +- `action` mark a method as action that will modify state. +- `computed` mark a getters that will derive new facts from the state and cache its output. + +Collections such as arrays, Maps and Sets are made observable automatically. + +## makeObservable Usage: -- `observable(value)` -- `makeObservable(this, {someProperty: observable})` +- `makeObservable(target, annotations?, options?)` + +MakeObservable can be used to trap _existing_ object properties and make them observable. Any JavaScript object (including class instances) can be passed into `target`. +Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. +The `annotations` argument then maps property names to [annotations](#available-annotations) to apply (see below for the list of available annotations). + +Methods that derive information and take arguments (for example `findUsersOlderThan(age: number): User[]`) don't need any annotation. +Their read operations will still be tracked when they are called from a reaction, but their output won't be memoized to avoid memory leaks (see also [mobx-utils:computedFn](https://github.com/mobxjs/mobx-utils#computedfn)). + +
    + +MakeObservable can only annotate properties declared by its own class definition. If a sub- or superclass introduces observable fields, it will have to call `makeObservable` for those properties itself. + +Decorators note: When using [decorators](../best/decorators), the `annotations` argument can be omitted. + +TypeScript note: When decorating private properties in TypeScript, you can pass the private property names as generic argument to `makeObservable` to suppress the compile error about the field not existing like this: `makeObservable<"myPrivateField" | "myOtherPrivateField>(this, { myPrivateField: observable })` + +
    + + + + +```javascript +import { makeObservable, observable, computed, action } from "mobx" + +class Doubler { + value -`observable` is a programmatic API to declare objects as observable directly. -Often you do not invoke it directly but instead use it to declare properties -observable using [`makeObservable` / `makeAutoObservable`](make-observable.md). + constructor(value) { + makeObservable(this, { + value: observable, + double: computed, + increment: action + }) + this.value = value + } -## the rules of `observable` + get double() { + return this.value * 2 + } -Observable values can be JS primitives, references, plain objects, class instances, arrays and maps. -The following conversion rules are applied, but can be fine-tuned by using _modifiers_. See below. + increment() { + this.value++ + } +} +``` -1. If _value_ is an array, a new [Observable Array](array.md) will be returned. -1. If _value_ is an ES6 `Map`: a new [Observable Map](map.md) will be returned. Observable maps are very useful if you don't want to react just to the change of a specific entry, but also to the addition or removal of entries. -1. If _value_ is an ES6 `Set`: a new [Observable Set](set.md) will be returned. -1. If _value_ is an object _without_ prototype, all its current properties will be made observable. See [Observable Object](object.md) -1. If _value_ is an object _with_ a prototype, a JavaScript primitive or function, `observable` will throw. Use [Boxed Observable](boxed.md) observables instead if you want to create a stand-alone observable reference to such a value. MobX will not make objects with a prototype automatically observable; as that is considered the responsibility of its constructor function. Use `makeObservable` in the constructor instead. + -These rules might seem complicated at first sight, but you will notice that in practice they are very intuitive to work with. +```javascript +import { makeAutoObservable } from "mobx" -By default making a data structure observable is _infective_; that means that `observable` is applied automatically to any value that is contained by the data structure, or will be contained by the data structure in the future. This behavior can be changed by using [modifiers](modifiers.md). +class Doubler { + value -For examples of the declarative use of `observable` with `makeObservable`, see [Concepts & Principles](../intro/concepts.md) and [`makeObservable` / `makeAutoObservable`](make-observable.md). + constructor(value) { + makeAutoObservable(this) + this.value = value + } -## Using `observable` programmatically + get double() { + return this.value * 2 + } -[🚀] You can also use `observable` programmatically. `observable(value)` is a convenience API that succeeds only if the value can be made into an observable data structure (_Array_, _Map_, _Set_, or _observable-object_). For all other values, no conversion will be performed. + increment() { + this.value++ + } +} +``` -You can't use `observable` to make objects with a prototype observable; as that is the responsibility of its constructor function. Use `makeObservable` or `makeAutoObservable` in its constructor. + -## Inspecting whether something is observable +```javascript +import { observable } from "mobx" -### `isObservable` +function createDoubler(value) { + return observable({ + value, + get double() { + return this.value * 2 + }, + increment() { + this.value++ + } + }) +} +``` + + + +## `makeAutoObservable` Usage: -- `isObservable(value)` +- `makeAutoObservable(target, overrides?, options?)` + +`makeAutoObservable` is like `makeObservable` on steroids, as it infers all properties by default. You can still use `overrides` to override the default behavior with specific annotations. +In particular `false` can be used to exclude a property or method from being processed entirely. +See the code tabs above for an example. +The `makeAutoObservable` function can be more compact and easier to maintain than using `makeObservable`, since new members don't have to be mentioned explicitly. +However, `makeAutoObservable` cannot be used on classes that have super- or are subclassed. + +Inference rules: + +- Any (inherited) member that contains a `function` value will be annotated with `autoAction`. +- Any `get`ter will be annotated with `computed`. +- Any other _own_ field will be marked with `observable`. +- Members marked with `false` in the `overrides` argument will not be annotated. Use this for for example read only fields such as identifiers. + +
    + +When you call `makeObservable` or `makeAutoObservable` all properties you want to be observable +_must_ exist on the instance already. Either by [declaring](https://github.com/tc39/proposal-class-fields) them (recommended, as done above) or otherwise by assigning them _before_ calling `makeAutoObservable` -Returns `true` if `value` is observable. +Providing annotations must be done unconditionally, as this makes it possible to cache the inference results. -Works for all observables, computed values and disposer functions of reactions. +
    -### `isObservableProp` +## `observable` Usage: -- `isObservableProp(obj, propertyName)` +- `observable(source, overrides?, options?)` + +The `observable` annotation can also be called as function to make an entire object observable at once. +The `source` object will be cloned and all members will be made observable, similar to how it would be done by `makeAutoObservable`. +Likewise, an `overrides` map can be provided to specify the annotations of specific members. +See the above code block for an example. + +The object returned by `observable` will be a Proxy, which means that properties that are added later to the object will be picked up and made observable as well (except when [proxy usage](../refguide/configure.md#proxy-support) is disabled). + +The `observable` method can also be called with collections types like [arrays](../refguide/api.md#observablearray), [Maps](../refguide/api.md#observablemap) and [Sets](../refguide/api.md#observableset). Those will be cloned as well and converted into their observable counterpart. + +
    + +Primitive values cannot be made observable by MobX since they are immutable in JavaScript (but they can be [boxed](../refguide/api.md#observablebox)). +Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. +Making class members observable is considered the responsibility of the class constructor. + +
    + +## Available annotations -Returns `true` if property named `propertyName` of `obj` is -observable. +| Annotation | Description | +| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `observable`
    `observable.deep` | Defines a trackable field that stores state. Any value assigned to an `observable` field will be made recursively observable as well, if possible. That is, if and only if the value is a plain object, array, Map or Set. | +| `observable.ref` | Like `observable`, but only reassignments will be tracked. The assigned values themselves won't be made observable automatically. Use this if you intend to store for example immutable data in an observable field. | +| `observable.shallow` | Like `observable.ref` but for collections; any collection assigned will be made observable, but the contents of the collection itself won't become observable. | +| `observable.struct` | Like `observable`, except that any assigned value that is structurally equal to the current value will be ignored. | +| `action` | Mark a method as action that will modify state. See [action](../refguide/action.md) for details. | +| `action.bound` | Like action, but will also bind the action to the instance so that `this` will always be set. | +| `computed` | Can be used on a [getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) to declare it as a derived value that can be cached. See [computed](../refguide/computed.md) for details. | +| `computed.struct` | Like `computed`, except that if after recomputing the result is structurally equal to the previous result, no observers will be notified | +| `true` | Infer the best annotation. See [makeAutoObservable](#makeautoobservable). | +| `false` | Explicitly do not annotate this property. | +| `autoAction` | Should not be used explicitly, but is used under the hood by `makeAutoObservable` to mark methods that can act as action or derivation, based on their calling context | -Works for all observables, computed values and disposer functions of reactions. +## The `options` argument -### Type-specific APIs +The above APIs take an optional `options` argument which is an object that supports the following options: -MobX also exposes `isObservable*`, like `isObservableArray` and so on to check for specific observables. +- `autoBind: true`. Automatically binds all created actions to the instance. +- `deep: false`. Use `observable.ref` by default, rather than `observable` to create new observable members +- `name: `. Gives the object a debug name that is printed in error messages and reflection APIs. diff --git a/notes.md b/notes.md index d9034a7d0..073d37b92 100644 --- a/notes.md +++ b/notes.md @@ -65,9 +65,13 @@ - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] add deprecation messages to latest mobx 5 - [ ] merge 2398 - - [ ] fix docs +- [ ] docs + - [ ] clean up docs - [ ] fix interactive tut - [ ] document and introduce flow annotation + - [ ] fix link warnings + - [ ] revisit how-to-read guide with all things in place + - [ ] finish migration guide - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use @@ -99,18 +103,18 @@ Why declare fields - detect misspellings in makeObservable early * [ ] Host old docs somewhere? Figure out how docusaurus can support a second version -* [ ] Using the codemod -* [ ] update tsconfig, no decorators, yes define +* [x] Using the codemod +* [x] update tsconfig, no decorators, yes define * [ ] update docs for non-default decorators -* [ ] instruct using TS / Babel decorators +* [x] instruct using TS / Babel decorators * [ ] optimization tip: hoist the mapping constant of makeObservable -* [ ] document: unconditional map / makeObservable calls -* [ ] document `true` and `false` as annotations -* [ ] makeObservable + private members in TypeScript (second call? computed name? tsignore?) +* [x] document: unconditional map / makeObservable calls +* [x] document `true` and `false` as annotations +* [x] makeObservable + private members in TypeScript (second call? computed name? tsignore?) -* [ ] document: `autoBind` options for observable / extendObservable / makeObserver -* [ ] document: linting options +* [x] document: `autoBind` options for observable / extendObservable / makeObserver +* [x] document: linting options ## NOTES diff --git a/website/i18n/en.json b/website/i18n/en.json index 8043a32ba..f39dcbce0 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -87,18 +87,10 @@ "title": "MobX API Reference", "sidebar_label": "API overview" }, - "refguide/array": { - "title": "Observable Arrays", - "sidebar_label": "arrays" - }, "refguide/autorun": { "title": "autorun", "sidebar_label": "autorun" }, - "refguide/boxed": { - "title": "Observable Boxes", - "sidebar_label": "boxes [🚀]" - }, "refguide/computed-behavior": { "title": "How computed works", "sidebar_label": "How computed works [🚀]" @@ -115,10 +107,6 @@ "title": "Configuring MobX", "sidebar_label": "Configuring MobX" }, - "refguide/extend-observable": { - "title": "refguide/extend-observable", - "sidebar_label": "extendObservable [🚀]" - }, "refguide/extending": { "title": "refguide/extending", "sidebar_label": "New observable types [🚀]" @@ -135,14 +123,6 @@ "title": "Introspection APIs", "sidebar_label": "Introspection APIs" }, - "refguide/make-observable": { - "title": "Making things observable", - "sidebar_label": "Making things observable" - }, - "refguide/map": { - "title": "Observable Maps", - "sidebar_label": "maps" - }, "refguide/mobx-utils": { "title": "mobx-utils", "sidebar_label": "mobx-utils [🚀]" @@ -160,8 +140,8 @@ "sidebar_label": "objects" }, "refguide/observable": { - "title": "observable", - "sidebar_label": "observable" + "title": "Creating observables", + "sidebar_label": "Creating observables" }, "refguide/observe": { "title": "refguide/observe", @@ -193,7 +173,7 @@ } }, "links": { - "API": "API", + "API Reference": "API Reference", "中文": "中文", "Sponsors": "Sponsors", "Github": "Github" diff --git a/website/sidebars.json b/website/sidebars.json index 4ef0a79a5..e9a06ff20 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -7,16 +7,7 @@ "intro/concepts" ], "Basics": [ - "refguide/make-observable", - "refguide/observable", - "refguide/array", - "refguide/map", - "refguide/set", - "refguide/object", - "refguide/boxed", - "refguide/modifiers", - "refguide/extend-observable", - "refguide/is-observable" + "refguide/observable" ], "MobX and React": [ "react/react-integration", diff --git a/website/siteConfig.js b/website/siteConfig.js index e3ad45a18..cf22af3b3 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -51,7 +51,7 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ - { doc: "refguide/api", label: "API"}, + { doc: "refguide/api", label: "API Reference"}, { href: "http://cn.mobx.js.org", label: "中文"}, { doc: "backers-sponsors", label: "Sponsors"}, { href: "https://github.com/mobxjs/mobx", label: "Github" } From 6bf1ccbe27466a12d2da5a6330a5c5b7a3ed3f38 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sun, 26 Jul 2020 21:22:45 +0100 Subject: [PATCH 0481/1043] Made a one-pager for actions --- docs/best/actions.md | 325 -------------------------------- docs/refguide/action.md | 365 ++++++++++++++++++++++++++++++------ docs/refguide/api.md | 31 ++- docs/refguide/computed.md | 2 + docs/refguide/flow.md | 80 -------- docs/refguide/observable.md | 8 + notes.md | 2 + website/i18n/en.json | 4 +- website/sidebars.json | 8 +- 9 files changed, 343 insertions(+), 482 deletions(-) delete mode 100644 docs/best/actions.md delete mode 100644 docs/refguide/flow.md diff --git a/docs/best/actions.md b/docs/best/actions.md deleted file mode 100644 index 157fff8ba..000000000 --- a/docs/best/actions.md +++ /dev/null @@ -1,325 +0,0 @@ ---- -sidebar_label: Asynchronous actions -title: Asynchronous actions -hide_title: true ---- - - - -# Asynchronous actions - -If you wrap a function in `action` or mark it as such with `makeObservable`, -this only affects the currently running function, not functions that are scheduled (but not invoked) by the current function! - -This means that if you have a `setTimeout`, promise`.then` or `async` construction, and in that callback some more state is changed, those callbacks should be wrapped in `action` as well! There are several ways to create asynchronous actions. No approach is strictly better than the other, but this section just list different approaches you can take to writing asynchronous code. - -## Promises - -This code **won't work**: - -```javascript -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - projects => { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - }, - error => { - this.state = "error" - } - ) - } -} -``` - -The above example would throw exceptions, as the arrow functions that are passed to the `fetchGithubProjectsSomehow` promise are not part of the `fetchProjects` action. - -We discuss various alternative approaches below to make it work again: separating -out action methods, wrapping callbacks with `action` and `runInAction`. - -### Separate methods - -A first simple fix is to extract the behavior inside the callback functions as action methods and call them: - -```javascript -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - projects => { - this.fetchProjectsSuccess(projects) - }, - error => { - this.fetchProjectsError(error) - } - ) - } - - fetchProjectsSuccess(projects) { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - } - - fetchProjectsError(error) { - this.state = "error" - } -} -``` - -Note that you still have to use arrow functions as callbacks to ensure the right binding, i.e. you cannot just write: - -`then(this.fetchProjectsSuccess, this.fetchProjectsError)` - -To be able to write the code like this, you first need to bind the actions, either by using [bound arrow functions](../refguide/action.md#bound-arrow-functions) or by explicitly marking the actions with [`action.bound`](../refguide/action.md#actionbound). - -### Wrap callbacks with `action` - -Although the approach above is clean and explicit, it might get a bit verbose with complex async flows. As an alternative you can wrap the promise callbacks with the [`action` function](../refguide/action.md). It is recommended, but not mandatory, to give them a name as well: - -```javascript -import { action } from "mobx" - -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - // inline created action - action("fetchSuccess", projects => { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - }), - // inline created action - action("fetchError", error => { - this.state = "error" - }) - ) - } -} -``` - -### The `runInAction` utility - -Instead of creating an action for the entire callback, you can also run only the state modifying part of the callback in an action with `runInAction`. This is especially useful with TypeScript, as you can avoid having to manually type your callbacks. - -`runInAction` requires you to structure your code so that state modifications happen at the end of the process as much as possible: - -```javascript -import { runInAction } from "mobx" - -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - fetchProjects() { - this.githubProjects = [] - this.state = "pending" - fetchGithubProjectsSomehow().then( - projects => { - const filteredProjects = somePreprocessing(projects) - // put the 'final' modification in an anonymous action - runInAction(() => { - this.githubProjects = filteredProjects - this.state = "done" - }) - }, - error => { - // the alternative ending of this process:... - runInAction(() => { - this.state = "error" - }) - } - ) - } -} -``` - -See also [`runInAction`](../refguide/action.md#runinaction). - -## async / await - -Async / await based functions can initially seem confusing when you use them with -actions. Because they appear to be synchronous functions, you get the impression that `action` applies to the entire function. Unfortunately this is not the case, as `async` / `await` is just syntactic sugar around a promise based process. - -As a result, `action` only applies to the code block until the first `await`. -And after each `await` a new asynchronous function is started, so after each `await`, state modifying code should be wrapped as action. - -So this code **won't work**: - -```javascript -import { runInAction } from "mobx" - -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - async fetchProjects() { - this.githubProjects = [] - this.state = "pending" - try { - const projects = await fetchGithubProjectsSomehow() - const filteredProjects = somePreprocessing(projects) - this.state = "done" - this.githubProjects = filteredProjects - } catch (error) { - this.state = "error" - } - } -} -``` - -This code throws exceptions. We discuss various alternative approaches below to make it work again: separating out action methods, and `runInAction`. As an alternative -to `async` / `await` you can also use MobX's built-in replacement, `flow`. - -### Separate methods - -You can work around this in the same way as with promises -- call -another separate method that is an action after "await": - -```javascript -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - async fetchProjects() { - this.githubProjects = [] - this.state = "pending" - try { - const projects = await fetchGithubProjectsSomehow() - this.fetchProjectsSuccess(projects) - } catch (error) { - this.fetchProjectsError(error) - } - } - - fetchProjectsSuccess(projects) { - const filteredProjects = somePreprocessing(projects) - this.githubProjects = filteredProjects - this.state = "done" - } - - fetchProjectsError(error) { - this.state = "error" - } -} -``` - -### runInAction again - -More more complicated async flow, you could instead use the `runInAction` -utility: - -```javascript -import { runInAction } from "mobx" - -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - - constructor() { - makeAutoObservable(this) - } - - async fetchProjects() { - this.githubProjects = [] - this.state = "pending" - try { - const projects = await fetchGithubProjectsSomehow() - const filteredProjects = somePreprocessing(projects) - // after await, modifying state again, needs an actions: - runInAction(() => { - this.state = "done" - this.githubProjects = filteredProjects - }) - } catch (error) { - runInAction(() => { - this.state = "error" - }) - } - } -} -``` - -## flow instead of async/await - -An alternative approach is to use the built-in concept of [`flow`](../refguide/flow.md). `flow` works in the same way as `async` / `await` but is based around generators instead. The rules are: - -- Wrap `flow` around your asynchronous function. - -- Instead of `async` you use `function *` - -- Instead of `await` you use `yield`. - -The advantage of `flow` is that it is syntactically very close to `async` / `await` (with different keywords), and no manually action wrapping is required for async parts. - -`flow` also integrates neatly with MobX development tools, so that it is easy to trace the process of the async function. - -Here is our example rewritten to use `flow`: - -```javascript -import { flow } from "mobx" - -class Store { - githubProjects = [] - state = "pending" - - constructor() { - makeAutoObservable(this) - } - - // note the star, this a generator function! - fetchProjects = flow(function* fetchProjects() { - this.githubProjects = [] - this.state = "pending" - try { - const projects = yield fetchGithubProjectsSomehow() // yield instead of await - const filteredProjects = somePreprocessing(projects) - // the asynchronous blocks will automatically be wrapped in actions and can modify state - this.state = "done" - this.githubProjects = filteredProjects - } catch (error) { - this.state = "error" - } - }) -} -``` diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 8d8706ee6..500d9d4a7 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -1,127 +1,374 @@ --- -title: action -sidebar_label: action +title: Update state using actions +sidebar_label: Update state using actions hide_title: true --- -# action +# Update state using actions + +## Action Usage: +- `action` (annotation) - `action(fn)` - `action(name, fn)` -- `action.bound(fn)` -- `makeObservable(this, {someProperty: action})` -- `makeObservable(this, {someProperty: action(name)})` -- `makeObservable(this, {someProperty: action.bound})` -Any application has actions. Actions is code that that modifies the state. -MobX requires that you declare your actions, though [makeAutoObservable](observable.md) can automate much of this job. Actions help you to structure your code better and offer performance benefits. +Any application has actions. An action is any code block that modifies state. +In principle actions always happen in response to an event. For example a button was clicked, some input did change, a websocket message arrived, etc. +MobX requires that you declare your actions, though [makeAutoObservable](observable.md) can automate much of this job. Actions help you to structure your code better and offer performance benefits: -Actions are wrapped with with [`transaction`](api.md#transaction), [`untracked`](api.md#untracked), and [`allowStateChanges`](api.md#untracked). +The `action` annotation should only be used on functions that intend to _modify_ state. +Functions that just perform look-ups, filter data, in short any function that derives information, should _not_ be marked as actions; to allow MobX to track their invocations. -Especially the fact that [`transaction`](api.md#transaction) is applied automatically yields great performance benefits; -actions will batch mutations and only notify computed values and reactions after the (outer most) action has finished. -This ensures that intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. +1. Actions are run inside [transactions](api.md#transaction). No observers will be updated until the outer-most action has finished. This ensures that intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. +2. Outside actions it is (by default) not allowed to modify state. This helps to clearly identify in your code base where the state updates happen. -`action` also provides useful debugging information in combination with the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). + + -By passing in `name` you can control the name of the action, otherwise it -is derived from the function or method that is wrapped. +```javascript +import { makeObservable, observable, action } from "mobx" -[setters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) of [computed properties are automatically actions](computed.md). +class Doubler { + value = 0 -## When are functions and methods not actions? + constructor(value) { + makeObservable(this, { + value: observable, + increment: action + }) + } -Actions should only, and always, be used on functions that _modify_ state. -Functions that just perform look-ups, filters etc should _not_ be marked as actions; to allow MobX to track their invocations. + increment() { + // intermediate states won't become visible to observers + this.value++ + this.value++ + } +} +``` -If you use `makeAutoObservable` you have to [exclude these methods explicitly from being marked as actions](observable.md#excluding-methods-that-are-not-actions). + -## `runInAction` +```javascript +import { makeAutoObservable } from "mobx" -Usage: +class Doubler { + value = 0 -- `runInAction(name? fn)` + constructor(value) { + makeAutoObservable(this) + } -It can be useful to have just a small snippet of code run as an action, -without having to declare a method. This can be especially useful in [async code](../best/actions.md). + increment() { + this.value++ + this.value++ + } +} +``` + + -`runInAction(name?, fn)` is a convenience to write `action(name, fn)()`. +```javascript +import { makeObservable, observable, computed, action } from "mobx" -For example, to change the observable property `message.name` outside of an explicit action, write: +class Doubler { + value = 0 + + constructor(value) { + makeObservable(this, { + value: observable, + increment: action.bound + }) + } + + increment() { + this.value++ + this.value++ + } +} + +const doubler = new Doubler() +setInterval(doubler.increment, 1000) // calling increment this way is safe as it is bound already +``` + + ```javascript +import { observable, action } from "mobx" + +const state = observable({ value: 0 }) + +const increment = action(state => { + state.value++ + state.value++ +}) + +increment(state) +``` + + + +```javascript +import { observable } from "mobx" + +const state = observable({ value: 0 }) + runInAction(() => { - message.name = "Sara" + state.value++ + state.value++ }) ``` -## Actions and async code + + +### `action` can wrap functions + +To leverage the transactional nature of MobX as much as possible, actions should be passed as far outward as possible. It is good to mark a class method as action if it modifies state. It is even better to mark event handlers as action; as it is the outer-most transaction that counts. A single unmarked event handler that calls two actions subsequently would still generate two transactions. + +To help creating action based event handlers, `action` is not only an annotation, but also a higher order function; it can be called with a function as argument and in that case it will return an `action` wrapped function with the same signature. + +For example in React an `onClick` handler can be wrapped like: + +```javascript +const ResetButton = ({ formState }) => ( + +) +``` + +For debugging purposes we recommend either name the wrapped function, or pass a name as first argument to `action`. -There are some special rules you have to take into account when you have actions that -are asynchronous. See [asynchronous actions](../best/actions.md). +
    -## action.bound +Another feature of actions is that they are [untracked](api.md#untracked); when an action is called from inside a side effect or computed value (a thing that should really rarily be needed!), observables read by the action won't be counted towards the dependencies of the derivation -[🚀] The `action` function follows the normal rules for binding in JavaScript. -However, `action.bound` can be used to automatically bind actions to the targeted object. This ensures that `this` points to the right object when you use -the action as a callback later. +`makeAutoObservable`, `extendObservable` and `observable` use a special flavour of `action`, `autoAction` +that will determine at runtime if the function is a derivation or action. -Note that unlike `action`, `action.bound` does not take a name parameter, so the name will always be based on the property name to which the action is bound. +
    + +### `action.bound` + +Usage: -Example: +- `action.bound` (annotation) + +The `action.bound` annotation can be used to automatically bind a method to the correct instance, so that `this` is always correctly bound inside the function. + +Tip: If you want to bind actions in combination with `makeAutoObservable`, it is usually simpler to use arrow functions instead: ```javascript -class Ticker { - tick = 0 +import { makeAutoObservable } from "mobx" - constructor() { - makeObservable(this, { tick: observable, increment: action.bound }) +class Doubler { + value = 0 + + constructor(value) { + makeAutoObservable(this) } - increment() { - this.tick++ // 'this' will always be correct + increment = () => { + this.value++ + this.value++ } } +``` + +### `runInAction` + +Usage: + +- `runInAction(fn)` + +Use this utility to create a temporarily action that is immediately invoked. Can be useful in asynchronous processes. +See the above code block for an example. + +## Asynchronous actions + +In essence asynchronous processes don't need any special treatment in MobX, as all reactions will update automatically regardless the moment in time they are caused. +And since observable objects are mutable, it is generally safe to keep references to them during the duration of an action. +However, every step (tick) that updates observables in an asynchronous process should be marked as `action`. +This can be achieved in multiple ways by leveraging the above APIs, as shown below. + +For example, when handling promises, the handlers that update state should be wrapped using `action` or be actions, as shown below. + + + + +Promise resolution handlers are handled in-line, but run after the original action finished, so need to be wrapped by `action`: + +```javascript +import { action, makeAutoObservable } from "mobx" -const ticker = new Ticker() -setInterval(ticker.increment, 1000) +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } + + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + action("fetchSuccess", projects => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + }), + action("fetchError", error => { + this.state = "error" + }) + ) + } +} ``` -## bound arrow functions + -[🚀] You cannot use _action.bound_ with arrow functions; arrow functions are already bound and cannot be rebound. Since arrow functions are already bound, using them is an alternative to `action.bound` in classes. They have the additional benefit that you can use them with `makeAutoObservable` without the need for explicit declaration: +If the promise handlers are class fields, they will automatically be wrapped in `action` by `makeAutoObservable`: ```javascript -class Ticker { - tick = 0 +import { makeAutoObservable } from "mobx" + +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" constructor() { makeAutoObservable(this) } - // note declaration as an arrow function - increment = () => { - this.tick++ // 'this' will always be correct + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + fetchGithubProjectsSomehow().then( + this.projectsFetchSuccess, + this.projectsFetchFailure + ) + ) + + projectsFetchSuccess = (projects) => { + const filteredProjects = somePreprocessing(projects) + this.githubProjects = filteredProjects + this.state = "done" + } + + projectsFetchFailure = (error) => { + this.state = "error" } } +``` + + -const ticker = new Ticker() -setInterval(ticker.increment, 1000) +Any steps after `await` aren't in the same tick, so need action wrapping. +We can leverage `runInAction` here: + +```javascript +import { runInAction, makeAutoObservable } from "mobx" + +class Store { + githubProjects = [] + state = "pending" // "pending" / "done" / "error" + + constructor() { + makeAutoObservable(this) + } + + fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = await fetchGithubProjectsSomehow() + const filteredProjects = somePreprocessing(projects) + runInAction(() => { + this.githubProjects = filteredProjects + this.state = "done" + }) + } catch (e) { + runInAction(() => { + this.state = "error" + } + } + ) +} +``` + + + +Flow is explained below. + +```javascript +import { flow, makeAutoObservable } from "mobx" + +class Store { + githubProjects = [] + state = "pending" + + constructor() { + makeAutoObservable(this) + } + + // note the star, this a generator function! + fetchProjects = flow(function* fetchProjects() { + this.githubProjects = [] + this.state = "pending" + try { + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + }) +} ``` -## `isAction` + + +## Using flow instead of async/await Usage: -- `isAction(func)` +- `flow(function* (args) { })` + +The `flow` wrapper is an alternative to `async` / `await` that makes it more easy to +work with MobX actions. +`flow()` takes a [generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) as its only input. +Inside the generator you can chain promises by yielding them (so instead of `await somePromise` you write `yield somePromise`). +The flow mechanism than will make sure the generator continues or throws when the promise resolves. +However, the code that is executed when continuing will automatically be wrapped in action. +So `flow` is an alternative to `async / await` that doesn't need any further action wrapping. +It can be applied as follows: + +1. Wrap `flow` around your asynchronous function. +2. Instead of `async` you use `function *`. +3. Instead of `await` you use `yield`. + +The listing above shows what this looks in practice. + +### Flow cancellation -Returns `true` if the given function is marked as an `action`. +Another neat benefit of flows is that they are cancellable. +The return value of `flow` is a promise that resolves with the value that is returned from the generator function in the end. +The returned promise has an additional `cancel()` methods that will interrupt the running generator and cancel it. +Any `try / finally` clauses will still be run. ## Disabling mandatory actions -[🚀] By default, MobX 6 and later require that you use actions to make state changes. +By default, MobX 6 and later require that you use actions to make state changes. You can however configure MobX to disable this behavior, see [`enforceActions`](configure.md#enforceactions). +This can be quite useful in for example unit test setup, where the warnings don't always have much value. diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 52fd44190..7297c6bec 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -63,7 +63,7 @@ It is possible to use `extendObservable` to add observable fields to an existing Usage: -- `observable`: Mark a property as observable. +- `observable` (annotation): Mark a property as observable. - `observable(source, overrides?, options?)`: Clones an object and makes it observable. Source can be a plain object, [array](#observable-array), [Map](#observable-map) or [Set](#observable-set). [«`details`»](observable.md#observable) @@ -129,7 +129,7 @@ The `{ deep: false }` option can be used to make this set shallowly observable, Usage: -- `observable.ref` +- `observable.ref` (annotation) Like the `observable` annotation, but only reassignments will be tracked. The assigned values themselves won't be made observable automatically. Use this if you intend to store for example immutable data in an observable field. @@ -139,7 +139,7 @@ Like the `observable` annotation, but only reassignments will be tracked. The as Usage: -- `observable.shallow` +- `observable.shallow` (annotation) Like the `observable` annotation, except that any assigned value that is structurally equal to the current value will be ignored. @@ -149,7 +149,7 @@ Like the `observable` annotation, except that any assigned value that is structu Usage: -- `observable.struct` +- `observable.struct` (annotation) Like `observable.ref` but for collections; any collection assigned will be made observable, but the contents of the collection itself won't become observable. @@ -159,7 +159,7 @@ Like `observable.ref` but for collections; any collection assigned will be made Usage: -- `observable.deep` +- `observable.deep` (annotation) Alias for the [`observable`](#observable) annotation. @@ -202,21 +202,30 @@ _Actions are anything that modify the state._ ### `action` +Usage: + +- `action` (annotation) +- `action(fn)` + Marking things as action. [«details»](action.md) ### `runInAction` -One-time actions. +Usage: + +- `runInAction(fn)` + +Create a one-time action that is immediately invoked. [«details»](action.md#runinaction) ### `flow` -MobX friendly replacement for `async` / `await`. +MobX friendly replacement for `async` / `await` that supports cancellation. -[«details»](flow.md) +[«details»](action.md#using-flow-instead-of-asyncawait) ## Computed @@ -405,9 +414,11 @@ Is value an observable box? ### `isAction` -Is this an action? +Usage: + +- `isAction(func)` -[«details»](action.md#isaction) +Returns `true` if the given function is marked as an `action`. ### `isComputed` diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 3d5559ca7..02a3ac1d7 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -112,6 +112,8 @@ class Foo { _Note: always define the setter *after* the getter, some TypeScript versions are known to declare two properties with the same name otherwise._ +Setters are automatically marked as actions. + ## Computed with arguments [🚀] Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: diff --git a/docs/refguide/flow.md b/docs/refguide/flow.md deleted file mode 100644 index dc851ade3..000000000 --- a/docs/refguide/flow.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: flow -sidebar_label: flow -hide_title: true ---- - - - -# flow - -Usage: - -- `flow(function* (args) { })` - -`flow` is an alternative to `async` / `await` that makes it more easy to -work with MobX actions. - -`flow()` takes a [generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) as its only input. You must only _yield_ to promises inside. `flow` gives you back a promise that you can `cancel()` if you want. - -When dealing with _async actions_, the code that executes in the callback is not wrapped by `action`. An easy way to retain the action semantics is by wrapping the async function with flow. This will ensure to wrap all your callbacks in `action()`. See also [asynchronous actions](../best/actions#flow). - -Example: - -```js -import { flow, makeAutoObservable } from "mobx" - -class Store { - githubProjects = [] - state = "pending" // "pending" / "done" / "error" - constructor() { - makeAutoObservable(this) - } - - fetchProjects = flow(function* fetchProjects() { - // <- note the star, this a generator function! - this.githubProjects = [] - this.state = "pending" - try { - const projects = yield fetchGithubProjectsSomehow() // yield instead of await - const filteredProjects = somePreprocessing(projects) - - // the asynchronous blocks will automatically be wrapped actions - this.state = "done" - this.githubProjects = filteredProjects - } catch (error) { - this.state = "error" - } - }) -} -``` - -_Tip: it is recommended to give the generator function a name, this is the name that will show up in dev tools and such_ - -**Flows can be cancelled** - -Flows are canceallable, that means that you can call `cancel()` on the returned promise. This will stop the generator immediately, but any `finally` clause will still be processed. The returned promise itself will reject with `FLOW_CANCELLED` - -If you want to write code that catches `FlowCancellationError` you can import it from the `mobx` package. Also exported is a `isFlowCancellationError(error)` helper that returns `true` if and only if the provided argument is a `FlowCancellationError`. - -**Flows support async iterators** - -Flows support async iterators, that means you can use async generators: - -```javascript -async function* someNumbers() { - yield Promise.resolve(1) - yield Promise.resolve(2) - yield Promise.resolve(3) -} - -const count = mobx.flow(async function* () { - // use for await to loop async iterators - for await (const number of someNumbers()) { - total += number - } - return total -}) - -const res = await count() // 6 -``` diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 58a34d291..bc1776581 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -186,3 +186,11 @@ The above APIs take an optional `options` argument which is an object that suppo - `autoBind: true`. Automatically binds all created actions to the instance. - `deep: false`. Use `observable.ref` by default, rather than `observable` to create new observable members - `name: `. Gives the object a debug name that is printed in error messages and reflection APIs. + +## A short note on classes + +So far most examples above have been leaning towards class syntax. +MobX is unopinionated about this, and there are probably just as many MobX users that use plain objects. +A slight benefit of classes is that they have easily discoverable APIs icmw. TypeScript and are presented clearly in debug tools. +But heavy inheritance patterns can become foot-guns easily. +So if you use classes, keep them simple. diff --git a/notes.md b/notes.md index 073d37b92..b1a10a912 100644 --- a/notes.md +++ b/notes.md @@ -72,6 +72,8 @@ - [ ] fix link warnings - [ ] revisit how-to-read guide with all things in place - [ ] finish migration guide + - [ ] make details section collapsible + - [ ] better sel page - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use diff --git a/website/i18n/en.json b/website/i18n/en.json index f39dcbce0..14f4c0d74 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -80,8 +80,8 @@ "sidebar_label": "Introduction" }, "refguide/action": { - "title": "action", - "sidebar_label": "action" + "title": "Update state using actions", + "sidebar_label": "Update state using actions" }, "refguide/api": { "title": "MobX API Reference", diff --git a/website/sidebars.json b/website/sidebars.json index e9a06ff20..202b28a45 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -7,7 +7,8 @@ "intro/concepts" ], "Basics": [ - "refguide/observable" + "refguide/observable", + "refguide/action" ], "MobX and React": [ "react/react-integration", @@ -15,11 +16,6 @@ "react/react-performance", "react/react-class-components" ], - "Updating observables with actions": [ - "refguide/action", - "best/actions", - "refguide/flow" - ], "Computed values": [ "refguide/computed", "refguide/computed-options", From 0fffd35d94dad26c6c9fc1fb5520d6c3a50b6538 Mon Sep 17 00:00:00 2001 From: Martijn Faassen Date: Mon, 27 Jul 2020 17:02:43 +0200 Subject: [PATCH 0482/1043] A note. --- docs/intro/concepts.md | 2 +- website/static/getting-started.html | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 6fcc8852e..c305d504a 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -150,7 +150,7 @@ However, if you would remove the `Tasks left` line (or put it into a separate co You can try this out yourself on [CodeSandbox](https://codesandbox.io/s/concepts-principles-il8lt?file=/src/index.js:1161-1252). -You can verify this yourself by changing the [JSFiddle](https://jsfiddle.net/mweststrate/wv3yopo0/). +For a more extensive introduction into this example, see the [10 minute introduction to MobX and React](https://mobx.js.org/getting-started). ##### Learn more diff --git a/website/static/getting-started.html b/website/static/getting-started.html index f2336e78a..91a5dd606 100755 --- a/website/static/getting-started.html +++ b/website/static/getting-started.html @@ -509,7 +509,6 @@

    Console log

    -
    @@ -519,16 +518,13 @@

    Console log - - + + + - - - + + - - -# Always dispose reactions - -All forms of `autorun`, `reaction`, `when`, `observe` and `intercept` are only garbage collected if all objects they observe are garbage collected themselves. - -So we recommend you use the disposer function that is returned from these functions to stop them when you no longer need them. If you don't do this it can lead to performance -degradation due to unnecessary recomputation. You may also end up with duplicate registrations of the same reaction, which again can lead to performance degradation as well as unintended behavior. - -Reactions like `autorun`, `reaction` and `when` might observe many different observables, and as long as one of them is still in scope, the reaction remains in scope. This means that all other observables it uses are also kept alive to support future recomputions. - -For `observe` and `intercept` it is not strictly necessary to dispose them if they target `this`. `when` disposes itself, unless you cancel it manually. - -To avoid these issues, make sure to dispose of reactions when they are no longer -needed. - -Example: - -```javascript -class Vat { - value = 1.2 - - constructor() { - makeAutoObservable(this) - } -} - -const vat = new Vat() - -class OrderLine { - price = 10 - amount = 1 - constructor() { - makeAutoObservable(this) - - // this autorun will be GC-ed together with the current orderline instance - // as it only uses observables from `this`. It's not strictly necessary - // to dispose of it once an OrderLine instance is deleted. - this.disposer1 = autorun(() => { - doSomethingWith(this.price * this.amount) - }) - // this autorun won't be GC-ed together with the current orderline instance - // since vat keeps a reference to notify this autorun, which in turn keeps - // 'this' in scope - this.disposer2 = autorun(() => { - doSomethingWith(this.price * this.amount * vat.value) - }) - } - - dispose() { - // So, to avoid subtle memory issues, always call the - // disposers when the reaction is no longer needed - this.disposer1() - this.disposer2() - } -} -``` diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index a249aa4bf..db3d2e16b 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -118,6 +118,9 @@ Reactions are similar to computed values, but instead of producing information, In short, reactions bridge the worlds of [reactive](https://en.wikipedia.org/wiki/Reactive_programming) and [imperative](https://en.wikipedia.org/wiki/Imperative_programming) programming. By far the most used form of reactions are UI components. +Note that it is possible to trigger side effects from both actions and reactions. +Side effects that have a clear, explicit origin from which they can be triggered, such +as making a network request when submitting a form, should be triggered explicitly from the relevant event handler. #### 3.3. Reactive React components diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 500d9d4a7..cd60916ee 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -345,13 +345,12 @@ Usage: - `flow(function* (args) { })` -The `flow` wrapper is an alternative to `async` / `await` that makes it more easy to +The `flow` wrapper is an optional alternative to `async` / `await` that makes it easier to work with MobX actions. `flow()` takes a [generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) as its only input. Inside the generator you can chain promises by yielding them (so instead of `await somePromise` you write `yield somePromise`). -The flow mechanism than will make sure the generator continues or throws when the promise resolves. -However, the code that is executed when continuing will automatically be wrapped in action. -So `flow` is an alternative to `async / await` that doesn't need any further action wrapping. +The flow mechanism then will make sure the generator continues or throws when a yielded promise resolves. +So `flow` is an alternative to `async / await` that doesn't need any further `action` wrapping. It can be applied as follows: 1. Wrap `flow` around your asynchronous function. diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index feff14761..1d323e145 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -1,24 +1,49 @@ --- -title: autorun -sidebar_label: autorun +title: Introduction to reactions +sidebar_label: Introduction to reactions hide_title: true --- -# Autorun +# Introduction to Reactions + +Reactions are an important concept to understand as it is where everything in MobX comes together. +The goal of reactions is to model side-effects that happen automatically. +Applications without side effects are meaningless; if an application doesn't cause a physical change in the world somewhere, it even doesn't have to run after all. +So the significance of reactions is to create consumers for your observable state and _automatically_ run side effects whenever something _relevant_ changes. + +However, with that in mind, it is important to realize that the APIs discussed here should rarely be used. +Typically they are abstracted away in other libraries (like mobx-react) or abstractions that are specific to your application. + +But, to grok MobX, let's take a look at how reactions can be created. +The simplest way is to use the [`autorun`](#autorun) utility. +Beyond that, there is also [`reaction`](#reaction) and [`when`](#when). + +## Autorun Usage: - `autorun(effect: (reaction) => void)` -Autorun is a type of _reaction_. Reactions are **side effects** that react automatically to state changes. Reactions _can_ be used to ensure that a certain side effect (mainly I/O) is automatically executed when relevant state changes, like logging, network requests etc. +The `autorun` function accepts one function that should run each time anything it observes changes. +It also runs once when you create the `autorun`. It only responds to changes in observable state -- so things you marked `observable` or `computed`. + +### How tracking works -You pass a function into `autorun` that should run each time anything it observes changes. It also runs once when you create the `autorun`. It only responds to changes in observable state -- so things you marked `observable` or `computed`. It won't -respond if other observable state changes that it does not in any refer refer -to in the function. +Autorun works by running `effect` in a _reactive context_; during the executing of the provided function MobX will keep track of all observable and computed values that are directly or indirectly _read_ by the effect. +Once the function finishes, MobX will collect and subscribe to all observables that were read and wait until any of them changes again. +Once any of these observables changes, the autorun will trigger again, repeating the entire process. -Here's an example: +There are a few rules that apply to any reactive context: + +1. Affected reactions run by default immediately (synchronously) if an observable is changed. However, they won't run before the end of the current outermost (trans)action. +2. Autorun tracks only the observables that are read during the synchronous execution of the provided function, but it won't track anything that happens asynchronously. +3. Autorun won't track observables that are read by an action invoked by the autorun, as actions are always _untracked_. + +For a more detailed break down of what MobX reacts to, see [what does MobX react to](what-does-mobx-react-to.md). + +### Example ```javascript import { makeAutoObservable, autorun } from "mobx" @@ -81,7 +106,7 @@ Energy level: 10 Energy level: 0 ``` -As you can see, both `autorun` functions run once when they are initialized -- +As you can see in the example, both `autorun` functions run once when they are initialized -- this is all you would see without the `for` loop. This accounts for the first two lines of the output. @@ -94,106 +119,177 @@ change to its observable state: - For the "Now I'm hungry" function it's each time the `isHungry` computed changes; so only once. -Compare this with [reaction](reaction.md), which offers more fine-grained control over when the effect runs. - -## When to use `autorun` - -`autorun` is useful when you need to bridge from reactive to imperative code, for -example for logging, persistence, or UI-updating code. It should not be used to update state that can be derived from other observables; use [`computed`](computed.md) for that. +## Reaction -If you use React, it's like the [`observer` function](../react/react-integration.md); `autorun` only observes data that is used during the execution of the provided function. - -It can be used in those cases where you want to create a reactive function that will never have observers itself. - -In contrast, [`computed`](computed.md) creates a function that only re-evaluates if it it itself being observed, otherwise its value is considered to be irrelevant. -As a rule of thumb: use `autorun` if you have a function that should run automatically but that doesn't result in a new value. -Use `computed` for everything else. Autoruns are about initiating _effects_, not about producing new values. +Usage: -## Debug name +- `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. -If a string is passed as first argument to `autorun`, it will be used as debug name. +`reaction` is like `autorun` but gives more fine grained control on which observables will be tracked. +It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. +It is important to notice that the side effect _only_ reacts to data that was _accessed_ in the data expression, which might be less than the data that is actually used in the effect. +The typical pattern is that you produce the things you need in your side effect +in the _data_ function, and in that way control more precisely when the effect triggers. -## Disposing of autorun +Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. -The return value from autorun is a disposer function, which can be used to dispose of the autorun when you no longer need it: +Reaction is roughly equivalent to: ```javascript -const disposer = autorun(() => { - /* do some stuff */ -}) -disposer() +function reaction(dataFn, effectFn) { + return autorun(() => { + const data = dataFn() + runInAction(() => { + effectFn(data) + }) + }) +} ``` -The reaction itself is also passed as the only argument to the function given to autorun, which allows you to manipulate it from within the autorun function. This -gives you another way to dispose of the autorun: +### Example + +In the example below, the reaction is only triggered once, when `isHungry` changes. +Changes to `giraffe.energyLevel`, which is used by the _effect_ function, do not cause the _effect_ function to be executed. If you wanted `reaction` to respond to this +as well, you would have to also access it in the _data_ function and return it. ```javascript -autorun(reaction => { - /* do some stuff */ - reaction.dispose() -}) -``` +import { makeAutoObservable, reaction } from "mobx" -[Read more about why it's important to dispose](../best/dispose-reactions). +class Animal { + name + energyLevel -## Options + constructor(name) { + this.name = name + this.energyLevel = 100 + makeAutoObservable(this) + } -Autorun accepts an object as the last argument with the following optional options: + reduceEnergy() { + this.energyLevel -= 10 + } -- `delay`: Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling happens. -- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -- `onError`: function that will handle the errors of this reaction, rather than propagating them. -- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` + get isHungry() { + return this.energyLevel < 50 + } +} -## The `delay` option +const giraffe = new Animal("Gary") -```javascript -autorun( - () => { - // Assuming that profile.asJson returns an observable Json representation of profile, - // send it to the server each time it is changed, but await at least 300 milliseconds before sending it. - // When sent, the latest value of profile.asJson will be used. - sendProfileToServer(profile.asJson) - }, - { delay: 300 } +reaction( + () => giraffe.isHungry, + isHungry => { + if (isHungry) { + console.log("Now I'm hungry!") + } else { + console.log("I'm not hungry!") + } + console.log("Energy level:", giraffe.energyLevel) + } ) + +console.log("Now let's change state!") +for (let i = 0; i < 10; i++) { + giraffe.reduceEnergy() +} +``` + +The output of this example is: + +``` +Now let's change state! +Now I'm hungry! +Energy level: 40 ``` -## The `onError` option +## When -Exceptions thrown in autorun and all other types reactions are caught and logged to the console, but not propagated back to the original causing code. -This is to make sure that an exception in one reaction does not prevent the scheduled execution of other, possibly unrelated, reactions. -This also allows reactions to recover from exceptions; throwing an exception does not break the tracking done by MobX, so as subsequent run of a reaction might complete normally again if the cause for the exception is removed. +Usage: + +- `when(predicate: () => boolean, effect?: () => void, options?)` +- `when(predicate: () => boolean, options?): Promise` + +`when` observes and runs the given _predicate_ function until it returns `true`. +Once that happens, the given _effect_ function is executed and the autorunner is disposed. -It is possible to override the default logging behavior of Reactions by providing the `onError` option. For example: +### Example + +This function is really useful to dispose or cancel stuff in a reactive way. +For example: ```javascript -import { makeAutoObservable, autorun } from "mobx" +import { when, makeAutoObservable } from "mobx" + +class MyResource { + constructor() { + makeAutoObservable(this, { dispose: false }) + when( + // once... + () => !this.isVisible, + // ... then + () => this.dispose() + ) + } -class Person { - age + get isVisible() { + // indicate whether this item is visible + } - constructor(age) { - this.age = age - makeAutoObservable(this) + dispose() { + // clean up some resources } } +``` -const person = new Person(10) +As soon as `isVisible` becomes `false`, the `dispose` method is called that +then does some cleanup for `MyResource`. -const dispose = autorun( - () => { - if (person.age. < 0) { - throw new Error("Age should not be negative") - } - console.log("Age", person.age) - }, - { - onError(e) { - window.alert("Please enter a valid age") - } - } -) +`when` returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. + +### `await when(...)` + +If no `effect` function is provided, `when` returns a `Promise`. This combines nicely with `async / await` to let you wait for changes in observable state: + +```javascript +async function() { + await when(() => that.isVisible) + // etc.. +} ``` -A global `onError` handler can be set as well with `onReactionError(handler)`. This can be useful in tests or for client side error monitoring. +To cancel the `when` prematurely, it is possible to call `.cancel()` on the promise returned by `when`. + +## Reaction Options + +The `options` argument as shown above can be passed to further fine tune the behavior of `autorun` / `reaction` / `when`: + +- `name`: Debug name (string) that is used as name for this reaction in for example [`spy`](spy.md) events. +- `fireImmediately` (reaction): Boolean that indicates that the _effect_ function should immediately be triggered after the first run of the _data_ function. `false` by default. +- `delay` (reaction, autorun): Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling happens. +- `timeout` (when): Set a limited amount of time that `when` will wait. If the deadline passes, `when` will reject / throw. +- `onError`: By default any exception thrown inside a reaction will be logged but not further thrown. This is to make sure that an exception in one reaction does not prevent the scheduled execution of other, possibly unrelated, reactions. This also allows reactions to recover from exceptions; throwing an exception does not break the tracking done by MobX, so as subsequent run of a reaction might complete normally again if the cause for the exception is removed. This option allows overriding that behavior. It is possible to set a global error handler or to disable catching errors completely using [configure](configure.md). +- `scheduler` (autorun, reaction): Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` +- `equals`: (reaction) `comparer.default` by default. If specified, this comparer function is used to compare the previous and next values produced by the _data_ function. The _effect_ function is only invoked if this function returns false. + +## Always dispose reactions + +The functions passed to `autorun`, `reaction`, `when` are only garbage collected if all objects they observe are garbage collected themselves; in principle they keep waiting forever for new changes to happen in the observables they use. +To be able to stop them from waiting until forever has passed, they all return a disposer function that can be used to stop them and unsubscribe from any observables used. + +We strongly recommend to always use the disposer function that is returned from these functions as soon as their side effect is no longer needed. +Failing to do so can lead to memory leaks. + +## Use reactions sparingly + +As said, typically you won't create reactions very often. +It might very well be that your application doesn't use any of those APIs directly, and the only way reactions are construction is indirectly through for example `observer` from the mobx-react bindings. + +Before you set up a reaction, it is good to check if it complies to the following principles first: + +1. **Reactions shouldn't derive values**: Is the reaction going to modify some observables? If the answer is yes, typically the observable you want to update should be expressing using a [`computed`](computed.md) value instead. For example, if a collection of todos is altered, don't use a reaction to compute the amount of `remainingTodos`, but express `remainingTodos` as a computed value. That will lead to much clearer and easier to debug code. Reactions should not compute new data but only cause effects. Put differently, side effects are in principle not observable from your application code itself but only affect the 'outside world'. +2. **Reactions should be independent**: Does your code rely on some other reaction to have run first? If that is the case, you probably + either violated the first rule, or the new reaction you are about to create should be merged into the one it is depending upon. MobX doesn't guarantee the order in which reactions will be run. +3. **Reactions should be decoupled from their cause**: If a side effect should happen in response to a very limited set of events / actions, it will often be clearer to directly trigger the effect from those specific events. For example, if pressing a form submit button should lead to a network request to be posted, it is clearer to trigger this effect directly in response of the `onClick` event, rather than indirectly through a reaction. In contrast, if any change you make to the form state should automatically end up in local storage, then a reaction can be very useful, so that you don't have to trigger this effect from every individual `onChange` event. + +There are real-life scenarios that don't fit in above principles. That is why they are _principles_, not _laws_. +But the exceptions are rare so only violate them as a last resort. diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 02a3ac1d7..f74720c84 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -159,3 +159,5 @@ Returns `true` if the designated property is a computed value. [🚀] You can pass [options into `computed`](computed-options.md). If you experience unexpected behavior, you can also read more about the [detailed behavior of `computed`](computed-behavior.md). + +- don't create new observables in computed, dont cause side effects diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 1b26a0dee..42c65355a 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,6 +1,6 @@ --- title: Configuring MobX -sidebar_label: Configuring MobX +sidebar_label: Configuring MobX [🚀] hide_title: true --- diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index bc1776581..5c60f6668 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -1,12 +1,12 @@ --- -title: Creating observables -sidebar_label: Creating observables +title: Create observable state +sidebar_label: Create observable state hide_title: true --- -# Creating observables +# Create observable state Properties, entire objects, arrays, Maps and Sets can all be made observable. The basics of making objects observable is by specifying an annotation per property by using `makeObservable`. diff --git a/docs/refguide/reaction.md b/docs/refguide/reaction.md deleted file mode 100644 index cb9cea481..000000000 --- a/docs/refguide/reaction.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: reaction -sidebar_label: reaction -hide_title: true ---- - - - -# Reaction - -Usage: - -- `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. - -`reaction` is like [`autorun`](autorun.md) but gives more fine grained control on which observables will be tracked. -It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. -It is important to notice that the side effect _only_ reacts to data that was _accessed_ in the data expression, which might be less than the data that is actually used in the effect. In other words: only observables accessed by the _data_ function are tracked; observables that are accessed while executing the _effect_ function are not. - -Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. - -The _effect_ function passed to `reaction` receives the value returned by the _data_ function as its first argument. - -The typical pattern is that you produce the things you need in your side effect -in the _data_ function, because is only be triggered when the data returned by the expression has changed. - -Here is an example: - -```javascript -import { makeAutoObservable, reaction } from "mobx" - -class Animal { - name - energyLevel - - constructor(name) { - this.name = name - this.energyLevel = 100 - makeAutoObservable(this) - } - - reduceEnergy() { - this.energyLevel -= 10 - } - - get isHungry() { - return this.energyLevel < 50 - } -} - -const giraffe = new Animal("Gary") - -reaction( - () => giraffe.isHungry, - isHungry => { - if (isHungry) { - console.log("Now I'm hungry!") - } else { - console.log("I'm not hungry!") - } - console.log("Energy level:", giraffe.energyLevel) - } -) - -console.log("Now let's change state!") -for (let i = 0; i < 10; i++) { - giraffe.reduceEnergy() -} -``` - -The output of this example is: - -``` -Now let's change state! -Now I'm hungry! -Energy level: 40 -``` - -As you can see, this reaction is only triggered once, when `isHungry` changes. -Changes to `giraffe.energyLevel`, which the _effect_ function only uses, do not cause the _effect_ function to be executed. If you wanted `reaction` to respond to this -as well, you would have to also access it in the _data_ function and return it. - -Compare this with the example given for [autorun](autorun.md). - -## Disposing of reaction - -Like with `autorun`, the return value is a disposer function: - -```javascript -const disposer = reaction( - () => { - /* return data */ - }, - data => { - /* do some stuff */ - } -) -disposer() -``` - -You can also access the reaction itself as the second argument: - -The reaction itself is also passed as the second argument to the _effect_ function, -so this gives you another way to dispose of the reaction: - -```javascript -const disposer = reaction( - () => { - /* return data */ - }, - (data, reaction) => { - /* do some stuff */ - reaction.dispose() - } -) -``` - -[Read more about why it's important to dispose](../best/dispose-reactions). - -## Options - -Reaction accepts a third argument as an options object with the following optional options: - -- `fireImmediately`: Boolean that indicates that the _effect_ function should immediately be triggered after the first run of the _data_ function. `false` by default. -- `delay`: Number in milliseconds that can be used to throttle the _effect_ function. If zero (the default), no throttling happens. -- `equals`: `comparer.default` by default. If specified, this comparer function is used to compare the previous and next values produced by the _data_ function. The _effect_ function is only invoked if this function returns false. If specified, this overrides `compareStructural`. -- `name`: String that is used as name for this reaction in for example [`spy`](spy.md) events. -- `onError`: function that handles the errors of this reaction, rather than propagating them. -- `scheduler`: Set a custom scheduler to determine how re-running the autorun function should be scheduled - -## Behavior - -Reaction is roughly speaking sugar for: - -```javascript -computed(expression).observe(action(sideEffect)) -``` - -or - -```javascript -autorun(() => action(sideEffect)(expression)) -``` diff --git a/docs/refguide/when.md b/docs/refguide/when.md deleted file mode 100644 index 955c20adb..000000000 --- a/docs/refguide/when.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: when -sidebar_label: when -hide_title: true ---- - - - -# when - -Usage: - -- `when(predicate: () => boolean, effect?: () => void, options?)` -- `when(predicate: () => boolean): Promise - -`when` observes and runs the given _predicate_ function until it returns `true`. -Once that happens, the given _effect_ function is executed and the autorunner is disposed. - -This function is really useful to dispose or cancel stuff in a reactive way. -For example: - -```javascript -import { when, makeAutoObservable } from "mobx" - -class MyResource { - constructor() { - makeAutoObservable(this, { dispose: false }) - when( - // once... - () => !this.isVisible, - // ... then - () => this.dispose() - ) - } - - get isVisible() { - // indicate whether this item is visible - } - - dispose() { - // dispose - } -} -``` - -As soon as `isVisible` becomes `false`, the `dispose` method is called that -then does some cleanup for `MyResource`. - -`when` returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. - -[Read more about why it's important to dispose](../best/dispose-reactions). - -## when-promise - -If no `effect` function is provided, `when` returns a `Promise`. This combines nicely with `async / await` to let you wait for changes in observable state: - -```javascript -async function() { - await when(() => that.isVisible) - // etc.. -} -``` diff --git a/notes.md b/notes.md index b1a10a912..dabeb98c0 100644 --- a/notes.md +++ b/notes.md @@ -65,6 +65,7 @@ - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - [ ] add deprecation messages to latest mobx 5 - [ ] merge 2398 + - [ ] make `onReactionError` an option for `configure` - [ ] docs - [ ] clean up docs - [ ] fix interactive tut diff --git a/src/api/when.ts b/src/api/when.ts index a2d1313b2..2705a8bfd 100644 --- a/src/api/when.ts +++ b/src/api/when.ts @@ -12,11 +12,6 @@ import { export interface IWhenOptions { name?: string timeout?: number - /** - * Experimental. - * Warns if the view doesn't track observables - */ - requiresObservable?: boolean onError?: (error: any) => void } diff --git a/website/i18n/en.json b/website/i18n/en.json index 14f4c0d74..cab9c0e3a 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -8,10 +8,6 @@ "backers-sponsors": { "title": "MobX Backers and Sponsors" }, - "best/actions": { - "title": "Asynchronous actions", - "sidebar_label": "Asynchronous actions" - }, "best/decorators": { "title": "best/decorators", "sidebar_label": "Decorators in MobX [🚀]" @@ -88,8 +84,8 @@ "sidebar_label": "API overview" }, "refguide/autorun": { - "title": "autorun", - "sidebar_label": "autorun" + "title": "Introduction to reactions", + "sidebar_label": "Introduction to reactions" }, "refguide/computed-behavior": { "title": "How computed works", @@ -111,10 +107,6 @@ "title": "refguide/extending", "sidebar_label": "New observable types [🚀]" }, - "refguide/flow": { - "title": "flow", - "sidebar_label": "flow" - }, "refguide/internals": { "title": "Internal functions", "sidebar_label": "Internal functions [🚀]" @@ -140,8 +132,8 @@ "sidebar_label": "objects" }, "refguide/observable": { - "title": "Creating observables", - "sidebar_label": "Creating observables" + "title": "Create observable state", + "sidebar_label": "Create observable state" }, "refguide/observe": { "title": "refguide/observe", @@ -182,7 +174,6 @@ "Introduction": "Introduction", "Basics": "Basics", "MobX and React": "MobX and React", - "Updating observables with actions": "Updating observables with actions", "Computed values": "Computed values", "Effects for observables": "Effects for observables", "Debugging MobX": "Debugging MobX", diff --git a/website/sidebars.json b/website/sidebars.json index 202b28a45..405795cf6 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -8,7 +8,8 @@ ], "Basics": [ "refguide/observable", - "refguide/action" + "refguide/action", + "refguide/autorun" ], "MobX and React": [ "react/react-integration", @@ -22,10 +23,6 @@ "refguide/computed-behavior" ], "Effects for observables": [ - "refguide/autorun", - "refguide/reaction", - "refguide/when", - "best/dispose-reactions", "best/what-does-mobx-react-to", "refguide/observe", "refguide/on-become-observed" From 85487a5dca401383c06e915ef24c174a1c298a68 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Tue, 28 Jul 2020 21:05:02 +0100 Subject: [PATCH 0486/1043] Improvements with details/summary. Restored some examples --- docs/refguide/action.md | 11 +++- docs/refguide/autorun.md | 116 +++++++++++++++++++++++++--------- docs/refguide/observable.md | 31 ++++----- website/i18n/en.json | 18 +----- website/static/css/custom.css | 16 +++++ 5 files changed, 125 insertions(+), 67 deletions(-) diff --git a/docs/refguide/action.md b/docs/refguide/action.md index cd60916ee..a884d21e3 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -26,6 +26,8 @@ Functions that just perform look-ups, filter data, in short any function that de 1. Actions are run inside [transactions](api.md#transaction). No observers will be updated until the outer-most action has finished. This ensures that intermediate or incomplete values produced during an action are not visible to the rest of the application until the action has finished. 2. Outside actions it is (by default) not allowed to modify state. This helps to clearly identify in your code base where the state updates happen. +### Examples + @@ -165,7 +167,8 @@ Usage: The `action.bound` annotation can be used to automatically bind a method to the correct instance, so that `this` is always correctly bound inside the function. -Tip: If you want to bind actions in combination with `makeAutoObservable`, it is usually simpler to use arrow functions instead: +
    Tip: prefer arrow functions over `action.bound` +If you want to bind actions in combination with `makeAutoObservable`, it is usually simpler to use arrow functions instead: ```javascript import { makeAutoObservable } from "mobx" @@ -184,6 +187,8 @@ class Doubler { } ``` +
    + ### `runInAction` Usage: @@ -191,7 +196,7 @@ Usage: - `runInAction(fn)` Use this utility to create a temporarily action that is immediately invoked. Can be useful in asynchronous processes. -See the above code block for an example. +See the [above code block](#examples) for an example. ## Asynchronous actions @@ -357,7 +362,7 @@ It can be applied as follows: 2. Instead of `async` you use `function *`. 3. Instead of `await` you use `yield`. -The listing above shows what this looks in practice. +The [listing above](#examples) shows what this looks in practice. ### Flow cancellation diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 1d323e145..332b6af67 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -1,12 +1,12 @@ --- -title: Introduction to reactions -sidebar_label: Introduction to reactions +title: Run side-effects with reactions +sidebar_label: Run side-effects with reactions hide_title: true --- -# Introduction to Reactions +# Run side-effects with reactions Reactions are an important concept to understand as it is where everything in MobX comes together. The goal of reactions is to model side-effects that happen automatically. @@ -133,20 +133,8 @@ in the _data_ function, and in that way control more precisely when the effect t Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. -Reaction is roughly equivalent to: - -```javascript -function reaction(dataFn, effectFn) { - return autorun(() => { - const data = dataFn() - runInAction(() => { - effectFn(data) - }) - }) -} -``` - -### Example +
    + Example In the example below, the reaction is only triggered once, when `isHungry` changes. Changes to `giraffe.energyLevel`, which is used by the _effect_ function, do not cause the _effect_ function to be executed. If you wanted `reaction` to respond to this @@ -202,6 +190,8 @@ Now I'm hungry! Energy level: 40 ``` +
    + ## When Usage: @@ -212,7 +202,10 @@ Usage: `when` observes and runs the given _predicate_ function until it returns `true`. Once that happens, the given _effect_ function is executed and the autorunner is disposed. -### Example +The `when` function returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. + +
    + Example This function is really useful to dispose or cancel stuff in a reactive way. For example: @@ -244,9 +237,9 @@ class MyResource { As soon as `isVisible` becomes `false`, the `dispose` method is called that then does some cleanup for `MyResource`. -`when` returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. +
    -### `await when(...)` +### await when(...) If no `effect` function is provided, `when` returns a `Promise`. This combines nicely with `async / await` to let you wait for changes in observable state: @@ -259,7 +252,76 @@ async function() { To cancel the `when` prematurely, it is possible to call `.cancel()` on the promise returned by `when`. -## Reaction Options +## Always dispose reactions + +The functions passed to `autorun`, `reaction`, `when` are only garbage collected if all objects they observe are garbage collected themselves; in principle they keep waiting forever for new changes to happen in the observables they use. +To be able to stop them from waiting until forever has passed, they all return a disposer function that can be used to stop them and unsubscribe from any observables used. + +```javascript +const counter = observable({ count: 0 }) +// sets up the autorun, prints 0 +const disposer = autorun(() => { + console.log(counter.count) +}) +// prints 1 +counter.count++ + +// stops the autorun +disposer() +// won't print +counter.count++ +``` + +We strongly recommend to always use the disposer function that is returned from these functions as soon as their side effect is no longer needed. +Failing to do so can lead to memory leaks. + +The `reaction` argument that is passed as second argument to the effect functions of `reaction` and `autorun` can be used to prematurely clean up the reaction as well by calling `reaction.dispose()`. + +
    Memory leak example + +```javascript +class Vat { + value = 1.2 + + constructor() { + makeAutoObservable(this) + } +} + +const vat = new Vat() + +class OrderLine { + price = 10 + amount = 1 + constructor() { + makeAutoObservable(this) + + // this autorun will be GC-ed together with the current orderline instance + // as it only uses observables from `this`. It's not strictly necessary + // to dispose of it once an OrderLine instance is deleted. + this.disposer1 = autorun(() => { + doSomethingWith(this.price * this.amount) + }) + // this autorun won't be GC-ed together with the current orderline instance + // since vat keeps a reference to notify this autorun, which in turn keeps + // 'this' in scope + this.disposer2 = autorun(() => { + doSomethingWith(this.price * this.amount * vat.value) + }) + } + + dispose() { + // So, to avoid subtle memory issues, always call the + // disposers when the reaction is no longer needed + this.disposer1() + this.disposer2() + } +} +``` + +
    + +## Reaction options The `options` argument as shown above can be passed to further fine tune the behavior of `autorun` / `reaction` / `when`: @@ -271,15 +333,7 @@ The `options` argument as shown above can be passed to further fine tune the beh - `scheduler` (autorun, reaction): Set a custom scheduler to determine how re-running the autorun function should be scheduled. It takes a function that should be invoked at some point in the future, for example: `{ scheduler: run => { setTimeout(run, 1000) }}` - `equals`: (reaction) `comparer.default` by default. If specified, this comparer function is used to compare the previous and next values produced by the _data_ function. The _effect_ function is only invoked if this function returns false. -## Always dispose reactions - -The functions passed to `autorun`, `reaction`, `when` are only garbage collected if all objects they observe are garbage collected themselves; in principle they keep waiting forever for new changes to happen in the observables they use. -To be able to stop them from waiting until forever has passed, they all return a disposer function that can be used to stop them and unsubscribe from any observables used. - -We strongly recommend to always use the disposer function that is returned from these functions as soon as their side effect is no longer needed. -Failing to do so can lead to memory leaks. - -## Use reactions sparingly +## Use reactions sparingly! As said, typically you won't create reactions very often. It might very well be that your application doesn't use any of those APIs directly, and the only way reactions are construction is indirectly through for example `observer` from the mobx-react bindings. @@ -292,4 +346,4 @@ Before you set up a reaction, it is good to check if it complies to the followin 3. **Reactions should be decoupled from their cause**: If a side effect should happen in response to a very limited set of events / actions, it will often be clearer to directly trigger the effect from those specific events. For example, if pressing a form submit button should lead to a network request to be posted, it is clearer to trigger this effect directly in response of the `onClick` event, rather than indirectly through a reaction. In contrast, if any change you make to the form state should automatically end up in local storage, then a reaction can be very useful, so that you don't have to trigger this effect from every individual `onChange` event. There are real-life scenarios that don't fit in above principles. That is why they are _principles_, not _laws_. -But the exceptions are rare so only violate them as a last resort. +But, the exceptions are rare so only violate them as a last resort. diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 5c60f6668..95bc67e81 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -26,20 +26,18 @@ Usage: MakeObservable can be used to trap _existing_ object properties and make them observable. Any JavaScript object (including class instances) can be passed into `target`. Typically `makeObservable` is used in the constructor of a class, and its first argument is `this`. -The `annotations` argument then maps property names to [annotations](#available-annotations) to apply (see below for the list of available annotations). +The `annotations` argument then maps [annotations](#available-annotations) to map to each member (n.b.: when using [decorators](../best/decorators), the `annotations` argument can be omitted). Methods that derive information and take arguments (for example `findUsersOlderThan(age: number): User[]`) don't need any annotation. Their read operations will still be tracked when they are called from a reaction, but their output won't be memoized to avoid memory leaks (see also [mobx-utils:computedFn](https://github.com/mobxjs/mobx-utils#computedfn)). -
    +
    makeObservable limitations MakeObservable can only annotate properties declared by its own class definition. If a sub- or superclass introduces observable fields, it will have to call `makeObservable` for those properties itself. -Decorators note: When using [decorators](../best/decorators), the `annotations` argument can be omitted. - TypeScript note: When decorating private properties in TypeScript, you can pass the private property names as generic argument to `makeObservable` to suppress the compile error about the field not existing like this: `makeObservable<"myPrivateField" | "myOtherPrivateField>(this, { myPrivateField: observable })` -
    +

    @@ -131,14 +129,8 @@ Inference rules: - Any other _own_ field will be marked with `observable`. - Members marked with `false` in the `overrides` argument will not be annotated. Use this for for example read only fields such as identifiers. -
    - -When you call `makeObservable` or `makeAutoObservable` all properties you want to be observable -_must_ exist on the instance already. Either by [declaring](https://github.com/tc39/proposal-class-fields) them (recommended, as done above) or otherwise by assigning them _before_ calling `makeAutoObservable` - -Providing annotations must be done unconditionally, as this makes it possible to cache the inference results. - -
    +When you call `makeObservable` or `makeAutoObservable` all properties you want to annotate +_must_ exist on the instance already. Either by [declaring](https://github.com/tc39/proposal-class-fields) them (recommended, as done above) or otherwise by assigning them _before_ calling `makeAutoObservable` (declaring and annotating in one go can be done using [extendObservable](api.md#extendobservable)). Beyond that, calling and providing annotations must be done unconditionally, as this makes it possible to cache the inference results. ## `observable` @@ -155,13 +147,15 @@ The object returned by `observable` will be a Proxy, which means that properties The `observable` method can also be called with collections types like [arrays](../refguide/api.md#observablearray), [Maps](../refguide/api.md#observablemap) and [Sets](../refguide/api.md#observableset). Those will be cloned as well and converted into their observable counterpart. -
    +
    Primitives and class instances are never converted to observables -Primitive values cannot be made observable by MobX since they are immutable in JavaScript (but they can be [boxed](../refguide/api.md#observablebox)). Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. Making class members observable is considered the responsibility of the class constructor. -
    +Primitive values cannot be made observable by MobX since they are immutable in JavaScript (but they can be [boxed](../refguide/api.md#observablebox)). +Although there is typically no use for this mechanism outside libraries. + +
    ## Available annotations @@ -190,7 +184,8 @@ The above APIs take an optional `options` argument which is an object that suppo ## A short note on classes So far most examples above have been leaning towards class syntax. -MobX is unopinionated about this, and there are probably just as many MobX users that use plain objects. -A slight benefit of classes is that they have easily discoverable APIs icmw. TypeScript and are presented clearly in debug tools. +MobX is in principle unopinionated about this, and there are probably just as many MobX users that use plain objects. +However, a slight benefit of classes is that they have more easily discoverable APIs icmw. TypeScript. +Also, `instanceof` checks are really powerful for type inference, and class instances aren't wrapped in `Proxy` objects giving them a better experience in debuggers. But heavy inheritance patterns can become foot-guns easily. So if you use classes, keep them simple. diff --git a/website/i18n/en.json b/website/i18n/en.json index cab9c0e3a..af4fec4a0 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -12,10 +12,6 @@ "title": "best/decorators", "sidebar_label": "Decorators in MobX [🚀]" }, - "best/dispose-reactions": { - "title": "Always dispose reactions", - "sidebar_label": "Always dispose reactions" - }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", "sidebar_label": "Hot Module Reloading with Stateless Components" @@ -84,8 +80,8 @@ "sidebar_label": "API overview" }, "refguide/autorun": { - "title": "Introduction to reactions", - "sidebar_label": "Introduction to reactions" + "title": "Run side-effects with reactions", + "sidebar_label": "Run side-effects with reactions" }, "refguide/computed-behavior": { "title": "How computed works", @@ -101,7 +97,7 @@ }, "refguide/configure": { "title": "Configuring MobX", - "sidebar_label": "Configuring MobX" + "sidebar_label": "Configuring MobX [🚀]" }, "refguide/extending": { "title": "refguide/extending", @@ -143,10 +139,6 @@ "title": "onBecomeObserved", "sidebar_label": "onBecomeObserved [🚀]" }, - "refguide/reaction": { - "title": "reaction", - "sidebar_label": "reaction" - }, "refguide/set": { "title": "Observable Sets", "sidebar_label": "sets" @@ -158,10 +150,6 @@ "refguide/tojson": { "title": "toJS", "sidebar_label": "toJS" - }, - "refguide/when": { - "title": "when", - "sidebar_label": "when" } }, "links": { diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 71456f6ed..2e3ef4f74 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -46,6 +46,22 @@ article p img { color: #979797; } +details { + background-color: aliceblue; + font-size: 0.8em; + padding: 4px 8px; + border-radius: 4px; +} + +details > summary { + color: navy; + cursor: pointer; +} + +details[open] > summary { + margin-bottom: 8px; +} + /* BLM */ .slidingNav::before { content: "Black Lives Matter"; From 77900139b18a6ed213c320338cf65d8a2dd29beb Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 29 Jul 2020 01:00:24 +0100 Subject: [PATCH 0487/1043] WIP on computed --- docs/README.md | 2 + docs/intro/concepts.md | 2 + docs/refguide/action.md | 8 +- docs/refguide/autorun.md | 7 +- docs/refguide/computed.md | 198 ++++++++++++++++++++++-------------- docs/refguide/observable.md | 64 +++++++++++- notes.md | 2 + website/i18n/en.json | 14 +-- website/sidebars.json | 6 +- 9 files changed, 206 insertions(+), 97 deletions(-) diff --git a/docs/README.md b/docs/README.md index de520f904..83a5a6de9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -140,6 +140,8 @@ The reason for MobX's popularity boil down to this: _With MobX you write typical - **Easy interoperability**. MobX works with enriched but plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific flavors. So you can simply keep using promises, async/await, generators, your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. - **Asynchronous processes aren't special**. They are merely multiple synchronous actions spread over time. Because observable data structures allow you to hold on to references, asynchronous processes aren't more complicated than they should be. +The philosophy and benefits of the mental model provided by MobX are described in detail in the blogs [UI as an afterthought](https://michel.codes/blogs/ui-as-an-afterthought) and [How to decouple state and UI (a.k.a. you don’t need componentWillMount)](https://hackernoon.com/how-to-decouple-state-and-ui-a-k-a-you-dont-need-componentwillmount-cc90b787aa37). + ## Further resources and documentation - [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index db3d2e16b..492059a1d 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -196,6 +196,8 @@ If a view is no longer in use it will be garbage collected automatically. All _Computed values_ should be **pure**. They are not supposed to change _state_. +For some more background context, read [the fundamental principles behind MobX](https://hackernoon.com/the-fundamental-principles-behind-mobx-7a725f71f3e8). + ## Try it out! You can play with the above yourself on [CodeSandbox](https://codesandbox.io/s/concepts-principles-il8lt?file=/src/index.js:1161-1252). diff --git a/docs/refguide/action.md b/docs/refguide/action.md index a884d21e3..62a61cfc0 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -1,6 +1,6 @@ --- title: Update state using actions -sidebar_label: Update state using actions +sidebar_label: Actions hide_title: true --- @@ -344,7 +344,7 @@ class Store { -## Using flow instead of async/await +## 🚀 Using flow instead of async/await Usage: @@ -364,14 +364,14 @@ It can be applied as follows: The [listing above](#examples) shows what this looks in practice. -### Flow cancellation +### 🚀 Flow cancellation Another neat benefit of flows is that they are cancellable. The return value of `flow` is a promise that resolves with the value that is returned from the generator function in the end. The returned promise has an additional `cancel()` methods that will interrupt the running generator and cancel it. Any `try / finally` clauses will still be run. -## Disabling mandatory actions +## 🚀 Disabling mandatory actions By default, MobX 6 and later require that you use actions to make state changes. You can however configure MobX to disable this behavior, see [`enforceActions`](configure.md#enforceactions). diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 332b6af67..e7d1eede8 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -1,6 +1,6 @@ --- title: Run side-effects with reactions -sidebar_label: Run side-effects with reactions +sidebar_label: Reactions hide_title: true --- @@ -41,7 +41,8 @@ There are a few rules that apply to any reactive context: 2. Autorun tracks only the observables that are read during the synchronous execution of the provided function, but it won't track anything that happens asynchronously. 3. Autorun won't track observables that are read by an action invoked by the autorun, as actions are always _untracked_. -For a more detailed break down of what MobX reacts to, see [what does MobX react to](what-does-mobx-react-to.md). +For a more examples on what precisely MobX will and won't react to, see [what does MobX react to](what-does-mobx-react-to.md). +For a detailed technical breakdown on how tracking works, read [Becoming fully reactive: an in-depth explanation of MobX](https://hackernoon.com/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254) ### Example @@ -321,7 +322,7 @@ class OrderLine {
    -## Reaction options +## 🚀 Reaction options The `options` argument as shown above can be passed to further fine tune the behavior of `autorun` / `reaction` / `when`: diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index f74720c84..98042e09c 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -1,36 +1,39 @@ --- -title: computed -sidebar_label: computed +title: Derive information with computed +sidebar_label: Computed hide_title: true --- -# computed +# Derive information with computed -Computed values are values that can be derived from the existing state or other computed values. +Usage: + +- `computed` (annotation) +- `computed(options)` (annotation) +- `computed(fn, options?)` + +Computed values are values that can be expressed entirely in terms of already existing state. Conceptually, they are very similar to formulas in spreadsheets. -Computed values can't be underestimated, as they help you to make your actual modifiable state as small as possible. -Besides that they are highly optimized, so use them wherever possible. +Computed values can't be underestimated, they help in reducing the amount of state you have to store and are highly optimized. Use them wherever possible. Computed values are automatically derived from your state if any value that affects them changes. -MobX can optimize the calculation of computed values away in many cases because +MobX can optimize the re-calculation of computed values away in many cases because this calculation is assumed to be pure. -For example, a computed property won't re-run if no observable data used in the previous computation changed. -Nor will a computed property re-run if is not in use by some other computed property or a reaction. In such cases it is suspended. +For example, a computed property won't re-run when read, if no observable data used in the previous computation changed. +Nor will a computed property automatically re-run if is not being observed by some [reaction](autorun.md). +In such cases the computation will be suspended. +This means in practice if a computation isn't shown (for example) somewhere in the UI, no cycles will be spend on it. -If a computed value is no longer observed, for example because the UI in which it was used no longer exists, MobX automatically garbage collects it. - -To create a `computed` property, you need to use a JavaScript [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get). `computed` -properties cannot use arguments (though see [computed with arguments](computed.md#computed-with-arguments)). - -Note that `computed` properties are not [enumerable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties). Nor can they be overwritten in an inheritance chain. +To create a `computed` property, you need to use a JavaScript [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) and annotate it with `computed`. -Don't confuse `computed` with [`autorun`](autorun.md). They are both reactively invoked expressions, but use `computed` if you want to reactively produce a _value_ that can be used by other observers and `autorun` if you don't want to produce a new value but rather want to achieve an _effect_. For example imperative side effects like logging, making network requests etc. +It is important to never confuse `computed` with [`autorun`](autorun.md). +They are both expressions tracked by MobX, but always [prefer](autorun.md#use-reactions-sparingly) `computed` if you want to derive a value that is of further use of your program. -## Declaring a getter as `computed` +## Example -You can use `makeObservable` to declare a getter as computed: +You can use `makeObservable` to declare a getter as computed (if you use `makeAutoObservable`, `observable` or `extendObservable`, all getters are automatically declared as `computed`): ```javascript import { makeObservable, observable, computed } from "mobx" @@ -49,51 +52,63 @@ class OrderLine { } get total() { + console.log("computing...") return this.price * this.amount } } -``` -If you use `makeAutoObservable`, all getters are automatically declared -computed: +const order = new OrderLine(0) -```javascript -import { makeAutoObservable } from "mobx" +const stop = autorun(() => { + console.log("total: " + order.total) +}) +// computing... +// total: 0 -class OrderLine { - price = 0 - amount = 1 +console.log(order.total) +// (no re-computing!) +// 0 - constructor(price) { - makeAutoObservable(this) - this.price = price - } +order.amount = 5 +// computing... +// (no autorun) - get total() { - return this.price * this.amount - } -} -``` +order.price = 2 +// computing... +// total: 10 -Both `observable.object` and `extendObservable` will automatically infer getter properties to be computed properties as well, so the following suffices: +stop() -```javascript -const orderLine = observable.object({ - price: 0, - amount: 1, - get total() { - return this.price * this.amount - } -}) +order.price = 3 +// (neither the computation or autorun will recomputed) ``` -## Setters for computed values +The above example nicely demonstrates the benefit of a `computed`, it acts as caching point. +Even though we change the `amount`, and this will trigger the `total` to recompute, +it won't trigger the `autorun`, as `total` will detect it output hasn't been affected, so there is no need to update the `autorun`. +In comparison, if total would not be annotated, the autorun would run it's effect 3 times, +as it will directly depend on `total` and `amount`. [Try it](https://codesandbox.io/s/computed-3cjo9?file=/src/index.tsx). + +
    Note: computed values won't cache if they are _not_ observed + +A thing that often confuses newcomers to MobX is that computed values don't +cache or track changes if they are not actively in use. +For example, if we'd extend the above example with calling `console.log(order.total)` twice, after we called `stop()`, the value would be recomputed twice. + +The reason is that it is by default beneficial to forget about computations that are not in use by a reaction, for example because they aren't shown anywhere in the UI at this moment. +This default saves memory and computational resources, but can sometimes be confusing in small experiments. +It can be overridden by setting annotating with the `keepAlive` flag ([try it](https://codesandbox.io/s/computed-3cjo9?file=/src/index.tsx)) or by creating a no-op `autorun(() => { someObject.someComputed })`. +Note that both solutions have the risk of creating memory leaks; changing the default behavior here is an anti-pattern. + +
    + +
    Tip: computed values can also have setters It is possible to define a [setter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) for computed values as well. Note that these setters cannot be used to alter the value of the computed property directly, -but they can be used as 'inverse' of the derivation. For example: +but they can be used as 'inverse' of the derivation. Setters are automatically marked as actions. For example: ```javascript -class Foo { +class Dimension { length = 2 constructor() { @@ -104,60 +119,89 @@ class Foo { return this.length * this.length } set squared(value) { - //this is automatically an action, no annotation necessary this.length = Math.sqrt(value) } } ``` -_Note: always define the setter *after* the getter, some TypeScript versions are known to declare two properties with the same name otherwise._ +
    -Setters are automatically marked as actions. +## About derivations with arguments -## Computed with arguments +The `computed` annotation can only be used on getters, which don't take arguments. +What about computations that do take arguments? +Take the below example of a React component that renders a specific todo, +and the application supports multi-selection. +How can we implement a derivation like `todoStore.isSelected(todoId)`? -[🚀] Sometimes you might want to have a computed value that takes one or more arguments. In such cases mobx-util's [`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) can be used: +Base example (based on React): ```javascript -import { observable } from "mobx" -import { computedFn } from "mobx-utils" - -class Todos { - todos = [] - - constructor() { - makeAutoObservable(this) - } - - getAllTodosByUser = computedFn(function getAllTodosByUser(userId) { - return this.todos.filter(todo => todo.user === userId) - }) -} +import * as React from 'react' +import {observer} from 'mobx-react-lite' + +const Todo = observer(({ todo, todoStore }) => ( +
    + {todo.title} +
    +) ``` -Note: don't use arrow functions as the `this` would be incorrect. +### 1. Derivations don't _need_ computed -For further details, check the mobx-utils [docs](https://github.com/mobxjs/mobx-utils#computedfn) +A function doesn't need to be marked `computed` to enable to MobX to track it. +The above example would already work completely fine out of the box. +It is important to realise that computed values are only _caching points_. +If they are pure (and they shouldn't), having a getter or function without `computed` doesn't change behavior; it is just slightly less inefficient. +The above example works fine despite `isSelected` not being a `computed`; +the `observer` component will detect and subscribe to any observables that were read by `isSelected`, because the function executes as part of the rendering that is tracked. -## `isComputed` +It is good to realize that all `Todo` components in this case will respond to future selection changes, +as they all subscribe directly to the observables that capture the selection. +This is a worst case example, in general it is completely fine to have unmarked functions that derive information, and this is a good default strategy, until numbers proof anything else should be done. -Usage: +### 2. Close over the arguments -- `isComputed(value)` +Here is a more efficient implementation: -Returns `true` if `value` is a boxed computed value. +```javascript +import * as React from 'react' +import {observer, computed} from 'mobx-react-lite' + +const Todo = observer(({ todo, todoStore }) => ( + const isSelected = computed(() => todoStore.isSelected(todo.id)) +
    + {todo.title} +
    +) +``` -## `isComputedProp` +Here we create a fresh computed value in the middle of a reaction. +That works fine and does introduce that additional caching point, avoiding all components to directly +to all selection changes. +The advantage of this approach is that the component itself will only render if the +`isSelected` state toggles (in which we case indeed have to render to swap the `className`). +The fact that we create a new `computed` in a next render is fine, that one will now become the caching +point and the previous one will be cleaned up nicely. +This is a great, advanced optimization technique. -Usage: +### 3. 🚀 Use computedFn -- `isComputedProp(obj, propertyName)` - -Returns `true` if the designated property is a computed value. +Finally, +[`computedFn`](https://github.com/mobxjs/mobx-utils#computedfn) from `mobx-utils` can be used in the definition of `todoStore.selected` to automatically memoize `isSelected`. +It creates a function that memoize for each combination of input arguments. +We recommend to not resort to that one too quickly, as, typical for memoization, before you can reason about the memory consumption you will need to think about how many different arguments the function is going to be called with. +It does however automatically clean up entries if their results aren't observed by any reaction, so it won't leak memory in normal circumstances. ## More about computed [🚀] You can pass [options into `computed`](computed-options.md). If you experience unexpected behavior, you can also read more about the [detailed behavior of `computed`](computed-behavior.md). +- unobserved, computeds won't cache + - don't create new observables in computed, dont cause side effects + +Note that `computed` properties are not [enumerable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties). Nor can they be overwritten in an inheritance chain. + +Derivation graph plaatje diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 95bc67e81..75410a248 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -1,6 +1,6 @@ --- -title: Create observable state -sidebar_label: Create observable state +title: Creating observable state +sidebar_label: Observable state hide_title: true --- @@ -147,6 +147,48 @@ The object returned by `observable` will be a Proxy, which means that properties The `observable` method can also be called with collections types like [arrays](../refguide/api.md#observablearray), [Maps](../refguide/api.md#observablemap) and [Sets](../refguide/api.md#observableset). Those will be cloned as well and converted into their observable counterpart. +
    Observable array example + +The following example creates an observable and observes it using [`autorun`](autorun.md). +Working with Map and Set collections works similarly. + +```javascript +import { observable, autorun } from "mobx" + +const todos = observable([ + { title: "Spoil tea", completed: true }, + { title: "Make coffee", completed: false } +]) + +autorun(() => { + console.log( + "Remaining:", + todos + .filter(todo => !todo.completed) + .map(todo => todo.title) + .join(", ") + ) +}) +// Prints: 'Remaining: Make coffee' + +todos[0].completed = false +// Prints: 'Remaining: Spoil tea, Make coffee' + +todos[2] = { title: "Take a nap", completed: false } +// Prints: 'Remaining: Spoil tea, Make coffee, Take a nap' + +todos.shift() +// Prints: 'Remaining: Make coffee, Take a nap' +``` + +Observable arrays have some additional nifty utility functions: + +- `clear()` Remove all current entries from the array. +- `replace(newItems)` Replaces all existing entries in the array with new ones. +- `remove(value)` Remove a single item by value from the array. Returns `true` if the item was found and removed. + +
    +
    Primitives and class instances are never converted to observables Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. @@ -173,7 +215,7 @@ Although there is typically no use for this mechanism outside libraries. | `false` | Explicitly do not annotate this property. | | `autoAction` | Should not be used explicitly, but is used under the hood by `makeAutoObservable` to mark methods that can act as action or derivation, based on their calling context | -## The `options` argument +## 🚀 The `options` argument The above APIs take an optional `options` argument which is an object that supports the following options: @@ -181,6 +223,22 @@ The above APIs take an optional `options` argument which is an object that suppo - `deep: false`. Use `observable.ref` by default, rather than `observable` to create new observable members - `name: `. Gives the object a debug name that is printed in error messages and reflection APIs. +## Converting observables back to vanilla JavaScript collections + +Sometimes it is necessary to convert observable data structures back to their vanilla counterpart. +For example when passing observable objects to a React component that can't track observables, or to obtain a clone that should not further be mutated. + +To convert a collection shallowly the usual JavaScript mechanisms work: + +```javascript +const plainObject = { ...observableObject } +const plainArray = observableArray.slice() +const plainMap = new Map(observableMap) +``` + +To convert a data tree recursively to plain objects, the [`toJS`](api.md#tojs) utility can be used. +For classes, it is recommend to implement a `toJSON()` method, as that one will be picked up by `JSON.stringify`. + ## A short note on classes So far most examples above have been leaning towards class syntax. diff --git a/notes.md b/notes.md index dabeb98c0..bd4b0251a 100644 --- a/notes.md +++ b/notes.md @@ -66,6 +66,8 @@ - [ ] add deprecation messages to latest mobx 5 - [ ] merge 2398 - [ ] make `onReactionError` an option for `configure` + - [ ] investigate the onbecomeunobserved issue + - [ ] support `flow` and `computedFn` as annotation - [ ] docs - [ ] clean up docs - [ ] fix interactive tut diff --git a/website/i18n/en.json b/website/i18n/en.json index af4fec4a0..6e55d6fc7 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -73,7 +73,7 @@ }, "refguide/action": { "title": "Update state using actions", - "sidebar_label": "Update state using actions" + "sidebar_label": "Actions" }, "refguide/api": { "title": "MobX API Reference", @@ -81,7 +81,7 @@ }, "refguide/autorun": { "title": "Run side-effects with reactions", - "sidebar_label": "Run side-effects with reactions" + "sidebar_label": "Reactions" }, "refguide/computed-behavior": { "title": "How computed works", @@ -92,8 +92,8 @@ "sidebar_label": "Options for computed [🚀]" }, "refguide/computed": { - "title": "computed", - "sidebar_label": "computed" + "title": "Derive information with computed", + "sidebar_label": "Computed" }, "refguide/configure": { "title": "Configuring MobX", @@ -128,8 +128,8 @@ "sidebar_label": "objects" }, "refguide/observable": { - "title": "Create observable state", - "sidebar_label": "Create observable state" + "title": "Creating observable state", + "sidebar_label": "Observable state" }, "refguide/observe": { "title": "refguide/observe", @@ -160,7 +160,7 @@ }, "categories": { "Introduction": "Introduction", - "Basics": "Basics", + "MobX core": "MobX core", "MobX and React": "MobX and React", "Computed values": "Computed values", "Effects for observables": "Effects for observables", diff --git a/website/sidebars.json b/website/sidebars.json index 405795cf6..0e79894ff 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -6,10 +6,11 @@ "intro/installation", "intro/concepts" ], - "Basics": [ + "MobX core": [ "refguide/observable", "refguide/action", - "refguide/autorun" + "refguide/autorun", + "refguide/computed" ], "MobX and React": [ "react/react-integration", @@ -18,7 +19,6 @@ "react/react-class-components" ], "Computed values": [ - "refguide/computed", "refguide/computed-options", "refguide/computed-behavior" ], From 5280827b37f21d808f30727060f12e96c98c00a1 Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Wed, 29 Jul 2020 11:48:35 +0800 Subject: [PATCH 0488/1043] remove `debugger;` --- test/v5/base/map.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 696d4b6ba..9f7e74325 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -616,7 +616,6 @@ test("using deep map - toJS", () => { expect(observed).toBe(1) expect(seen).toEqual([new Map(), new Map([["shoes", []]])]) - debugger store.map_deep.get("shoes").push({ color: "black" }) expect(seen).toEqual([ new Map([]), From 591c58ade326760eb96be3e5ec64255ea7619aae Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 29 Jul 2020 23:38:22 +0100 Subject: [PATCH 0489/1043] combined computed into one --- docs/assets/action-state-view.excalidraw | 414 +++++++++++++++++++++++ docs/assets/action-state-view.png | Bin 9981 -> 417945 bytes docs/assets/autorun.png | Bin 0 -> 317318 bytes docs/assets/computed-example.png | Bin 0 -> 230221 bytes docs/refguide/autorun.md | 23 +- docs/refguide/computed-behavior.md | 150 -------- docs/refguide/computed-options.md | 57 ---- docs/refguide/computed-with-args.md | 81 +++++ docs/refguide/computed.md | 179 +++++----- notes.md | 1 + website/i18n/en.json | 3 + website/sidebars.json | 7 +- 12 files changed, 612 insertions(+), 303 deletions(-) create mode 100644 docs/assets/action-state-view.excalidraw create mode 100644 docs/assets/autorun.png create mode 100644 docs/assets/computed-example.png delete mode 100644 docs/refguide/computed-behavior.md delete mode 100644 docs/refguide/computed-options.md create mode 100644 docs/refguide/computed-with-args.md diff --git a/docs/assets/action-state-view.excalidraw b/docs/assets/action-state-view.excalidraw new file mode 100644 index 000000000..1fbfe2b17 --- /dev/null +++ b/docs/assets/action-state-view.excalidraw @@ -0,0 +1,414 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "pIZO1JmQiFI2poIar1JJR", + "type": "rectangle", + "x": 1265.39453125, + "y": 506.8125, + "width": 169.73437500000006, + "height": 42.90625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 217429890, + "version": 373, + "versionNonce": 1117308162, + "isDeleted": false + }, + { + "id": "pD5v3-2w2hmmHs3ijydzw", + "type": "text", + "x": 1288.564453125, + "y": 513.876953125, + "width": 126, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 258359006, + "version": 335, + "versionNonce": 1677952030, + "isDeleted": false, + "text": "reduceEnergy", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 18 + }, + { + "id": "u7JpBImi1GLSlmI3XfhSo", + "type": "rectangle", + "x": 1016.30859375, + "y": 490.58984375, + "width": 96.56250000000003, + "height": 51.124999999999986, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 1302734018, + "version": 259, + "versionNonce": 1929172162, + "isDeleted": false + }, + { + "id": "BWk9D8NLVXhfJLVv98F7C", + "type": "text", + "x": 1026.07421875, + "y": 500.50390625, + "width": 76, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 1412671326, + "version": 121, + "versionNonce": 1736003678, + "isDeleted": false, + "text": "isHungry", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "4-ymabCsXtPMIqHbdW8oE", + "type": "rectangle", + "x": 531.86328125, + "y": 477.41015625, + "width": 320.26171875000006, + "height": 119.37500000000001, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fa5252", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 500763422, + "version": 549, + "versionNonce": 1668755806, + "isDeleted": false + }, + { + "id": "LKVSistQFQl5dwvDIha03", + "type": "text", + "x": 548.16796875, + "y": 485.490234375, + "width": 74, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 275201474, + "version": 248, + "versionNonce": 399874946, + "isDeleted": false, + "text": "autorun", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 18 + }, + { + "id": "AmfUhwRl3kmfUpDL-cz69", + "type": "arrow", + "x": 893.578125, + "y": 542.67578125, + "width": 103.203125, + "height": 26.18359375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fa5252", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 14401054, + "version": 98, + "versionNonce": 1922705986, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + 103.203125, + -26.18359375 + ] + ], + "lastCommittedPoint": null + }, + { + "id": "5Ri4oSpXCOayASosdJczV", + "type": "rectangle", + "x": 643.65625, + "y": 500.65234375, + "width": 181.6875, + "height": 77.12109375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 958282526, + "version": 72, + "versionNonce": 1344405954, + "isDeleted": false + }, + { + "id": "4VRPEmGVy-I7ISGPIC3lG", + "type": "text", + "x": 697, + "y": 526.712890625, + "width": 75, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 132157534, + "version": 17, + "versionNonce": 1011446622, + "isDeleted": false, + "text": "function", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 18 + }, + { + "id": "FQzAKSjfUWyDZAjvXVOY5", + "type": "text", + "x": 537.37890625, + "y": 429.46484375, + "width": 217, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 1833437214, + "version": 104, + "versionNonce": 499153282, + "isDeleted": false, + "text": "1. autorun runs initially", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "DaIFjPSHk2uPQUxrBhM14", + "type": "text", + "x": 897.24609375, + "y": 434.5, + "width": 197, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 1406985630, + "version": 127, + "versionNonce": 2009028510, + "isDeleted": false, + "text": "2. read & subscribe", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "gdEVREQf-CI_WiOGb0k0p", + "type": "arrow", + "x": 1248.12109375, + "y": 535.2734375, + "width": 117.19921875, + "height": 10.93359375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 419114910, + "version": 39, + "versionNonce": 1265546206, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + -117.19921875, + -10.93359375 + ] + ], + "lastCommittedPoint": null + }, + { + "id": "2L7qtsz980qi281apFm68", + "type": "text", + "x": 1170.65625, + "y": 565.06640625, + "width": 161, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 942371998, + "version": 36, + "versionNonce": 1861058818, + "isDeleted": false, + "text": "3. update state", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "W81Z7ZPQ_NNZj_IpAcRgP", + "type": "arrow", + "x": 1055.921875, + "y": 563.03125, + "width": 283.78515625, + "height": 130.73046875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 93774430, + "version": 90, + "versionNonce": 1080000386, + "isDeleted": false, + "points": [ + [ + 0, + 0 + ], + [ + -169.859375, + 130.73046875 + ], + [ + -283.78515625, + 56.4453125 + ] + ], + "lastCommittedPoint": [ + -283.78515625, + 56.4453125 + ] + }, + { + "id": "7PSGJMcV7z4iygXHJNS_o", + "type": "text", + "x": 966.2265625, + "y": 676.7265625, + "width": 276, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "seed": 775974494, + "version": 50, + "versionNonce": 1448293598, + "isDeleted": false, + "text": "4. notify and re-run autorun", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 18 + } + ], + "appState": { + "viewBackgroundColor": "#ffffff", + "gridSize": null + } +} \ No newline at end of file diff --git a/docs/assets/action-state-view.png b/docs/assets/action-state-view.png index 3db0b78b7d215c3f64d23c9cc89c5856a1e0d119..6238041a1366dc02a75656f8d7ba8d7b19c5b0b1 100644 GIT binary patch literal 417945 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

    +
    `observer` and `React.memo`? +`observer` automatically applies `memo`, so `observer` components never need to be wrapped in `memo`. +`memo` can be applied safely to observer components because mutations (deeply) inside the props will be picked up by `observer` anyway if relevant. +
    +
    Tip: `observer` for class based React components diff --git a/website/i18n/en.json b/website/i18n/en.json index 7a454c55b..b942ebca5 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -51,10 +51,6 @@ "LINKS": { "title": "LINKS" }, - "react/react-class-components": { - "title": "React class components", - "sidebar_label": "React class components" - }, "react/react-integration": { "title": "React integration", "sidebar_label": "React integration" @@ -63,10 +59,6 @@ "title": "Optimizing rendering React components", "sidebar_label": "Optimizing React components" }, - "react/react-pitfalls": { - "title": "MobX and React pitfalls", - "sidebar_label": "MobX and React pitfalls" - }, "README": { "title": "Introduction", "sidebar_label": "Introduction" From 1d158694e484b0a62c8aa2379785d135cdab6c17 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 5 Aug 2020 00:38:40 +0100 Subject: [PATCH 0492/1043] Cleaned up main menu, merged some pages --- .../spy.md => best/debugging-mobx.md} | 94 ++++++++++++++- docs/best/decorators.md | 2 +- docs/best/trace.md | 59 --------- docs/best/what-does-mobx-react-to.md | 2 +- docs/faq/faq.md | 114 ------------------ docs/faq/migrate-to-6.md | 2 +- docs/react/react-performance.md | 4 +- docs/refguide/api.md | 89 +++++++++++++- docs/refguide/computed-with-args.md | 2 +- docs/refguide/configure.md | 6 +- docs/refguide/extending.md | 49 +++++++- docs/refguide/internals.md | 81 ------------- docs/refguide/introspection-utils.md | 44 ------- docs/refguide/mobx-utils.md | 4 +- docs/refguide/object-api.md | 4 +- docs/refguide/observe.md | 10 +- docs/refguide/on-become-observed.md | 5 +- docs/refguide/tojs.md | 9 ++ docs/refguide/tojson.md | 37 ------ notes.md | 2 + website/i18n/en.json | 55 +++------ website/sidebars.json | 33 ++--- 22 files changed, 290 insertions(+), 417 deletions(-) rename docs/{refguide/spy.md => best/debugging-mobx.md} (52%) delete mode 100644 docs/best/trace.md delete mode 100644 docs/faq/faq.md delete mode 100644 docs/refguide/internals.md delete mode 100644 docs/refguide/introspection-utils.md create mode 100644 docs/refguide/tojs.md delete mode 100644 docs/refguide/tojson.md diff --git a/docs/refguide/spy.md b/docs/best/debugging-mobx.md similarity index 52% rename from docs/refguide/spy.md rename to docs/best/debugging-mobx.md index b94754523..d7badded4 100644 --- a/docs/refguide/spy.md +++ b/docs/best/debugging-mobx.md @@ -1,11 +1,101 @@ --- -sidebar_label: spy [🚀] -title: Spy +sidebar_label: Analyzing reactivity 🚀 hide_title: true --- +# Debugging MobX [🚀] + +# Using `trace` for debugging + +Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. + +It can be used by simply importing `import { trace } from "mobx"`, and then put it inside a reaction or computed value. +It will print why it is re-evaluating the current derivation. + +Optionally it is possible to automatically enter the debugger by passing `true` as last argument. +This way the exact mutation that causes the reaction to re-run is still in stack, usually ~8 stack frames up. See the image below. + +In debugger mode, the debug information will also reveal the full derivation tree that is affecting the current computation / reaction. + +![trace](../assets/trace-tips2.png) + +![trace](../assets/trace.gif) + +## Live examples + +[Simple CodeSandbox `trace` example](https://codesandbox.io/s/trace-dnhbz?file=/src/index.js:309-338) + +Here's a deployed example for exploring the stack: https://csb-nr58ylyn4m-hontnuliaa.now.sh/ +Be sure to play with chrome debugger's blackbox feature! + +## Usage examples + +There are different ways of calling `trace()`, some examples: + +```javascript +import { observer } from "mobx-react" +import { trace } from "mobx" + +const MyComponent = observer(() => { + trace(true) // enter the debugger whenever an observable value causes this component to re-run + return
    {this.props.user.name} +}) +``` + +Enable trace by using the `reaction` argument of an reaction / autorun: + +```javascript +mobx.autorun("logger", reaction => { + reaction.trace() + console.log(user.fullname) +}) +``` + +Pass in the property name of a computed property: + +```javascript +trace(user, "fullname") +``` + +# Introspection APIs + +The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. +Also relevant are [`toJS`](tojson.md) and the various [`isObservable*` APIs](api.md#isobservable). + +### `getDebugName` + +Usage: + +- `getDebugName(thing, property?)` + +Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). + +### `getDependencyTree` + +Usage: + +- `getDependencyTree(thing, property?)`. + +Returns a tree structure with all observables the given reaction / computation currently depends upon. + +### `getObserverTree` + +Usage: + +- `getObserverTree(thing, property?)`. + +Returns a tree structure with all reactions / computations that are observing the given observable. + +### `getAtom` + +[🚀] Usage: + +- `getAtom(thing, property?)`. + +Returns the backing _Atom_ of a given observable object, property, reaction etc. + # Spy [🚀] Usage: diff --git a/docs/best/decorators.md b/docs/best/decorators.md index 7d6f10855..27ba2aafb 100644 --- a/docs/best/decorators.md +++ b/docs/best/decorators.md @@ -1,5 +1,5 @@ --- -sidebar_label: Decorators in MobX [🚀] +sidebar_label: Enabling decorators 🚀 hide_title: true --- diff --git a/docs/best/trace.md b/docs/best/trace.md deleted file mode 100644 index 8f04c65d6..000000000 --- a/docs/best/trace.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -sidebar_label: Using trace for debugging -title: Using `trace` for debugging -hide_title: true ---- - - - -# Using `trace` for debugging - -Trace is a small utility that helps to find out why your computed values, reactions or components are re-evaluating. - -It can be used by simply importing `import { trace } from "mobx"`, and then put it inside a reaction or computed value. -It will print why it is re-evaluating the current derivation. - -Optionally it is possible to automatically enter the debugger by passing `true` as last argument. -This way the exact mutation that causes the reaction to re-run is still in stack, usually ~8 stack frames up. See the image below. - -In debugger mode, the debug information will also reveal the full derivation tree that is affecting the current computation / reaction. - -![trace](../assets/trace-tips2.png) - -![trace](../assets/trace.gif) - -## Live examples - -[Simple CodeSandbox `trace` example](https://codesandbox.io/s/trace-dnhbz?file=/src/index.js:309-338) - -Here's a deployed example for exploring the stack: https://csb-nr58ylyn4m-hontnuliaa.now.sh/ -Be sure to play with chrome debugger's blackbox feature! - -## Usage examples - -There are different ways of calling `trace()`, some examples: - -```javascript -import { observer } from "mobx-react" -import { trace } from "mobx" - -const MyComponent = observer(() => { - trace(true) // enter the debugger whenever an observable value causes this component to re-run - return
    {this.props.user.name} -}) -``` - -Enable trace by using the `reaction` argument of an reaction / autorun: - -```javascript -mobx.autorun("logger", reaction => { - reaction.trace() - console.log(user.fullname) -}) -``` - -Pass in the property name of a computed property: - -```javascript -trace(user, "fullname") -``` diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 7df7ee532..62fd11bb8 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -1,5 +1,5 @@ --- -sidebar_label: Understanding MobX +sidebar_label: Understanding reactivity hide_title: true --- diff --git a/docs/faq/faq.md b/docs/faq/faq.md deleted file mode 100644 index d5f70972a..000000000 --- a/docs/faq/faq.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -sidebar_label: Frequently Asked Questions -title: FAQ -hide_title: true ---- - - - -## FAQ - -##### Which browsers are supported? - -MobX works in any ES5 environment, which includes browsers and NodeJS. - -There are some [limitations](../best/limitations-without-proxies.md) for -environments that do not support `Proxy` (modern browsers -all support `Proxy`). - -##### Is MobX a framework? - -MobX gives you a lot of freedom in how you structure your code, where to store state or how to process events. It might free you from frameworks that pose all kinds of restrictions on your code in the name of performance. - -For state management frameworks built with MobX that offer advanced features, see [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/). - -##### Is React Native supported? - -Yes, `mobx` and `mobx-react` will work on React Native. The latter through importing `"mobx-react/native"`. -The devtools don't support React Native. - -##### Where can I find more MobX resources? - -We've compiled a large list of helpful resources of all types in the [official awesome list](https://github.com/mobxjs/awesome-mobx#awesome-mobx). If you feel it's missing something, please open an [issue](https://github.com/mobxjs/awesome-mobx/issues/new) or [pull request](https://github.com/mobxjs/awesome-mobx/compare) to describe what you're looking for or share your added links :). - -#### Does MobX have TypeScript support? - -It works out of the box. MobX is written with TypeScript and type definitions are built-in. - -##### While using Typescript I get `error TS2304: Cannot find name 'AsyncGenerator'` - -Edit your `tsconfig.json` and ensure your `lib` section array includes `es2018.asynciterable` or one of its super-sets (e.g. `es2018` or `esnext`). Note that this won't affect code generation in anyway, it just affects the standard type definitions the Typescript compiler will use, which should be a safe change. If your `tsconfig.json` does not include a lib section the defaults are: - -- ES5 target: DOM,ES5,ScriptHost -- ES6 target: DOM,ES6,DOM.Iterable,ScriptHost - -So you'd need to add `es2018.asynciterable` to those defaults in this particular case. - -#### Importing from wrong location - -Because MobX ships with typescript typings out of the box, some import autocompleting tools (at least in VSCode) have the habit of auto completing with a wrong import, like - -```javascript -// wrong -import { observable } from "mobx/lib/mobx" -``` - -This is incorrect but will not always immediately lead to runtime errors. So be aware. The only correct way of importing anything from the `mobx` package is: - -```javascript -// correct -import { observable } from "mobx" -``` - -#### Does MobX have Flow typing support? - -MobX ships with [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js). Flow will automatically include them when you import mobx modules. Although you **do not** need to import the types explicitly, you can still do it like this: `import type { ... } from 'mobx'`. - -To use the [flow typings](https://github.com/mobxjs/mobx/blob/master/flow-typed/mobx.js) shipped with MobX: - -- In `.flowconfig`, you **cannot** ignore `node_modules`. -- In `.flowconfig`, you **cannot** import it explicitly in the `[libs]` section. -- You **do not** need to install library definition using [flow-typed](https://github.com/flowtype/flow-typed). - -##### Can I combine MobX with Flux / Redux? - -You don't need to. - -MobX already optimizes rendering, and it works with most kinds of data, including cycles and classes. So other programming paradigms like classic MVC can now be easily applied in applications that combine ReactJS with MobX. - -[🚀] Flux implementations that do not work with the requirement that the data in their stores is immutable should work well with MobX. Redux does have this immutability requirement. Note that both mobx-state-tree and mobx-keystone add additional constraints to support better integration with Redux. - -##### How does MobX compare to other Reactive frameworks? - -[🚀] See this [issue](https://github.com/mobxjs/mobx/issues/18) for some considerations. - -##### Can I record states and re-hydrate them? - -The frameworks built on top of MobX [mobx-state-tree](https://mobx-state-tree.js.org/) and [mobx-keystone](https://mobx-keystone.js.org/) can both do this for you. - -[🚀] To roll your own, [createTransformer in mobx-utils](https://github.com/mobxjs/mobx-utils) has some examples. - -##### Can MobX be combined with RxJS? - -[🚀] Yes, you can use [toStream and fromStream from mobx-utils](https://github.com/mobxjs/mobx-utils#tostream) to use RXJS and other TC 39 compatible observables with mobx. - -##### When to use RxJS instead of MobX? - -[🚀] For anything that involves explictly working with the concept of time, -or when you need to reason about the historical values / events of an observable (and not just the latest), RxJs is recommended as it provides more low-level primitives. -Whenever you want to react to _state_ instead of _events_, MobX offers an easier and more high-level approach. -In practice, combining RxJS and MobX might result in really powerful constructions. -Use for example RxJS to process and throttle user events and as a result of that update the state. -If the state has been made observable by MobX, it will then take care of updating the UI and other derivations accordingly. - -##### Can I use MobX together with framework X? - -Probably. -MobX is framework agnostic and can be applied in any modern JS environment. -It just ships with a small function to transform ReactJS components into reactive view functions for convenience. -MobX works just as well server side, and is already combined with jQuery (see this [Fiddle](http://jsfiddle.net/mweststrate/vxn7qgdw)) and [Deku](https://gist.github.com/mattmccray/d8740ea97013c7505a9b). - -##### Can you tell me how it works? - -[🚀] Sure, join the [gitter chat](https://gitter.im/mobxjs/mobx) or check out the code. Or, submit an issue to motivate me to make some nice drawings :). -And look at this [Medium article](https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254). diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index 45f9d6b6f..a41e1c570 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -1,5 +1,5 @@ --- -sidebar_label: Migrating to MobX 6 [🚀] +sidebar_label: Migrating from MobX 4/5 🚀 hide_title: true --- diff --git a/docs/react/react-performance.md b/docs/react/react-performance.md index 91477dd62..3beb29623 100644 --- a/docs/react/react-performance.md +++ b/docs/react/react-performance.md @@ -1,6 +1,6 @@ --- -sidebar_label: Optimizing React components -title: Optimizing rendering React components +sidebar_label: Optimizing React +title: Optimizing React components hide_title: true --- diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 69def7894..b4b39231c 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -8,6 +8,8 @@ hide_title: true # MobX API Reference +Functions marked with '🚀' should typically not be needed. + # Core API _These are the most important MobX API's._ @@ -309,9 +311,29 @@ More, less trivial utilities can be found in the [mobx-utils](https://github.com ### `toJS` -Converts observable data structures back to plain javascript objects, ignoring computed values. +Usage: + +`toJS(value)` + +Recursively converts an (observable) object to a javascript _structure_. +Supports observable arrays, objects, maps and primitives. +Computed values and other non-enumerable properties won't be part of the result. +Cycles are detected and properly supported by default, but this can be disabled to improve performance. + +`toJS` accepts three options + +For more complex (de)serialization scenario's it is recommended to give classes a (computed) `toJSON` method, or use a serialization library like [serializr](https://github.com/mobxjs/serializr) + +```javascript +const obj = mobx.observable({ + x: 1 +}) + +const clone = mobx.toJS(obj) -[«details»](tojson.md) +console.log(mobx.isObservableObject(obj)) // true +console.log(mobx.isObservableObject(clone)) // false +``` ### `isArrayLike` @@ -480,12 +502,69 @@ Returns the backing atom. ### `transaction` -Wrap code in a transaction. +Usage 🚀: + +- `transaction(worker: () => any)` + +_Transaction is a low-level api, it is recommended to use [`action`](#action) / [`runInAction`](#runinaction) instead_ + +`transaction` can be used to batch a bunch of updates without notifying any observers until the end of the transaction. Like `untracked`, it is automatically applied by `action`, so usually it makes more sense to use actions than to use `transaction` directly. + +`transaction` takes a single, parameterless `worker` function as argument and runs it. +No observers are notified until this function has completed. +`transaction` returns any value that was returned by the `worker` function. +Note that `transaction` runs completely synchronously. +Transactions can be nested. Only after completing the outermost `transaction` pending reactions will be run. + +```javascript +import { observable, transaction, autorun } from "mobx" + +const numbers = observable([]) -[«trace»](internals.md#transaction) +autorun(() => console.log(numbers.length, "numbers!")) +// Prints: '0 numbers!' + +transaction(() => { + transaction(() => { + numbers.push(1) + numbers.push(2) + }) + numbers.push(3) +}) +// Prints: '3 numbers!' +``` ### `untracked` +Usage 🚀: + +- `untracked(worker: () => any)` + +_Untracked is a low-level api, it is recommended to use `action`](#action) / [`runInAction`](#runinaction) instead_ + Untracked allows you to run a piece of code without establishing observers. +Like `transaction`, `untracked` is automatically applied by `action`, so usually it makes more sense to use actions than to use `untracked` directly. +Example: -[«trace»](internals.md#untracked) +```javascript +const person = observable({ + firstName: "Michel", + lastName: "Weststrate" +}) + +autorun(() => { + console.log( + person.lastName, + ",", + // this untracked block will return the person's firstName without establishing a dependency + untracked(() => person.firstName) + ) +}) +// prints: Weststrate, Michel + +person.firstName = "G.K." +// doesn't print! + +person.lastName = "Chesterton" +// prints: Chesterton, G.K. +``` diff --git a/docs/refguide/computed-with-args.md b/docs/refguide/computed-with-args.md index e6e654f07..875e0004d 100644 --- a/docs/refguide/computed-with-args.md +++ b/docs/refguide/computed-with-args.md @@ -1,6 +1,6 @@ --- title: Computeds with arguments -sidebar_label: Computeds with arguments [🚀] +sidebar_label: Computeds with arguments 🚀 hide_title: true --- diff --git a/docs/refguide/configure.md b/docs/refguide/configure.md index 42c65355a..b4903f426 100644 --- a/docs/refguide/configure.md +++ b/docs/refguide/configure.md @@ -1,6 +1,6 @@ --- title: Configuring MobX -sidebar_label: Configuring MobX [🚀] +sidebar_label: Configuring MobX 🚀 hide_title: true --- @@ -42,6 +42,10 @@ Note: Proxies cannot be polyfilled. Even though polyfills do exist, they don't s 1. Observable arrays are not real arrays, so they won't pass the `Array.isArray()` check. The practical consequence is that you often need to `.slice()` the array first (to get a real array shallow copy) before passing to third party libraries. For example using observable arrays in concat arrays doesn't work as expected. So '.slice()' them first. 2. Adding or deleting properties to existing observable plain objects after creation is not automatically picked up. If you intend to use objects as index based lookup maps, in other words, as dymamic collection of things, use observable maps instead. +Note that it is possible to add properties dynamically to objects, and detect their addition, even when Proxies aren't enabled. +This can be achieved by using the [collection utilities](object-api.md); make sure that (new) properties are set using the `set` utility, and that the objects are iterated using one of the `values` / `keys` or `entries` utilities, rather than the build-in JavaScript mechanisms. +But, since this is really easy to forget, we do recommend to use observable maps instead if possible. + ## Decorator support For enabling experimental decorator support see [Decorators](../best/decorators). diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index c6135ed18..7fce4e363 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -1,11 +1,11 @@ --- -sidebar_label: New observable types [🚀] +sidebar_label: Custom observables 🚀 hide_title: true --- -# Creating new observable types [🚀] +# Creating custom observables [🚀] ## Atoms @@ -88,3 +88,48 @@ disposer() // printing stops. If nobody else uses the same `clock` the clock will stop ticking as well. ``` + +# `onBecomeObserved` and `onBecomeUnobserved` [🚀] + +Usage: + +- `onBecomeObserved(observable, property?, listener: () => void): (() => void)` +- `onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` + +These functions are hooks into the observability system of MobX and get notified when observables _start_ / _stop_ becoming observed. It can be used to execute some lazy operations or perform network fetches. + +The return value is a _diposer-function_ that will detach the _listener_. + +```javascript +export class City { + location + temperature + interval + + constructor(location) { + makeAutoObservable(this, { + resume: false, + suspend: false + }) + this.location = location + // only start data fetching if temperature is actually used! + onBecomeObserved(this, "temperature", this.resume) + onBecomeUnobserved(this, "temperature", this.suspend) + } + + resume = () => { + log(`Resuming ${this.location}`) + this.interval = setInterval(() => this.fetchTemperature(), 5000) + } + + suspend = () => { + log(`Suspending ${this.location}`) + this.temperature = undefined + clearInterval(this.interval) + } + + fetchTemperature = flow(function* () { + // data fetching logic + }) +} +``` diff --git a/docs/refguide/internals.md b/docs/refguide/internals.md deleted file mode 100644 index 99a231851..000000000 --- a/docs/refguide/internals.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Internal functions -sidebar_label: Internal functions [🚀] -hide_title: true ---- - - - -# Internal functions [🚀] - -The following methods are all used internally by MobX, and might come in handy in rare cases. But usually MobX offers more declarative alternatives to tackle the same problem. They might come in handy though if you try to extend MobX. - -## `transaction` - -_Transaction is a low-level api, it is recommended to use actions instead_ - -Usage: - -- `transaction(worker: () => any)` - -`transaction` can be used to batch a bunch of updates without notifying any observers until the end of the transaction. Like `untracked`, it is automatically applied by `action`, so usually it makes more sense to use actions than to use `transaction` directly. - -`transaction` takes a single, parameterless `worker` function as argument and runs it. -No observers are notified until this function has completed. -`transaction` returns any value that was returned by the `worker` function. -Note that `transaction` runs completely synchronously. -Transactions can be nested. Only after completing the outermost `transaction` pending reactions will be run. - -```javascript -import { observable, transaction, autorun } from "mobx" - -const numbers = observable([]) - -autorun(() => console.log(numbers.length, "numbers!")) -// Prints: '0 numbers!' - -transaction(() => { - transaction(() => { - numbers.push(1) - numbers.push(2) - }) - numbers.push(3) -}) -// Prints: '3 numbers!' -``` - -## `untracked` - -Untracked allows you to run a piece of code without establishing observers. -Like `transaction`, `untracked` is automatically applied by `action`, so usually it makes more sense to use actions than to use `untracked` directly. -Example: - -```javascript -const person = observable({ - firstName: "Michel", - lastName: "Weststrate" -}) - -autorun(() => { - console.log( - person.lastName, - ",", - // this untracked block will return the person's firstName without establishing a dependency - untracked(() => person.firstName) - ) -}) -// prints: Weststrate, Michel - -person.firstName = "G.K." -// doesn't print! - -person.lastName = "Chesterton" -// prints: Chesterton, G.K. -``` - -## `createAtom` - -Utility function that can be used to create your own observable data structures and hook them up to MobX. -Used internally by all observable data types. - -[«details»](extending.md) diff --git a/docs/refguide/introspection-utils.md b/docs/refguide/introspection-utils.md deleted file mode 100644 index 2b59c409a..000000000 --- a/docs/refguide/introspection-utils.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Introspection APIs -sidebar_label: Introspection APIs -hide_title: true ---- - - - -# Introspection APIs - -The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. -Also relevant are [`toJS`](tojson.md) and the various [`isObservable*` APIs](api.md#isobservable). - -### `getDebugName` - -Usage: - -- `getDebugName(thing, property?)` - -Returns a (generated) friendly debug name of an observable object, property, reaction etc. Used by for example the [MobX developer tools](https://github.com/mobxjs/mobx-devtools). - -### `getDependencyTree` - -Usage: - -- `getDependencyTree(thing, property?)`. - -Returns a tree structure with all observables the given reaction / computation currently depends upon. - -### `getObserverTree` - -Usage: - -- `getObserverTree(thing, property?)`. - -Returns a tree structure with all reactions / computations that are observing the given observable. - -### `getAtom` - -[🚀] Usage: - -- `getAtom(thing, property?)`. - -Returns the backing _Atom_ of a given observable object, property, reaction etc. diff --git a/docs/refguide/mobx-utils.md b/docs/refguide/mobx-utils.md index 0e16bf871..9f41bbe61 100644 --- a/docs/refguide/mobx-utils.md +++ b/docs/refguide/mobx-utils.md @@ -1,6 +1,6 @@ --- title: mobx-utils -sidebar_label: mobx-utils [🚀] +sidebar_label: mobx-utils 🚀 hide_title: true --- @@ -8,4 +8,4 @@ hide_title: true # mobx-utils [🚀] -[MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions and common patterns for MobX. +[MobX-utils](https://github.com/mobxjs/mobx-utils) provides an extensive series of additional utility functions, observables and common patterns for MobX. diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index 4f6403a5a..f366552c9 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -1,5 +1,5 @@ --- -sidebar_label: Object API [🚀] +sidebar_label: Collection utilities 🚀 hide_title: true --- @@ -11,6 +11,8 @@ The Object API is a utility API that enables manipulating observable maps, objec These APIs are fully reactive, which means that even [without `Proxy` support](../best/limitations-without-proxies.md) new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. +Another benefit of `values`, `keys` and `entries` is that they return array rather than iterators, which makes it possible to, for example, immediately call `.map(fn)` on the result. + Access: - `values(thing)` returns all values in the collection as array diff --git a/docs/refguide/observe.md b/docs/refguide/observe.md index c89b424ce..7bf0259d7 100644 --- a/docs/refguide/observe.md +++ b/docs/refguide/observe.md @@ -1,11 +1,13 @@ --- -sidebar_label: intercept & observe [🚀] +sidebar_label: Intercept & Observe 🚀 hide_title: true --- -# Intercept & Observe [🚀] +# Intercept & Observe 🚀 + +_Warning: intercept and observe are low level utilities, and should not be needed in practice. Use some form of [reaction](autorun.md) instead. For example `observe` doesn't respect transactions, and doesn't support deep observing changes. Using those utilities is an anti-pattern. If you intend to use `observe` to get access to the old- and new value, use [`reaction`](api.md#reaction) instead._ `observe` and `intercept` can be used to monitor the changes of a single observable (they **_don't_** track nested observables). @@ -17,6 +19,8 @@ hide_title: true Usage: `intercept(target, propertyName?, interceptor)` +_Please avoid this API, it basically provides a bit of aspect-oriented programming, creating flows that are really hard to debug. Rather, do things like data-validation *before* updating any state, rather than during._ + - `target`: the observable to guard - `propertyName`: optional parameter to specify a specific property to intercept. Note that `intercept(user.name, interceptor)` is fundamentally different from `intercept(user, "name", interceptor)`. The first tries to add an interceptor to the _current_ `value` inside `user.name` (which might not be an observable at all), the latter intercepts changes to the `name` _property_ of `user`. - `interceptor`: callback that is invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation. @@ -64,6 +68,8 @@ const disposer = intercept(theme, "backgroundColor", change => { Usage: `observe(target, propertyName?, listener, invokeImmediately?)` +_See above notice, please avoid this API, and use `reaction` instead_ + - `target`: the observable to observe - `propertyName`: optional parameter to specify a specific property to observe. Note that `observe(user.name, listener)` is fundamentally different from `observe(user, "name", listener)`. The first observes the _current_ `value` inside `user.name` (which might not be an observable at all), the latter observes the `name` _property_ of `user`. - `listener`: callback that will be invoked for _each_ change that is made to the observable. Receives a single change object describing the mutation, except for boxed observables, which will invoke the `listener` two parameters: `newValue, oldValue`. diff --git a/docs/refguide/on-become-observed.md b/docs/refguide/on-become-observed.md index c79bda44e..c54c4ca29 100644 --- a/docs/refguide/on-become-observed.md +++ b/docs/refguide/on-become-observed.md @@ -1,18 +1,19 @@ --- title: onBecomeObserved -sidebar_label: onBecomeObserved [🚀] +sidebar_label: Lazy observables 🚀 hide_title: true --- -# `onBecomeObserved` and `onBecomeUnobserved` [🚀] +# Creating lazy observables [🚀] Usage: - `onBecomeObserved(observable, property?, listener: () => void): (() => void)` - `onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` +The functions `onBecomeObserved` and `onBecomeUnobserved` can be used to attach lazy behavior or side-effects to existing observables. These functions are hooks into the observability system of MobX and get notified when observables _start_ / _stop_ becoming observed. It can be used to execute some lazy operations or perform network fetches. The return value is a _diposer-function_ that will detach the _listener_. diff --git a/docs/refguide/tojs.md b/docs/refguide/tojs.md new file mode 100644 index 000000000..0e641ca32 --- /dev/null +++ b/docs/refguide/tojs.md @@ -0,0 +1,9 @@ +--- +sidebar_label: toJS +title: toJS +hide_title: true +--- + + + +# toJS diff --git a/docs/refguide/tojson.md b/docs/refguide/tojson.md deleted file mode 100644 index b96531d7f..000000000 --- a/docs/refguide/tojson.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -sidebar_label: toJS -title: toJS -hide_title: true ---- - - - -# toJS - -`toJS(value, options?)` - -Recursively converts an (observable) object to a javascript _structure_. -Supports observable arrays, objects, maps and primitives. -Computed values and other non-enumerable properties won't be part of the result. -Cycles are detected and properly supported by default, but this can be disabled to improve performance. - -`toJS` accepts three options - -1. `exportMapsAsObjects` whether to serialize observable maps to objects (`true`) or javascript Map objects (`false`) default `true`. -2. `detectCycles` if a cycle is detected, reuse the already serialized object. Which prevents endless recursion. Default `true`. -3. `recurseEverything` detects and converts observable objects that are "behind" non-observable objects. - -For more complex (de)serialization scenario's, one can use [serializr](https://github.com/mobxjs/serializr) - -```javascript -const obj = mobx.observable({ - x: 1 -}) - -const clone = mobx.toJS(obj) - -console.log(mobx.isObservableObject(obj)) // true -console.log(mobx.isObservableObject(clone)) // false -``` - -Note: this method was named `toJSON` before MobX 2.2 diff --git a/notes.md b/notes.md index cfe681433..f98383e2b 100644 --- a/notes.md +++ b/notes.md @@ -68,6 +68,7 @@ - [ ] make `onReactionError` an option for `configure` - [ ] investigate the onbecomeunobserved issue - [ ] support `flow` and `computedFn` as annotation + - [ ] make second arg of reaction effect the old value - [ ] docs - [ ] clean up docs - [ ] fix interactive tut @@ -78,6 +79,7 @@ - [ ] make details section collapsible - [ ] better sel page - [ ] link flutter, lit, angular + - [ ] update footer - [ ] mobx-react - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use diff --git a/website/i18n/en.json b/website/i18n/en.json index b942ebca5..b0ce6c93f 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -8,9 +8,13 @@ "backers-sponsors": { "title": "MobX Backers and Sponsors" }, + "best/debugging-mobx": { + "title": "best/debugging-mobx", + "sidebar_label": "Analyzing reactivity 🚀" + }, "best/decorators": { "title": "best/decorators", - "sidebar_label": "Decorators in MobX [🚀]" + "sidebar_label": "Enabling decorators 🚀" }, "best/stateless-HMR": { "title": "Hot Module Reloading with Stateless Components", @@ -20,21 +24,13 @@ "title": "Best Practices for building large scale maintainable projects", "sidebar_label": "Defining data stores" }, - "best/trace": { - "title": "Using `trace` for debugging", - "sidebar_label": "Using trace for debugging" - }, "best/what-does-mobx-react-to": { "title": "best/what-does-mobx-react-to", - "sidebar_label": "Understanding MobX" - }, - "faq/faq": { - "title": "FAQ", - "sidebar_label": "Frequently Asked Questions" + "sidebar_label": "Understanding reactivity" }, "faq/migrate-to-6": { "title": "faq/migrate-to-6", - "sidebar_label": "Migrating to MobX 6 [🚀]" + "sidebar_label": "Migrating from MobX 4/5 🚀" }, "intro/concepts": { "title": "The gist of MobX", @@ -56,8 +52,8 @@ "sidebar_label": "React integration" }, "react/react-performance": { - "title": "Optimizing rendering React components", - "sidebar_label": "Optimizing React components" + "title": "Optimizing React components", + "sidebar_label": "Optimizing React" }, "README": { "title": "Introduction", @@ -77,7 +73,7 @@ }, "refguide/computed-with-args": { "title": "Computeds with arguments", - "sidebar_label": "Computeds with arguments [🚀]" + "sidebar_label": "Computeds with arguments 🚀" }, "refguide/computed": { "title": "Derive information with computed", @@ -85,23 +81,15 @@ }, "refguide/configure": { "title": "Configuring MobX", - "sidebar_label": "Configuring MobX [🚀]" + "sidebar_label": "Configuring MobX 🚀" }, "refguide/extending": { "title": "refguide/extending", - "sidebar_label": "New observable types [🚀]" - }, - "refguide/internals": { - "title": "Internal functions", - "sidebar_label": "Internal functions [🚀]" - }, - "refguide/introspection-utils": { - "title": "Introspection APIs", - "sidebar_label": "Introspection APIs" + "sidebar_label": "Custom observables 🚀" }, "refguide/mobx-utils": { "title": "mobx-utils", - "sidebar_label": "mobx-utils [🚀]" + "sidebar_label": "mobx-utils 🚀" }, "refguide/modifiers": { "title": "Observable modifiers", @@ -109,7 +97,7 @@ }, "refguide/object-api": { "title": "refguide/object-api", - "sidebar_label": "Object API [🚀]" + "sidebar_label": "Collection utilities 🚀" }, "refguide/object": { "title": "Observable Objects", @@ -121,21 +109,17 @@ }, "refguide/observe": { "title": "refguide/observe", - "sidebar_label": "intercept & observe [🚀]" + "sidebar_label": "Intercept & Observe 🚀" }, "refguide/on-become-observed": { "title": "onBecomeObserved", - "sidebar_label": "onBecomeObserved [🚀]" + "sidebar_label": "Lazy observables 🚀" }, "refguide/set": { "title": "Observable Sets", "sidebar_label": "sets" }, - "refguide/spy": { - "title": "Spy", - "sidebar_label": "spy [🚀]" - }, - "refguide/tojson": { + "refguide/tojs": { "title": "toJS", "sidebar_label": "toJS" } @@ -150,11 +134,8 @@ "Introduction": "Introduction", "MobX core": "MobX core", "MobX and React": "MobX and React", - "Effects for observables": "Effects for observables", - "Debugging MobX": "Debugging MobX", - "Utilities": "Utilities", "Tips & Tricks": "Tips & Tricks", - "Extending MobX": "Extending MobX" + "Configuring MobX": "Configuring MobX" } }, "pages-strings": { diff --git a/website/sidebars.json b/website/sidebars.json index ff7e53074..0f4faeb32 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -15,33 +15,22 @@ "MobX and React": [ "react/react-integration" ], - "Effects for observables": [ + "Tips & Tricks": [ "best/what-does-mobx-react-to", - "refguide/observe", - "refguide/on-become-observed" - ], - "Debugging MobX": [ - "best/trace", - "refguide/introspection-utils", - "refguide/spy" - ], - "Utilities": [ - "refguide/tojson", + "best/debugging-mobx", + "best/store", + "react/react-performance", + "refguide/mobx-utils", "refguide/object-api", - "refguide/mobx-utils" + "refguide/computed-with-args", + "refguide/extending", + "refguide/on-become-observed", + "refguide/observe" ], - "Tips & Tricks": [ - "react/react-performance", + "Configuring MobX": [ "refguide/configure", "best/decorators", - "best/store", - "faq/migrate-to-6", - "faq/faq", - "refguide/computed-with-args" - ], - "Extending MobX": [ - "refguide/extending", - "refguide/internals" + "faq/migrate-to-6" ] } } From 908549695be88a2f3e8366e35b6f6e3cc6e8e9ba Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Wed, 5 Aug 2020 14:07:45 +0800 Subject: [PATCH 0493/1043] fix: BLM covers the search input in mobile (#2421) --- website/static/css/custom.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/website/static/css/custom.css b/website/static/css/custom.css index eadedfc02..144b9e9a2 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -87,6 +87,13 @@ details[open] > summary { font-weight: bold; } +@media (max-width: 480px) { + .slidingNav::before { + text-align: left; + padding-left: 60px; + } +} + /* Carbon */ #carbonads { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, From c89d5b81a04e616c13b94d9b80ba9c5fe61395b9 Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Wed, 5 Aug 2020 14:08:29 +0800 Subject: [PATCH 0494/1043] fix: log doesn't align with other section of the footer(#2413) (#2420) --- website/static/css/custom.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 144b9e9a2..9bda40d15 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -15,6 +15,12 @@ article p img { @media only screen and (min-device-width: 360px) and (max-device-width: 736px) { } +@media only screen and (max-width: 735px) { + .nav-footer .sitemap .nav-home { + margin-left: -10px; + } +} + @media only screen and (min-width: 1024px) { } From 7b77af2a7bac595e031a3f870fee6b6732cf519a Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Thu, 6 Aug 2020 02:04:40 +0800 Subject: [PATCH 0495/1043] cache getKeys() of ObservableObjectAdministration (#2410) * cache getKeys() of ObservableObjectAdministration * Avoid user modification --- src/types/observableobject.ts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/types/observableobject.ts b/src/types/observableobject.ts index f9b316d47..e5fab6662 100644 --- a/src/types/observableobject.ts +++ b/src/types/observableobject.ts @@ -80,6 +80,8 @@ export class ObservableObjectAdministration interceptors_ proxy_: any private pendingKeys_: undefined | Map> + private keysValue_: PropertyKey[] = [] + private isStaledKeysValue_ = true constructor( public target_: any, @@ -220,7 +222,7 @@ export class ObservableObjectAdministration const oldValue = oldObservable && oldObservable.get() oldObservable && oldObservable.set(undefined) // notify key and keyset listeners - this.keysAtom_.reportChanged() + this.reportKeysChanged() this.values_.delete(key) if (this.pendingKeys_) { const entry = this.pendingKeys_.get(key) @@ -280,15 +282,26 @@ export class ObservableObjectAdministration const entry = this.pendingKeys_.get(key) if (entry) entry.set(true) } - this.keysAtom_.reportChanged() + this.reportKeysChanged() } getKeys_(): PropertyKey[] { this.keysAtom_.reportObserved() + if (!this.isStaledKeysValue_) { + return this.keysValue_ + } // return Reflect.ownKeys(this.values) as any - const res: PropertyKey[] = [] - for (const [key, value] of this.values_) if (value instanceof ObservableValue) res.push(key) - return res + this.keysValue_ = [] + for (const [key, value] of this.values_) + if (value instanceof ObservableValue) this.keysValue_.push(key) + if (__DEV__) Object.freeze(this.keysValue_) + this.isStaledKeysValue_ = false + return this.keysValue_ + } + + private reportKeysChanged() { + this.isStaledKeysValue_ = true + this.keysAtom_.reportChanged() } } From f6b65b0f87bdc3dd40bab6908c1bc83155292438 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 5 Aug 2020 20:35:50 +0100 Subject: [PATCH 0496/1043] `reaction` effect now receives the previous value as second argument --- docs/faq/migrate-to-6.md | 3 +++ docs/refguide/autorun.md | 2 +- notes.md | 13 +++++++++---- src/api/autorun.ts | 12 +++++++----- test/v5/base/reaction.js | 33 ++++++++++++++++++--------------- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index a41e1c570..a053b6d71 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -87,6 +87,8 @@ autoActions - Fixed #2326 - Fixed #2379 +`reaction`'s effect function now receives the previous value seen by the reaction as second argument. + ## Breaking changes ### Changes that might affect you @@ -115,3 +117,4 @@ autoActions - In `computed`, the when `predicate` (first arg), and `reaction` predicate (first arg) it is now forbidden to directly change state. State changes should be done in their effect functinos, or otherwise wrapped in `runInAction` at least (only the state change, not the observables you want to track!) (note that this is still an anti pattern). - The `observableArray.get()` and `observableArray.set()` methods are no longer supported. - The `IObservableObject` interface is no longer exported from MobX. +- The second argument to the `reaction` effect function, the disposer object, is now passed in as third argument. The second argument is now the previous value seen by the reaction. diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 524eed8bd..964d40501 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -118,7 +118,7 @@ change to its observable state: Usage: -- `reaction(() => data, (data, reaction) => { sideEffect }, options?)`. +- `reaction(() => value, (value, previousValue, reaction) => { sideEffect }, options?)`. `reaction` is like `autorun` but gives more fine grained control on which observables will be tracked. It takes two functions, the first one (the _data_ function) is tracked and returns data that is used as input for the second one, the _effect_ function. diff --git a/notes.md b/notes.md index f98383e2b..df9962f6e 100644 --- a/notes.md +++ b/notes.md @@ -62,13 +62,18 @@ - [x] ~default observable requires reaction?~ - [x] check coverage - [x] re-execute perf checks - - [x] update ad links (https://www.google.com/adsense/new/u/0/pub-1705981461067724/home ?) - - [ ] add deprecation messages to latest mobx 5 - - [ ] merge 2398 + - [x] update ad links + - [x] ~add deprecation messages to latest mobx 5~ tricky; a lot of the api's are valid in v5 without alternative, so wouldn't result in actionable hints if the user doesn't intent to upgrade to v6 + - [x] merge 2398 - [ ] make `onReactionError` an option for `configure` - [ ] investigate the onbecomeunobserved issue - [ ] support `flow` and `computedFn` as annotation - - [ ] make second arg of reaction effect the old value + - [x] make second arg of reaction effect the old value + - [ ] fix #2415 + - [ ] fix #2404? + - [ ] fix #2346? + - [ ] fix #2309? + - [ ] - [ ] docs - [ ] clean up docs - [ ] fix interactive tut diff --git a/src/api/autorun.ts b/src/api/autorun.ts index a79b6bb53..9ecde29e2 100644 --- a/src/api/autorun.ts +++ b/src/api/autorun.ts @@ -102,7 +102,7 @@ function createSchedulerFromOptions(opts: IReactionOptions) { export function reaction( expression: (r: IReactionPublic) => T, - effect: (arg: T, r: IReactionPublic) => void, + effect: (arg: T, prev: T, r: IReactionPublic) => void, opts: IReactionOptions = EMPTY_OBJECT ): IReactionDisposer { if (__DEV__) { @@ -121,6 +121,7 @@ export function reaction( let firstTime = true let isScheduled = false let value: T + let oldValue: T = undefined as any // only an issue with fireImmediately const equals = (opts as any).compareStructural ? comparer.structural @@ -143,15 +144,16 @@ export function reaction( function reactionRunner() { isScheduled = false if (r.isDisposed_) return - let changed = false + let changed: boolean = false r.track(() => { const nextValue = allowStateChanges(false, () => expression(r)) changed = firstTime || !equals(value, nextValue) + oldValue = value value = nextValue }) - if (firstTime && opts.fireImmediately!) effectAction(value, r) - if (!firstTime && (changed as boolean) === true) effectAction(value, r) - if (firstTime) firstTime = false + if (firstTime && opts.fireImmediately!) effectAction(value, oldValue, r) + else if (!firstTime && changed) effectAction(value, oldValue, r) + firstTime = false } r.schedule_() diff --git a/test/v5/base/reaction.js b/test/v5/base/reaction.js index 627903b0b..ebb264826 100644 --- a/test/v5/base/reaction.js +++ b/test/v5/base/reaction.js @@ -11,8 +11,8 @@ test("basic", () => { const d = reaction( () => a.get(), - newValue => { - values.push(newValue) + (newValue, oldValue) => { + values.push([newValue, oldValue]) } ) @@ -21,7 +21,10 @@ test("basic", () => { d() a.set(4) - expect(values).toEqual([2, 3]) + expect(values).toEqual([ + [2, 1], + [3, 2] + ]) }) test("effect fireImmediately is honored", () => { @@ -187,7 +190,7 @@ test("passes Reaction as an argument to effect function", () => { reaction( () => a.get(), - (newValue, r) => { + (newValue, _oldValue, r) => { if (a.get() === "pleaseDispose") r.dispose() values.push(newValue) }, @@ -209,9 +212,9 @@ test("can dispose reaction on first run", () => { const valuesExpr1st = [] reaction( () => a.get(), - (newValue, r) => { + (newValue, oldValue, r) => { r.dispose() - valuesExpr1st.push(newValue) + valuesExpr1st.push([newValue, oldValue]) }, { fireImmediately: true } ) @@ -222,8 +225,8 @@ test("can dispose reaction on first run", () => { r.dispose() return a.get() }, - newValue => { - valuesEffect1st.push(newValue) + (newValue, oldValue) => { + valuesEffect1st.push([newValue, oldValue]) }, { fireImmediately: true } ) @@ -231,9 +234,9 @@ test("can dispose reaction on first run", () => { const valuesExpr = [] reaction( () => a.get(), - (newValue, r) => { + (newValue, oldValue, r) => { r.dispose() - valuesExpr.push(newValue) + valuesExpr.push([newValue, oldValue]) } ) @@ -243,17 +246,17 @@ test("can dispose reaction on first run", () => { r.dispose() return a.get() }, - newValue => { - valuesEffect.push(newValue) + (newValue, oldValue) => { + valuesEffect.push([newValue, oldValue]) } ) a.set(2) a.set(3) - expect(valuesExpr1st).toEqual([1]) - expect(valuesEffect1st).toEqual([1]) - expect(valuesExpr).toEqual([2]) + expect(valuesExpr1st).toEqual([[1, undefined]]) + expect(valuesEffect1st).toEqual([[1, undefined]]) + expect(valuesExpr).toEqual([[2, 1]]) expect(valuesEffect).toEqual([]) }) From a0627f8cf94a42819bb25523db297b5f8b50d509 Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Mon, 17 Aug 2020 19:02:08 +0800 Subject: [PATCH 0497/1043] fix: makeObservable gets added to the type import (#2429) --- .../__tests__/undecorate.spec.ts | 50 +++++++++++++++++++ packages/mobx-undecorate/src/undecorate.ts | 3 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/mobx-undecorate/__tests__/undecorate.spec.ts b/packages/mobx-undecorate/__tests__/undecorate.spec.ts index 595f6ea26..b0763590c 100644 --- a/packages/mobx-undecorate/__tests__/undecorate.spec.ts +++ b/packages/mobx-undecorate/__tests__/undecorate.spec.ts @@ -1125,4 +1125,54 @@ describe("@observer", () => { }" `) }) + + test("makeObservable gets added to the non-type import #2415", () => { + expect( + convert( + ` + import type { IReactionDisposer } from 'mobx'; + import { reaction, observable } from 'mobx'; + + export default class Store { + @observable counter = 0; + + removeReaction: IReactionDisposer; + + constructor() { + this.removeReaction = reaction(() => this.counter, () => { + console.log('it changed'); + }); + } + + cleanup() { + this.removeReaction(); + } + } + ` + ) + ).toMatchInlineSnapshot(` + "import type { IReactionDisposer } from 'mobx'; + import { reaction, observable, makeObservable } from 'mobx'; + + export default class Store { + counter = 0; + + removeReaction: IReactionDisposer; + + constructor() { + makeObservable(this, { + counter: observable + }); + + this.removeReaction = reaction(() => this.counter, () => { + console.log('it changed'); + }); + } + + cleanup() { + this.removeReaction(); + } + }" + `) + }) }) diff --git a/packages/mobx-undecorate/src/undecorate.ts b/packages/mobx-undecorate/src/undecorate.ts index b19b8c618..9fa31d057 100644 --- a/packages/mobx-undecorate/src/undecorate.ts +++ b/packages/mobx-undecorate/src/undecorate.ts @@ -203,7 +203,8 @@ export default function tranform( const mobxImport = source .find(j.ImportDeclaration) .filter(im => im.value.source.value === "mobx") - .nodes()[0] + .nodes() + .filter(node => node.importKind === "value")[0] if (!mobxImport) { console.warn( "Failed to find mobx import, can't add makeObservable as dependency in " + From 5f848ab5bb68ad770ca53f9dc7e8b5ec0d963b15 Mon Sep 17 00:00:00 2001 From: urugator Date: Mon, 17 Aug 2020 21:55:12 +0200 Subject: [PATCH 0498/1043] fix array dehancing v6 (#2431) --- CHANGELOG.md | 1 + src/types/observablearray.ts | 10 +-- test/v4/base/array.js | 147 ++++++++++++++++++++++++++++++++ test/v5/base/array.js | 159 +++++++++++++++++++++++++++++++++++ 4 files changed, 312 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9387d504b..f2bed0d6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # UNPUBLISHED (keep this here and add unpublished changes) +- Fixed [2423](https://github.com/mobxjs/mobx/issues/2423), array methods not dehancing by [@urugator](https://github.com/urugator) - Fixed ObservableSet.prototype.forEach not being reactive in 4.x [#2341](https://github.com/mobxjs/mobx/pull/2341) by [@melnikov-s](https://github.com/melnikov-s) - Add error when computed value declared for unspecified getter [#1867](https://github.com/mobxjs/mobx/issues/1867) by [@berrunder](https://github.com/berrunder) - Don't omit action name in production [#2263](https://github.com/mobxjs/mobx/issues/2263) by [@elektronik2k5](https://github.com/elektronik2k5) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index b764f4f65..7a5893c5e 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -87,7 +87,7 @@ const arrayTraps = { if (name === $mobx) return adm if (name === "length") return adm.getArrayLength_() if (typeof name === "string" && !isNaN(name as any)) { - adm.get_(parseInt(name)) + return adm.get_(parseInt(name)) } if (hasProp(arrayExtensions, name)) { return arrayExtensions[name] @@ -500,8 +500,8 @@ function mapLikeFunc(funcName) { return function (callback, thisArg) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() - return adm.values_[funcName]((element, index) => { - element = adm.dehanceValue_(element) + const dehancedValues = adm.dehanceValues_(adm.values_) + return dehancedValues[funcName]((element, index) => { return callback.call(thisArg, element, index, this) }) } @@ -512,8 +512,8 @@ function reduceLikeFunc(funcName) { return function (callback, initialValue) { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() - return adm.values_[funcName]((accumulator, currentValue, index) => { - currentValue = adm.dehanceValue_(currentValue) + const dehancedValues = adm.dehanceValues_(adm.values_) + return dehancedValues[funcName]((accumulator, currentValue, index) => { return callback(accumulator, currentValue, index, this) }, initialValue) } diff --git a/test/v4/base/array.js b/test/v4/base/array.js index 478fbd7e0..af634c6ba 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -620,3 +620,150 @@ test("very long arrays can be safely passed to nativeArray.concat #2379", () => expect(r2).toEqual(r1) expect(observableArray).toEqual(anotherArray) }) + +describe("dehances", () => { + function supressConsoleWarn(fn) { + const { warn } = console + console.warn = () => {} + const result = fn() + console.warn = warn + return result + } + + const dehancer = thing => { + // Dehance only objects of a proper type + if (thing && typeof thing === "object" && thing.hasOwnProperty("value")) { + return thing.value + } + // Support nested arrays + if (Array.isArray(thing)) { + // If array has own dehancer it's still applied prior to ours. + // It doesn't matter how many dehancers we apply, + // if they ignore unknown types. + return thing.map(dehancer) + } + // Ignore unknown types + return thing + } + + let enhanced, dehanced, array + + beforeEach(() => { + enhanced = [{ value: 1 }, { value: 2 }, { value: 3 }] + dehanced = enhanced.map(dehancer) + array = observable(enhanced) + mobx._getAdministration(array).dehancer = dehancer + }) + + test("slice", () => { + expect(array.slice()).toEqual(dehanced.slice()) + }) + + test("filter", () => { + const predicate = value => value === 2 + expect(array.filter(predicate)).toEqual(dehanced.filter(predicate)) + }) + + test("concat", () => { + expect(array.concat(4)).toEqual(dehanced.concat(4)) + }) + + test("entries", () => { + expect([...array.entries()]).toEqual([...dehanced.entries()]) + }) + + test("every", () => { + array.every((value, index) => { + expect(value).toEqual(dehanced[index]) + return true + }) + }) + + test("find", () => { + const predicate = value => value === 2 + expect(array.find(predicate)).toEqual(dehanced.find(predicate)) + }) + + test("forEach", () => { + array.forEach((value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("includes", () => { + expect(array.includes(2)).toEqual(dehanced.includes(2)) + }) + + test("indexOf", () => { + expect(array.indexOf(2)).toEqual(dehanced.indexOf(2)) + }) + + test("join", () => { + expect(array.join()).toEqual(dehanced.join()) + }) + + test("lastIndexOf", () => { + expect(array.lastIndexOf(2)).toEqual(dehanced.lastIndexOf(2)) + }) + + test("map", () => { + array.map((value, index) => { + expect(value).toEqual(dehanced[index]) + return value + }) + }) + + test("pop", () => { + expect(array.pop()).toEqual(dehanced.pop()) + }) + + test("reduce", () => { + array.reduce((_, value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("reduceRight", () => { + array.reduceRight((_, value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("reverse", () => { + const reversedArray = supressConsoleWarn(() => array.reverse()) + expect(reversedArray).toEqual(dehanced.reverse()) + }) + + test("shift", () => { + expect(array.shift()).toEqual(dehanced.shift()) + }) + + test("some", () => { + array.some((value, index) => { + expect(value).toEqual(dehanced[index]) + return false + }) + }) + + test("splice", () => { + expect(array.splice(1, 2)).toEqual(dehanced.splice(1, 2)) + }) + + test("sort", () => { + const comparator = (a, b) => { + expect(typeof a).toEqual("number") + expect(typeof b).toEqual("number") + return b > a + } + const sortedArray = supressConsoleWarn(() => array.sort(comparator)) + expect(sortedArray).toEqual(dehanced.sort(comparator)) + }) + + test("values", () => { + expect([...array.values()]).toEqual([...dehanced.values()]) + }) + + test("flat/flatMap", () => { + // not supported in V4 + }) +}) diff --git a/test/v5/base/array.js b/test/v5/base/array.js index 7fea1cdae..cd2dddeda 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -693,3 +693,162 @@ test("very long arrays can be safely passed to nativeArray.concat #2379", () => expect(r2).toEqual(r1) expect(observableArray).toEqual(anotherArray) }) + +describe("dehances", () => { + function supressConsoleWarn(fn) { + const { warn } = console + console.warn = () => {} + const result = fn() + console.warn = warn + return result + } + + const dehancer = thing => { + // Dehance only objects of a proper type + if (thing && typeof thing === "object" && thing.hasOwnProperty("value")) { + return thing.value + } + // Support nested arrays + if (Array.isArray(thing)) { + // If array has own dehancer it's still applied prior to ours. + // It doesn't matter how many dehancers we apply, + // if they ignore unknown types. + return thing.map(dehancer) + } + // Ignore unknown types + return thing + } + + let enhanced, dehanced, array + + beforeEach(() => { + enhanced = [{ value: 1 }, { value: 2 }, { value: 3 }] + dehanced = enhanced.map(dehancer) + array = observable(enhanced) + mobx._getAdministration(array).dehancer = dehancer + }) + + test("slice", () => { + expect(array.slice()).toEqual(dehanced.slice()) + }) + + test("filter", () => { + const predicate = value => value === 2 + expect(array.filter(predicate)).toEqual(dehanced.filter(predicate)) + }) + + test("concat", () => { + expect(array.concat(4)).toEqual(dehanced.concat(4)) + }) + + test("entries", () => { + expect([...array.entries()]).toEqual([...dehanced.entries()]) + }) + + test("every", () => { + array.every((value, index) => { + expect(value).toEqual(dehanced[index]) + return true + }) + }) + + test("find", () => { + const predicate = value => value === 2 + expect(array.find(predicate)).toEqual(dehanced.find(predicate)) + }) + + test("forEach", () => { + array.forEach((value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("includes", () => { + expect(array.includes(2)).toEqual(dehanced.includes(2)) + }) + + test("indexOf", () => { + expect(array.indexOf(2)).toEqual(dehanced.indexOf(2)) + }) + + test("join", () => { + expect(array.join()).toEqual(dehanced.join()) + }) + + test("lastIndexOf", () => { + expect(array.lastIndexOf(2)).toEqual(dehanced.lastIndexOf(2)) + }) + + test("map", () => { + array.map((value, index) => { + expect(value).toEqual(dehanced[index]) + return value + }) + }) + + test("pop", () => { + expect(array.pop()).toEqual(dehanced.pop()) + }) + + test("reduce", () => { + array.reduce((_, value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("reduceRight", () => { + array.reduceRight((_, value, index) => { + expect(value).toEqual(dehanced[index]) + }) + }) + + test("reverse", () => { + const reversedArray = supressConsoleWarn(() => array.reverse()) + expect(reversedArray).toEqual(dehanced.reverse()) + }) + + test("shift", () => { + expect(array.shift()).toEqual(dehanced.shift()) + }) + + test("some", () => { + array.some((value, index) => { + expect(value).toEqual(dehanced[index]) + return false + }) + }) + + test("splice", () => { + expect(array.splice(1, 2)).toEqual(dehanced.splice(1, 2)) + }) + + test("sort", () => { + const comparator = (a, b) => { + expect(typeof a).toEqual("number") + expect(typeof b).toEqual("number") + return b > a + } + const sortedArray = supressConsoleWarn(() => array.sort(comparator)) + expect(sortedArray).toEqual(dehanced.sort(comparator)) + }) + + test("values", () => { + expect([...array.values()]).toEqual([...dehanced.values()]) + }) + + test("flat/flatMap", () => { + const nestedArray = [{ value: 1 }, [{ value: 2 }, [{ value: 3 }]]] + const dehancedNestedArray = nestedArray.map(dehancer) + + // flat + array.replace(nestedArray) + expect(array.flat(Infinity)).toEqual(dehancedNestedArray.flat(Infinity)) + + // flatMap + const flattenedArray = array.flatMap((value, index) => { + expect(value).toEqual(dehancedNestedArray[index]) + return value + }) + expect(flattenedArray).toEqual(dehancedNestedArray.flat(1)) + }) +}) From ca103e7e5f03ae919548ddac48ad29736bb1faf1 Mon Sep 17 00:00:00 2001 From: urugator Date: Tue, 18 Aug 2020 12:27:53 +0200 Subject: [PATCH 0499/1043] fix array.reduce without initial value #2432 --- CHANGELOG.md | 1 + src/types/observablearray.ts | 13 ++++++++----- test/v4/base/array.js | 22 ++++++++++++++++++++++ test/v5/base/array.js | 22 ++++++++++++++++++++++ 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2bed0d6d..94b5a6dec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # UNPUBLISHED (keep this here and add unpublished changes) +- Fixed [2432](https://github.com/mobxjs/mobx/issues/2423), array.reduce without initial value by [@urugator](https://github.com/urugator) - Fixed [2423](https://github.com/mobxjs/mobx/issues/2423), array methods not dehancing by [@urugator](https://github.com/urugator) - Fixed ObservableSet.prototype.forEach not being reactive in 4.x [#2341](https://github.com/mobxjs/mobx/pull/2341) by [@melnikov-s](https://github.com/melnikov-s) - Add error when computed value declared for unspecified getter [#1867](https://github.com/mobxjs/mobx/issues/1867) by [@berrunder](https://github.com/berrunder) diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 7a5893c5e..420b03126 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -490,8 +490,8 @@ function simpleFunc(funcName) { return function () { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() - const res = adm.dehanceValues_(adm.values_) - return res[funcName].apply(res, arguments) + const dehancedValues = adm.dehanceValues_(adm.values_) + return dehancedValues[funcName].apply(dehancedValues, arguments) } } @@ -509,13 +509,16 @@ function mapLikeFunc(funcName) { // Make sure callbacks recieve correct array arg #2326 function reduceLikeFunc(funcName) { - return function (callback, initialValue) { + return function () { const adm: ObservableArrayAdministration = this[$mobx] adm.atom_.reportObserved() const dehancedValues = adm.dehanceValues_(adm.values_) - return dehancedValues[funcName]((accumulator, currentValue, index) => { + // #2432 - reduce behavior depends on arguments.length + const callback = arguments[0] + arguments[0] = (accumulator, currentValue, index) => { return callback(accumulator, currentValue, index, this) - }, initialValue) + } + return dehancedValues[funcName].apply(dehancedValues, arguments) } } diff --git a/test/v4/base/array.js b/test/v4/base/array.js index af634c6ba..af28a8e88 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -767,3 +767,25 @@ describe("dehances", () => { // not supported in V4 }) }) + +test("reduce without initial value #2432", () => { + const array = [1, 2, 3] + const observableArray = observable(array) + + const arrayReducerArgs = [] + const observableArrayReducerArgs = [] + + const arraySum = array.reduce((...args) => { + arrayReducerArgs.push(args) + return args[0] + args[1] + }) + + const observableArraySum = observableArray.reduce((...args) => { + observableArrayReducerArgs.push(args) + return args[0] + args[1] + }) + + expect(arraySum).toEqual(1 + 2 + 3) + expect(observableArraySum).toEqual(arraySum) + expect(arrayReducerArgs).toEqual(observableArrayReducerArgs) +}) diff --git a/test/v5/base/array.js b/test/v5/base/array.js index cd2dddeda..e2b2fc4bd 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -852,3 +852,25 @@ describe("dehances", () => { expect(flattenedArray).toEqual(dehancedNestedArray.flat(1)) }) }) + +test("reduce without initial value #2432", () => { + const array = [1, 2, 3] + const observableArray = observable(array) + + const arrayReducerArgs = [] + const observableArrayReducerArgs = [] + + const arraySum = array.reduce((...args) => { + arrayReducerArgs.push(args) + return args[0] + args[1] + }) + + const observableArraySum = observableArray.reduce((...args) => { + observableArrayReducerArgs.push(args) + return args[0] + args[1] + }) + + expect(arraySum).toEqual(1 + 2 + 3) + expect(observableArraySum).toEqual(arraySum) + expect(arrayReducerArgs).toEqual(observableArrayReducerArgs) +}) From 6ec6499fb8b55a17fe65f42b14d1188fd7fa1ba1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 20 Aug 2020 22:36:35 +0100 Subject: [PATCH 0500/1043] Introduced support for `flow`as annotation and introduced `flowResult`to simplify casting --- docs/faq/migrate-to-6.md | 2 + docs/refguide/action.md | 52 ++++++++- docs/refguide/api.md | 16 +++ docs/refguide/observable.md | 2 + notes.md | 6 +- src/api/annotation.ts | 1 + src/api/flow.ts | 186 ++++++++++++++++++------------- src/api/makeObservable.ts | 28 ++++- src/mobx.ts | 1 + src/utils/utils.ts | 9 ++ test/v5/base/api.js | 1 + test/v5/base/flow.js | 93 ++++++++++++++++ test/v5/base/typescript-tests.ts | 166 ++++++++++++++++++++++++++- 13 files changed, 474 insertions(+), 89 deletions(-) diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index a053b6d71..08caef2fb 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -89,6 +89,8 @@ autoActions `reaction`'s effect function now receives the previous value seen by the reaction as second argument. +flow can be used as annotation + ## Breaking changes ### Changes that might affect you diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 62a61cfc0..1e56da048 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -316,18 +316,20 @@ class Store { Flow is explained below. ```javascript -import { flow, makeAutoObservable } from "mobx" +import { flow, makeAutoObservable, flowResult } from "mobx" class Store { githubProjects = [] state = "pending" constructor() { - makeAutoObservable(this) + makeAutoObservable(this, { + fetchProjects: flow + }) } // note the star, this a generator function! - fetchProjects = flow(function* fetchProjects() { + *fetchProjects() { this.githubProjects = [] this.state = "pending" try { @@ -338,8 +340,11 @@ class Store { } catch (error) { this.state = "error" } - }) + } } + +const store = new Store() +const projects = await flowResult(store.fetchProjects()) ``` @@ -348,6 +353,7 @@ class Store { Usage: +- `flow` (annotation) - `flow(function* (args) { })` The `flow` wrapper is an optional alternative to `async` / `await` that makes it easier to @@ -364,6 +370,44 @@ It can be applied as follows: The [listing above](#examples) shows what this looks in practice. +The `flowResult` function in the above listing is only needed when using TypeScript. +Since decorating a method with `flow`, it will wrap the returned generator in a promise. +However, TypeScript isn't aware of that transformation, so, `flowResult` will make sure that TypeScript is aware of that type change. + +`makeAutoObservable` and friends will automatically infer generators to be `flow`s. + +
    🚀 Using flow on object fields +`flow`, like `action` can be used to wrap functions directly, so above example could also have been written as: + +```typescript +import { flow, makeAutoObservable, flowResult } from "mobx" + +class Store { + githubProjects = [] + state = "pending" + + fetchProjects = flow(function* (this: Store) { + this.githubProjects = [] + this.state = "pending" + try { + const projects = yield fetchGithubProjectsSomehow() // yield instead of await + const filteredProjects = somePreprocessing(projects) + this.state = "done" + this.githubProjects = filteredProjects + } catch (error) { + this.state = "error" + } + }) +} + +const store = new Store() +const projects = await store.fetchProjects() +``` + +The upside is that we don't need `flowResult` anymore, the downside is that `this` needs to be typed to make sure its type is inferred correctly. + +
    + ### 🚀 Flow cancellation Another neat benefit of flows is that they are cancellable. diff --git a/docs/refguide/api.md b/docs/refguide/api.md index b4b39231c..8540af4ee 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -225,10 +225,26 @@ Create a one-time action that is immediately invoked. ### `flow` +Usage: + +- `flow`(annotation) +- `flow(fn)` + MobX friendly replacement for `async` / `await` that supports cancellation. [«details»](action.md#using-flow-instead-of-asyncawait) +### `flow` + +Usage: + +- `flowResult(flowFunctionResult)` + +Utility for TypeScript users only, that casts the output of the generator to a promise. +This is just to correct type-wise for the promise wrapping done by `flow`. At runtime it just directly returns the inputted value. + +[«details»](action.md#using-flow-instead-of-asyncawait) + ## Computed _Computed values derived from observables and other computeds._ diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index 75410a248..a2fc7e0ab 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -124,6 +124,7 @@ However, `makeAutoObservable` cannot be used on classes that have super- or are Inference rules: +- Any (inherited) member that is a generator function will be annotated with `flow`. - Any (inherited) member that contains a `function` value will be annotated with `autoAction`. - Any `get`ter will be annotated with `computed`. - Any other _own_ field will be marked with `observable`. @@ -213,6 +214,7 @@ Although there is typically no use for this mechanism outside libraries. | `computed.struct` | Like `computed`, except that if after recomputing the result is structurally equal to the previous result, no observers will be notified | | `true` | Infer the best annotation. See [makeAutoObservable](#makeautoobservable). | | `false` | Explicitly do not annotate this property. | +| `flow` | Creates a `flow` to manage asynchronous processes. For more details see [flow](action.html#-using-flow-instead-of-asyncawait). Note that the inferred return type in typescript might be off. | | `autoAction` | Should not be used explicitly, but is used under the hood by `makeAutoObservable` to mark methods that can act as action or derivation, based on their calling context | ## 🚀 The `options` argument diff --git a/notes.md b/notes.md index df9962f6e..5c6dc8ac7 100644 --- a/notes.md +++ b/notes.md @@ -65,10 +65,9 @@ - [x] update ad links - [x] ~add deprecation messages to latest mobx 5~ tricky; a lot of the api's are valid in v5 without alternative, so wouldn't result in actionable hints if the user doesn't intent to upgrade to v6 - [x] merge 2398 - - [ ] make `onReactionError` an option for `configure` + - [x] make `onReactionError` an option for `configure` - [ ] investigate the onbecomeunobserved issue - - [ ] support `flow` and `computedFn` as annotation - - [x] make second arg of reaction effect the old value + - [x] support `flow` - [ ] fix #2415 - [ ] fix #2404? - [ ] fix #2346? @@ -92,6 +91,7 @@ - [ ] fix React unstable batch setup - [ ] post 6.0 - [ ] make cheatsheet + - [ ] support mobx-utils `computedFn` as annotation? - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - [ ] set up discussions - [ ] use autObservable options for codemod (if no superclass)? diff --git a/src/api/annotation.ts b/src/api/annotation.ts index 84adde2cb..f34f5cda7 100644 --- a/src/api/annotation.ts +++ b/src/api/annotation.ts @@ -10,6 +10,7 @@ export type Annotation = { | "action.bound" | "autoAction" | "autoAction.bound" + | "flow" arg_?: any } diff --git a/src/api/flow.ts b/src/api/flow.ts index 4f930877f..0693be0e9 100644 --- a/src/api/flow.ts +++ b/src/api/flow.ts @@ -1,4 +1,6 @@ -import { action, noop, die, isFunction } from "../internal" +import { action, noop, die, isFunction, Annotation, isStringish, storeDecorator } from "../internal" + +export const FLOW = "flow" let generatorId = 0 @@ -13,91 +15,119 @@ export function isFlowCancellationError(error: Error) { export type CancellablePromise = Promise & { cancel(): void } -export function flow( - generator: (...args: Args) => Generator | AsyncGenerator -): (...args: Args) => CancellablePromise { - if (__DEV__ && arguments.length !== 1) - die(`Flow expects 1 argument and cannot be used as decorator`) - const name = generator.name || "" - - // Implementation based on https://github.com/tj/co/blob/master/index.js - return function () { - const ctx = this - const args = arguments - const runId = ++generatorId - const gen = action( - `${name} - runid: ${runId} - init`, - generator as (...args: Args) => Generator - ).apply(ctx, (args as any) as Args) - let rejector: (error: any) => void - let pendingPromise: CancellablePromise | undefined = undefined - - const promise = new Promise(function (resolve, reject) { - let stepId = 0 - rejector = reject - - function onFulfilled(res: any) { - pendingPromise = undefined - let ret - try { - ret = action(`${name} - runid: ${runId} - yield ${stepId++}`, gen.next).call( - gen, - res - ) - } catch (e) { - return reject(e) +interface Flow extends Annotation, PropertyDecorator { + ( + generator: (...args: Args) => Generator | AsyncGenerator + ): (...args: Args) => CancellablePromise +} + +export const flow: Flow = Object.assign( + function flow(arg1, arg2?) { + // @flow + if (isStringish(arg2)) { + return storeDecorator(arg1, arg2, "flow") + } + // flow(fn) + if (__DEV__ && arguments.length !== 1) + die(`Flow expects 1 argument and cannot be used as decorator`) + const generator = arg1 + const name = generator.name || "" + + // Implementation based on https://github.com/tj/co/blob/master/index.js + const res = function () { + const ctx = this + const args = arguments + const runId = ++generatorId + const gen = action(`${name} - runid: ${runId} - init`, generator).apply(ctx, args) + let rejector: (error: any) => void + let pendingPromise: CancellablePromise | undefined = undefined + + const promise = new Promise(function (resolve, reject) { + let stepId = 0 + rejector = reject + + function onFulfilled(res: any) { + pendingPromise = undefined + let ret + try { + ret = action( + `${name} - runid: ${runId} - yield ${stepId++}`, + gen.next + ).call(gen, res) + } catch (e) { + return reject(e) + } + + next(ret) } - next(ret) - } + function onRejected(err: any) { + pendingPromise = undefined + let ret + try { + ret = action( + `${name} - runid: ${runId} - yield ${stepId++}`, + gen.throw! + ).call(gen, err) + } catch (e) { + return reject(e) + } + next(ret) + } - function onRejected(err: any) { - pendingPromise = undefined - let ret + function next(ret: any) { + if (isFunction(ret?.then)) { + // an async iterator + ret.then(next, reject) + return + } + if (ret.done) return resolve(ret.value) + pendingPromise = Promise.resolve(ret.value) as any + return pendingPromise!.then(onFulfilled, onRejected) + } + + onFulfilled(undefined) // kick off the process + }) as any + + promise.cancel = action(`${name} - runid: ${runId} - cancel`, function () { try { - ret = action(`${name} - runid: ${runId} - yield ${stepId++}`, gen.throw!).call( - gen, - err - ) + if (pendingPromise) cancelPromise(pendingPromise) + // Finally block can return (or yield) stuff.. + const res = gen.return!(undefined as any) + // eat anything that promise would do, it's cancelled! + const yieldedPromise = Promise.resolve(res.value) + yieldedPromise.then(noop, noop) + cancelPromise(yieldedPromise) // maybe it can be cancelled :) + // reject our original promise + rejector(new FlowCancellationError()) } catch (e) { - return reject(e) + rejector(e) // there could be a throwing finally block } - next(ret) - } - - function next(ret: any) { - if (isFunction(ret?.then)) { - // an async iterator - ret.then(next, reject) - return - } - if (ret.done) return resolve(ret.value) - pendingPromise = Promise.resolve(ret.value) as any - return pendingPromise!.then(onFulfilled, onRejected) - } - - onFulfilled(undefined) // kick off the process - }) as any - - promise.cancel = action(`${name} - runid: ${runId} - cancel`, function () { - try { - if (pendingPromise) cancelPromise(pendingPromise) - // Finally block can return (or yield) stuff.. - const res = gen.return!(undefined as any) - // eat anything that promise would do, it's cancelled! - const yieldedPromise = Promise.resolve(res.value) - yieldedPromise.then(noop, noop) - cancelPromise(yieldedPromise) // maybe it can be cancelled :) - // reject our original promise - rejector(new FlowCancellationError()) - } catch (e) { - rejector(e) // there could be a throwing finally block - } - }) - return promise as CancellablePromise + }) + return promise + } + res.isMobXFlow = true + return res + } as any, + { + annotationType_: "flow" as const } -} +) function cancelPromise(promise) { if (isFunction(promise.cancel)) promise.cancel() } + +export function flowResult( + result: T +): T extends Generator + ? CancellablePromise + : T extends CancellablePromise + ? T + : never { + return result as any // just tricking TypeScript :) +} + +export function isFlow(fn: any): boolean { + return fn?.isMobXFlow === true +} diff --git a/src/api/makeObservable.ts b/src/api/makeObservable.ts index a903d35d8..552f0d517 100644 --- a/src/api/makeObservable.ts +++ b/src/api/makeObservable.ts @@ -34,7 +34,11 @@ import { defineProperty, ownKeys, objectPrototype, - hasProp + hasProp, + FLOW, + flow, + isGenerator, + isFlow } from "../internal" const CACHED_ANNOTATIONS = Symbol("mobx-cached-annotations") @@ -52,7 +56,13 @@ function getInferredAnnotation( if (desc.set) return false // ignore pure setters // if already wrapped in action, don't do that another time, but assume it is already set up properly if (isFunction(desc.value)) - return isAction(desc.value) ? false : autoBind ? autoAction.bound : autoAction + return isGenerator(desc.value) + ? flow + : isAction(desc.value) + ? false + : autoBind + ? autoAction.bound + : autoAction // if (!desc.configurable || !desc.writable) return false return defaultAnnotation ?? observable.deep } @@ -121,6 +131,14 @@ export function makeProperty( ) break } + case FLOW: { + if (owner !== target && !forceCopy) { + if (!isFlow(owner[key])) addHiddenProp(owner, key, flow(descriptor.value!)) + } else { + addHiddenProp(target, key, flow(descriptor.value)) + } + break + } case COMPUTED: case COMPUTED_STRUCT: { if (!descriptor.get) die(4, key) @@ -249,7 +267,11 @@ function extractAnnotationsFromProto( if (prop.get) { collector[key as any] = computed } else if (isFunction(prop.value)) { - collector[key as any] = options?.autoBind ? autoAction.bound : autoAction + collector[key as any] = isGenerator(prop.value) + ? flow + : options?.autoBind + ? autoAction.bound + : autoAction } }) } diff --git a/src/mobx.ts b/src/mobx.ts index 6c699531f..d7083e19b 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -100,6 +100,7 @@ export { onBecomeObserved, onBecomeUnobserved, flow, + flowResult, FlowCancellationError, isFlowCancellationError, toJS, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 367337be4..3a10f8d82 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -85,6 +85,15 @@ export function isPlainObject(value) { return proto === objectPrototype || proto === null } +// https://stackoverflow.com/a/37865170 +export function isGenerator(obj: any): boolean { + const constructor = obj?.constructor + if (!constructor) return false + if ("GeneratorFunction" === constructor.name || "GeneratorFunction" === constructor.displayName) + return true + return false +} + export function addHiddenProp(object: any, propName: PropertyKey, value: any) { defineProperty(object, propName, { enumerable: false, diff --git a/test/v5/base/api.js b/test/v5/base/api.js index bcd342339..3137a3494 100644 --- a/test/v5/base/api.js +++ b/test/v5/base/api.js @@ -21,6 +21,7 @@ test("correct api should be exposed", function () { "createAtom", "extendObservable", "flow", + "flowResult", "FlowCancellationError", "isFlowCancellationError", "get", diff --git a/test/v5/base/flow.js b/test/v5/base/flow.js index d7d1549b8..a3593ab2e 100644 --- a/test/v5/base/flow.js +++ b/test/v5/base/flow.js @@ -391,3 +391,96 @@ test("cancelled flow should not result in runaway reject", async () => { expect("" + e).toBe("Error: FLOW_CANCELLED") } }) + +test("it should support flow as annotation", done => { + const values = [] + + mobx.configure({ enforceActions: "observed" }) + + class X { + a = 1 + + f = function* (initial) { + this.a = initial // this runs in action + try { + this.a = yield delay(100, 5, true) // and this as well! + yield delay(100, 0) + this.a = 4 + } catch (e) { + this.a = e + } + return this.a + } + constructor() { + makeObservable(this, { + a: true, + f: flow + }) + } + } + + const x = new X() + mobx.reaction( + () => x.a, + v => values.push(v), + { fireImmediately: true } + ) + + const x2 = new X() + expect(x2.f).not.toBe(x.f) // local field! + + setTimeout(() => { + x.f(2).then(v => { + expect(v).toBe(5) + expect(values).toEqual([1, 2, 5]) + expect(x.a).toBe(5) + done() + }) + }, 10) +}) + +test("it should support flow in makeAutoObservable", done => { + const values = [] + + mobx.configure({ enforceActions: "observed" }) + + class X { + a = 1; + + *f(initial) { + this.a = initial // this runs in action + try { + this.a = yield delay(100, 5, true) // and this as well! + yield delay(100, 0) + this.a = 4 + } catch (e) { + this.a = e + } + return this.a + } + + constructor() { + debugger + mobx.makeAutoObservable(this) + } + } + + const x = new X() + mobx.reaction( + () => x.a, + v => values.push(v), + { fireImmediately: true } + ) + + const x2 = new X() + expect(x2.f).toBe(x.f) // shared! + + setTimeout(() => { + x.f(2).then(v => { + expect(v).toBe(5) + expect(values).toEqual([1, 2, 5]) + expect(x.a).toBe(5) + done() + }) + }, 10) +}) diff --git a/test/v5/base/typescript-tests.ts b/test/v5/base/typescript-tests.ts index 9f74abe3b..9f83630ff 100644 --- a/test/v5/base/typescript-tests.ts +++ b/test/v5/base/typescript-tests.ts @@ -23,7 +23,9 @@ import { makeObservable, IAtom, createAtom, - runInAction + runInAction, + flow, + flowResult } from "../../../src/mobx" import * as mobx from "../../../src/mobx" // @ts-ignore @@ -2098,3 +2100,165 @@ test("type inference of the action callback", () => { // }) // ) }) + +test("TS - it should support flow as function wrapper", done => { + const values: number[] = [] + + mobx.configure({ enforceActions: "observed" }) + + class X { + a = 1 + + constructor() { + makeObservable(this, { + a: true + }) + } + + f = flow(function* f(this: X, initial) { + this.a = initial // this runs in action + try { + this.a = yield delay(100, 5, true) // and this as well! + yield delay(100, 0) + this.a = 4 + } catch (e) { + this.a = e + } + return this.a + }) + } + + const x = new X() + mobx.reaction( + () => x.a, + v => values.push(v), + { fireImmediately: true } + ) + + const x2 = new X() + expect(x2.f).not.toBe(x.f) // not shared! + + setTimeout(() => { + x.f(2).then(v => { + let _x: number = v + // @ts-expect-error + let _y: string = v + expect(v).toBe(5) + expect(values).toEqual([1, 2, 5]) + expect(x.a).toBe(5) + done() + }) + }, 10) +}) + +test("TS - it should support flow as annotation", done => { + const values: number[] = [] + + mobx.configure({ enforceActions: "observed" }) + + class X { + a = 1 + + constructor() { + makeObservable(this, { + a: true, + f: flow + }) + } + + *f(initial) { + this.a = initial // this runs in action + try { + this.a = yield delay(100, 5, true) // and this as well! + yield delay(100, 0) + this.a = 4 + } catch (e) { + this.a = e + } + return this.a + } + } + + const x = new X() + mobx.reaction( + () => x.a, + v => values.push(v), + { fireImmediately: true } + ) + + const x2 = new X() + expect(x2.f).toBe(x.f) // shared! + + setTimeout(() => { + // Too bad... + flowResult(x.f(2)).then(v => { + let _x: number = v + // @ts-expect-error + let _y: string = v + expect(v).toBe(5) + expect(values).toEqual([1, 2, 5]) + expect(x.a).toBe(5) + done() + }) + }, 10) +}) + +test("TS - it should support flow as decorator", done => { + const values: number[] = [] + + mobx.configure({ enforceActions: "observed" }) + + class X { + @observable + a = 1 + + constructor() { + makeObservable(this) + } + + @flow + *f(initial) { + this.a = initial // this runs in action + try { + this.a = yield delay(100, 5, true) // and this as well! + yield delay(100, 0) + this.a = 4 + } catch (e) { + this.a = e + } + return this.a + } + } + + const x = new X() + mobx.reaction( + () => x.a, + v => values.push(v), + { fireImmediately: true } + ) + + const x2 = new X() + expect(x2.f).toBe(x.f) // shared! + + setTimeout(() => { + // Too bad... + flowResult(x.f(2)).then(v => { + let _x: number = v + // @ts-expect-error + let _y: string = v + expect(v).toBe(5) + expect(values).toEqual([1, 2, 5]) + expect(x.a).toBe(5) + done() + }) + }, 10) +}) + +function delay(time, value, shouldThrow = false) { + return new Promise((resolve, reject) => { + setTimeout(() => { + if (shouldThrow) reject(value) + else resolve(value) + }, time) + }) +} From cc3913e3a24dec649695a135bad0a8b3ac962a4c Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 21 Aug 2020 15:27:31 +0100 Subject: [PATCH 0501/1043] Added test for #2346 --- notes.md | 6 ++--- test/v5/base/flow.js | 1 - test/v5/base/map.js | 55 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/notes.md b/notes.md index 5c6dc8ac7..fcb8e7bc4 100644 --- a/notes.md +++ b/notes.md @@ -68,9 +68,9 @@ - [x] make `onReactionError` an option for `configure` - [ ] investigate the onbecomeunobserved issue - [x] support `flow` - - [ ] fix #2415 - - [ ] fix #2404? - - [ ] fix #2346? + - [x] fix #2415 + - [x] fix #2404? + - [x] fix #2346? - [ ] fix #2309? - [ ] - [ ] docs diff --git a/test/v5/base/flow.js b/test/v5/base/flow.js index a3593ab2e..f26227b53 100644 --- a/test/v5/base/flow.js +++ b/test/v5/base/flow.js @@ -460,7 +460,6 @@ test("it should support flow in makeAutoObservable", done => { } constructor() { - debugger mobx.makeAutoObservable(this) } } diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 4bd34128f..937ec60bf 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -1,10 +1,18 @@ "use strict" -const mobx = require("../../../src/mobx.ts") +import * as mobx from "../../../src/mobx.ts" +import { + observable, + autorun, + makeObservable, + computed, + action, + when, + runInAction +} from "../../../src/mobx.ts" + const map = mobx.observable.map -const autorun = mobx.autorun const iterall = require("iterall") -const { makeObservable } = mobx import { grabConsole } from "../../v5/utils/test-utils" test("map crud", function () { @@ -1287,3 +1295,44 @@ test("#2112 - iterators should be resilient to concurrent delete operation", () testIterator("values") testIterator("entries") }) + +test.only("2346 - subscribe to not yet existing map keys", async () => { + const events = observable([]) + + class Compute { + values = observable.map() + + @computed get get42() { + console.log("get42") + return this.get(42) + } + + constructor() { + makeObservable(this) + } + + get(k) { + if (this.values.has(k)) return this.values.get(k) + this.fetchValue(k) + return this.values.get(k) + } + + fetchValue = action(k => { + let v = k + this.values.set(k, k) + setImmediate(() => + runInAction(() => { + v *= 2 + this.values.set(k, v) + }) + ) + }) + } + + const c = new Compute() + + autorun(() => events.push(c.get42)) + + await when(() => events.length > 1) + expect(events).toEqual([42, 84]) +}) From 62020ba42b8776d5ac523bff17bb8509eb8a34da Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 21 Aug 2020 16:44:21 +0100 Subject: [PATCH 0502/1043] only trigger `onBecomeObserved` for observables that are being used from a _reactive_ context, partially fixes #2309 --- docs/faq/migrate-to-6.md | 1 + src/api/become-observed.ts | 9 ++++-- src/core/derivation.ts | 2 -- src/core/globalstate.ts | 7 +++++ src/core/observable.ts | 2 +- src/core/reaction.ts | 3 ++ test/v4/base/become-observed.ts | 13 --------- test/v5/base/become-observed.ts | 51 ++++++++++++++++++++++++++++++++- test/v5/base/map.js | 3 +- 9 files changed, 69 insertions(+), 22 deletions(-) delete mode 100644 test/v4/base/become-observed.ts diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index 08caef2fb..d0ac91f6c 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -120,3 +120,4 @@ flow can be used as annotation - The `observableArray.get()` and `observableArray.set()` methods are no longer supported. - The `IObservableObject` interface is no longer exported from MobX. - The second argument to the `reaction` effect function, the disposer object, is now passed in as third argument. The second argument is now the previous value seen by the reaction. +- `onBecomeObserved` / `onBecomeUnobserved` will no only trigger for observables that are actually used by a reaction (see [#2309](https://github.com/mobxjs/mobx/issues/2309) for background). diff --git a/src/api/become-observed.ts b/src/api/become-observed.ts index ced0ad980..057eb2567 100644 --- a/src/api/become-observed.ts +++ b/src/api/become-observed.ts @@ -6,7 +6,8 @@ import { ObservableMap, getAtom, ObservableSet, - isFunction + isFunction, + IObservableValue } from "../internal" const ON_BECOME_OBSERVED = "onBO" @@ -18,7 +19,8 @@ export function onBecomeObserved( | IComputedValue | IObservableArray | ObservableMap - | ObservableSet, + | ObservableSet + | IObservableValue, listener: Lambda ): Lambda export function onBecomeObserved( @@ -36,7 +38,8 @@ export function onBecomeUnobserved( | IComputedValue | IObservableArray | ObservableMap - | ObservableSet, + | ObservableSet + | IObservableValue, listener: Lambda ): Lambda export function onBecomeUnobserved( diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 1bedcc585..23c3f00a4 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -183,9 +183,7 @@ export function trackDerivedFunction(derivation: IDerivation, f: () => T, con bindDependencies(derivation) warnAboutDerivationWithoutDependencies(derivation) - allowStateReadsEnd(prevAllowStateReads) - return result } diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 4b5ec4812..2956184db 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -40,6 +40,13 @@ export class MobXGlobals { */ trackingDerivation: IDerivation | null = null + /** + * Currently running reaction. This determines if we currently have a reactive context. + * (Tracking derivation is also set for temporal tracking of computed values inside actions, + * but trackingReaction can only be set by a form of Reaction) + */ + trackingReaction: Reaction | null = null + /** * Each time a derivation is tracked, it is assigned a unique run-id */ diff --git a/src/core/observable.ts b/src/core/observable.ts index 5e19df18c..8544753f4 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -145,7 +145,7 @@ export function reportObserved(observable: IObservable): boolean { observable.lastAccessedBy_ = derivation.runId_ // Tried storing newObserving, or observing, or both as Set, but performance didn't come close... derivation.newObserving_![derivation.unboundDepsCount_++] = observable - if (!observable.isBeingObserved_) { + if (globalState.trackingReaction && !observable.isBeingObserved_) { observable.isBeingObserved_ = true observable.onBO() } diff --git a/src/core/reaction.ts b/src/core/reaction.ts index e48090535..8936140e2 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -130,7 +130,10 @@ export class Reaction implements IDerivation, IReactionPublic { }) } this.isRunning_ = true + const prevReaction = globalState.trackingReaction // reactions could create reactions... + globalState.trackingReaction = this const result = trackDerivedFunction(this, fn, undefined) + globalState.trackingReaction = prevReaction this.isRunning_ = false this.isTrackPending_ = false if (this.isDisposed_) { diff --git a/test/v4/base/become-observed.ts b/test/v4/base/become-observed.ts deleted file mode 100644 index 5d600283b..000000000 --- a/test/v4/base/become-observed.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { autorun, onBecomeObserved, observable } from "../mobx4" - -describe("become-observed", () => { - it("work on map with number as key", () => { - const oMap = observable.map() - const key = 1 - oMap.set(key, observable.box("value")) - const cb = jest.fn() - onBecomeObserved(oMap, key, cb) - autorun(() => oMap.get(key)) - expect(cb).toBeCalled() - }) -}) diff --git a/test/v5/base/become-observed.ts b/test/v5/base/become-observed.ts index 237abe1f2..6be2ba318 100644 --- a/test/v5/base/become-observed.ts +++ b/test/v5/base/become-observed.ts @@ -1,4 +1,12 @@ -import { autorun, onBecomeObserved, observable } from "../../../src/mobx" +import { + autorun, + onBecomeObserved, + observable, + computed, + action, + makeObservable, + onBecomeUnobserved +} from "../../../src/mobx" describe("become-observed", () => { it("work on map with number as key", () => { @@ -11,3 +19,44 @@ describe("become-observed", () => { expect(cb).toBeCalled() }) }) + +test("#2309 don't trigger oBO for computeds that aren't subscribed to", () => { + const events: string[] = [] + + class Asd { + @observable prop = 42 + + @computed + get computed() { + return this.prop + } + + @action + actionProp() { + const foo = this.prop + } + + @action + actionComputed() { + const bar = this.computed + } + + constructor() { + makeObservable(this) + } + } + + const asd = new Asd() + onBecomeObserved(asd, "prop", () => { + events.push("onBecomeObserved") + }) + + onBecomeUnobserved(asd, "prop", () => { + events.push("onBecomeUnobserved") + }) + + asd.actionProp() + events.push("--") + asd.actionComputed() + expect(events).toEqual(["--"]) +}) diff --git a/test/v5/base/map.js b/test/v5/base/map.js index 937ec60bf..2b5407431 100644 --- a/test/v5/base/map.js +++ b/test/v5/base/map.js @@ -1296,14 +1296,13 @@ test("#2112 - iterators should be resilient to concurrent delete operation", () testIterator("entries") }) -test.only("2346 - subscribe to not yet existing map keys", async () => { +test("2346 - subscribe to not yet existing map keys", async () => { const events = observable([]) class Compute { values = observable.map() @computed get get42() { - console.log("get42") return this.get(42) } From 5536533ed26d6bd8c7989b49990994daa3831009 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 21 Aug 2020 17:21:09 +0100 Subject: [PATCH 0503/1043] Made onBecomeObserved behavior consistent by making keepAlive computeds possible reactiveContexts. Fixed #2309 --- notes.md | 5 +- src/core/computedvalue.ts | 16 ++- src/core/derivation.ts | 2 + src/core/globalstate.ts | 3 +- src/core/observable.ts | 2 +- src/core/reaction.ts | 6 +- test/v5/base/become-observed.ts | 209 ++++++++++++++++++++++++++++++++ 7 files changed, 232 insertions(+), 11 deletions(-) diff --git a/notes.md b/notes.md index fcb8e7bc4..eb5af058c 100644 --- a/notes.md +++ b/notes.md @@ -66,13 +66,12 @@ - [x] ~add deprecation messages to latest mobx 5~ tricky; a lot of the api's are valid in v5 without alternative, so wouldn't result in actionable hints if the user doesn't intent to upgrade to v6 - [x] merge 2398 - [x] make `onReactionError` an option for `configure` - - [ ] investigate the onbecomeunobserved issue + - [x] investigate the onbecomeunobserved issue - [x] support `flow` - [x] fix #2415 - [x] fix #2404? - [x] fix #2346? - - [ ] fix #2309? - - [ ] + - [x] fix #2309? - [ ] docs - [ ] clean up docs - [ ] fix interactive tut diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 336b18789..1bf5dffbf 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -100,7 +100,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva scope_: Object | undefined private equals_: IEqualsComparer private requiresReaction_: boolean - private keepAlive_: boolean + keepAlive_: boolean /** * Create a new computed value based on a function expression. @@ -154,7 +154,12 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva */ public get(): T { if (this.isComputing_) die(32, this.name_, this.derivation_) - if (globalState.inBatch === 0 && this.observers_.size === 0 && !this.keepAlive_) { + if ( + globalState.inBatch === 0 && + // !globalState.trackingDerivatpion && + this.observers_.size === 0 && + !this.keepAlive_ + ) { if (shouldCompute(this)) { this.warnAboutUntrackedRead_() startBatch() // See perf test 'computed memoization' @@ -163,7 +168,12 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } } else { reportObserved(this) - if (shouldCompute(this)) if (this.trackAndCompute_()) propagateChangeConfirmed(this) + if (shouldCompute(this)) { + let prevTrackingContext = globalState.trackingContext + if (this.keepAlive_ && !prevTrackingContext) globalState.trackingContext = this + if (this.trackAndCompute_()) propagateChangeConfirmed(this) + globalState.trackingContext = prevTrackingContext + } } const result = this.value_! diff --git a/src/core/derivation.ts b/src/core/derivation.ts index 23c3f00a4..724c360b8 100644 --- a/src/core/derivation.ts +++ b/src/core/derivation.ts @@ -169,6 +169,7 @@ export function trackDerivedFunction(derivation: IDerivation, f: () => T, con derivation.runId_ = ++globalState.runId const prevTracking = globalState.trackingDerivation globalState.trackingDerivation = derivation + globalState.inBatch++ let result if (globalState.disableErrorBoundaries === true) { result = f.call(context) @@ -179,6 +180,7 @@ export function trackDerivedFunction(derivation: IDerivation, f: () => T, con result = new CaughtException(e) } } + globalState.inBatch-- globalState.trackingDerivation = prevTracking bindDependencies(derivation) diff --git a/src/core/globalstate.ts b/src/core/globalstate.ts index 2956184db..6531662c0 100644 --- a/src/core/globalstate.ts +++ b/src/core/globalstate.ts @@ -1,4 +1,5 @@ import { IDerivation, IObservable, Reaction, die, getGlobal } from "../internal" +import { ComputedValue } from "./computedvalue" /** * These values will persist if global state is reset @@ -45,7 +46,7 @@ export class MobXGlobals { * (Tracking derivation is also set for temporal tracking of computed values inside actions, * but trackingReaction can only be set by a form of Reaction) */ - trackingReaction: Reaction | null = null + trackingContext: Reaction | ComputedValue | null = null /** * Each time a derivation is tracked, it is assigned a unique run-id diff --git a/src/core/observable.ts b/src/core/observable.ts index 8544753f4..60696c27d 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -145,7 +145,7 @@ export function reportObserved(observable: IObservable): boolean { observable.lastAccessedBy_ = derivation.runId_ // Tried storing newObserving, or observing, or both as Set, but performance didn't come close... derivation.newObserving_![derivation.unboundDepsCount_++] = observable - if (globalState.trackingReaction && !observable.isBeingObserved_) { + if (!observable.isBeingObserved_ && globalState.trackingContext) { observable.isBeingObserved_ = true observable.onBO() } diff --git a/src/core/reaction.ts b/src/core/reaction.ts index 8936140e2..dd8728908 100644 --- a/src/core/reaction.ts +++ b/src/core/reaction.ts @@ -130,10 +130,10 @@ export class Reaction implements IDerivation, IReactionPublic { }) } this.isRunning_ = true - const prevReaction = globalState.trackingReaction // reactions could create reactions... - globalState.trackingReaction = this + const prevReaction = globalState.trackingContext // reactions could create reactions... + globalState.trackingContext = this const result = trackDerivedFunction(this, fn, undefined) - globalState.trackingReaction = prevReaction + globalState.trackingContext = prevReaction this.isRunning_ = false this.isTrackPending_ = false if (this.isDisposed_) { diff --git a/test/v5/base/become-observed.ts b/test/v5/base/become-observed.ts index 6be2ba318..f4fb72cf1 100644 --- a/test/v5/base/become-observed.ts +++ b/test/v5/base/become-observed.ts @@ -60,3 +60,212 @@ test("#2309 don't trigger oBO for computeds that aren't subscribed to", () => { asd.actionComputed() expect(events).toEqual(["--"]) }) + +describe("#2309 onBecomeObserved inconsistencies", () => { + let events: string[] = [] + + beforeEach(() => { + events = [] + }) + + test("caseA", () => { + // Computed {keepAlive: false} -> Observable + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + expect(events).toEqual([]) + ca.get() + expect(events).toEqual([]) + }) + + test("caseB", () => { + // Computed {keepAlive: false} -> Computed {keepAlive: false} -> Observable + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + const cb = computed( + () => { + return ca.get() * 2 + }, + { keepAlive: false } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + onBecomeObserved(cb, () => events.push(`cb observed`)) + onBecomeUnobserved(cb, () => events.push(`cb unobserved`)) + expect(events).toEqual([]) + cb.get() + expect(events).toEqual([]) + }) + + test("caseC", () => { + // Computed {keepAlive: true} -> Observable + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: true } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + expect(events).toEqual([]) + ca.get() + expect(events).toEqual(["o observed"]) // everything is hot, and 'o' is really observed so that the keptAlive computed knows about its state + }) + + test("caseD", () => { + // Computed {keepAlive: true} -> Computed {keepAlive: false} -> Observable + // logs: `o observed` + // potential issue: why are the callbacks not called on `ca` ? + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + const cb = computed( + () => { + return ca.get() * 2 + }, + { keepAlive: true } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + onBecomeObserved(cb, () => events.push(`cb observed`)) + onBecomeUnobserved(cb, () => events.push(`cb unobserved`)) + expect(events).toEqual([]) + cb.get() + expect(events).toEqual(["ca observed", "o observed"]) // see above + }) + + test("caseE - base", () => { + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + const cb = computed( + () => { + return ca.get() * 2 + }, + { keepAlive: false } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + onBecomeObserved(cb, () => events.push(`cb observed`)) + onBecomeUnobserved(cb, () => events.push(`cb unobserved`)) + + const u = autorun(() => cb.get()) + u() + expect(events).toEqual([ + "cb observed", + "ca observed", + "o observed", + "cb unobserved", + "ca unobserved", + "o unobserved" + ]) + }) + + test("caseE", () => { + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + const cb = computed( + () => { + return ca.get() * 2 + }, + { keepAlive: true } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + onBecomeObserved(cb, () => events.push(`cb observed`)) + onBecomeUnobserved(cb, () => events.push(`cb unobserved`)) + + const u = autorun(() => cb.get()) + u() + // Note that at this point the observables never become unobserved anymore! + // That is correct, because if doing our kept-alive computed doesn't recompute until reobserved, + // itself it is still observing all the values of its own deps to figure whether it is still + // up to date or not + expect(events).toEqual(["cb observed", "ca observed", "o observed", "cb unobserved"]) + + events.splice(0) + const u2 = autorun(() => cb.get()) + u2() + expect(events).toEqual(["cb observed", "cb unobserved"]) + }) + + test("caseF", () => { + // Computed {keepAlive: true} -> Computed {keepAlive: false} -> Observable + // cb.get() first then autorun() then unsub() + const o = observable.box(1) + const ca = computed( + () => { + return o.get() + }, + { keepAlive: false } + ) + + const cb = computed( + () => { + return ca.get() * 2 + }, + { keepAlive: true } + ) + + onBecomeObserved(o, () => events.push(`o observed`)) + onBecomeUnobserved(o, () => events.push(`o unobserved`)) + onBecomeObserved(ca, () => events.push(`ca observed`)) + onBecomeUnobserved(ca, () => events.push(`ca unobserved`)) + onBecomeObserved(cb, () => events.push(`cb observed`)) + onBecomeUnobserved(cb, () => events.push(`cb unobserved`)) + cb.get() + + expect(events).toEqual(["ca observed", "o observed"]) + events.splice(0) + const u = autorun(() => cb.get()) + u() + expect(events).toEqual(["cb observed", "cb unobserved"]) + }) +}) From 289e2bcc443a617a41a96fe5ad9cc67ac88055ee Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 21 Aug 2020 22:19:40 +0100 Subject: [PATCH 0504/1043] Small fixes based on mobx-utils migration --- notes.md | 6 +++--- package.json | 2 +- packages/mobx-undecorate/package.json | 2 +- src/api/computed.ts | 5 +++-- src/core/computedvalue.ts | 14 +++++++------- src/core/observable.ts | 2 +- src/mobx.ts | 2 ++ src/types/observablearray.ts | 4 ++-- 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/notes.md b/notes.md index eb5af058c..ced01fb0b 100644 --- a/notes.md +++ b/notes.md @@ -91,10 +91,10 @@ - [ ] post 6.0 - [ ] make cheatsheet - [ ] support mobx-utils `computedFn` as annotation? - - [ ] merge https://github.com/mobxjs/mobx/pull/2389 - - [ ] set up discussions + - [x] merge https://github.com/mobxjs/mobx/pull/2389 + - [x] set up discussions - [ ] use autObservable options for codemod (if no superclass)? - - [ ] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 + - [x] add a solution for keepAlive computeds like https://github.com/mobxjs/mobx/issues/2309#issuecomment-598707584 - [ ] set up continous delivery - [ ] support chrome formatter https://www.mattzeunert.com/2016/02/19/custom-chrome-devtools-object-formatters.html also in Immer? diff --git a/package.json b/package.json index dfa9ef0d5..59f0b2bc0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "6.0.0-rc.1", + "version": "6.0.0-rc.3", "description": "Simple, scalable state management.", "main": "dist/index.js", "module": "dist/mobx.esm.js", diff --git a/packages/mobx-undecorate/package.json b/packages/mobx-undecorate/package.json index 38829d381..bb8f9cba9 100644 --- a/packages/mobx-undecorate/package.json +++ b/packages/mobx-undecorate/package.json @@ -1,6 +1,6 @@ { "name": "mobx-undecorate", - "version": "0.0.5", + "version": "0.0.6", "description": "Migrate MobX 4/5 to MobX 6", "bin": "cli.js", "scripts": { diff --git a/src/api/computed.ts b/src/api/computed.ts index 1ab98fceb..52fc147a4 100644 --- a/src/api/computed.ts +++ b/src/api/computed.ts @@ -8,7 +8,8 @@ import { isPlainObject, isFunction, assign, - die + die, + IComputedValue } from "../internal" export const COMPUTED = "computed" @@ -18,7 +19,7 @@ export interface IComputedFactory extends Annotation, PropertyDecorator { // @computed(opts) (options: IComputedValueOptions): Annotation & PropertyDecorator // computed(fn, opts) - (func: () => T, options?: IComputedValueOptions): ComputedValue + (func: () => T, options?: IComputedValueOptions): IComputedValue struct: Annotation & PropertyDecorator } diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 1bf5dffbf..4e2220f7a 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -94,7 +94,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva triggeredBy_?: string isComputing_: boolean = false // to check for cycles isRunningSetter_: boolean = false - derivation_: () => T + derivation: () => T setter_?: (value: T) => void isTracing_: TraceMode = TraceMode.NONE scope_: Object | undefined @@ -116,7 +116,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva */ constructor(options: IComputedValueOptions) { if (!options.get) die(31) - this.derivation_ = options.get! + this.derivation = options.get! this.name_ = options.name || "ComputedValue@" + getNextId() if (options.set) this.setter_ = createAction(this.name_ + "-setter", options.set) as any this.equals_ = @@ -153,7 +153,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva * Will evaluate its computation first if needed. */ public get(): T { - if (this.isComputing_) die(32, this.name_, this.derivation_) + if (this.isComputing_) die(32, this.name_, this.derivation) if ( globalState.inBatch === 0 && // !globalState.trackingDerivatpion && @@ -229,13 +229,13 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva const prev = allowStateChangesStart(false) let res: T | CaughtException if (track) { - res = trackDerivedFunction(this, this.derivation_, this.scope_) + res = trackDerivedFunction(this, this.derivation, this.scope_) } else { if (globalState.disableErrorBoundaries === true) { - res = this.derivation_.call(this.scope_) + res = this.derivation.call(this.scope_) } else { try { - res = this.derivation_.call(this.scope_) + res = this.derivation.call(this.scope_) } catch (e) { res = new CaughtException(e) } @@ -294,7 +294,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } toString() { - return `${this.name_}[${this.derivation_.toString()}]` + return `${this.name_}[${this.derivation.toString()}]` } valueOf(): T { diff --git a/src/core/observable.ts b/src/core/observable.ts index 60696c27d..047cf6cab 100644 --- a/src/core/observable.ts +++ b/src/core/observable.ts @@ -252,7 +252,7 @@ You are entering this break point because derivation '${derivation.name_}' is be Just follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update The stackframe you are looking for is at least ~6-8 stack-frames up. -${derivation instanceof ComputedValue ? derivation.derivation_.toString().replace(/[*]\//g, "/") : ""} +${derivation instanceof ComputedValue ? derivation.derivation.toString().replace(/[*]\//g, "/") : ""} The dependencies for this derivation are: diff --git a/src/mobx.ts b/src/mobx.ts index d7083e19b..fc4aa9644 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -53,6 +53,8 @@ export { IObservableArray, IArrayWillChange, IArrayWillSplice, + IArraySplice, + IArrayUpdate, IArrayDidChange, isObservableArray, IKeyValueMap, diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index 420b03126..2a0a1d810 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -52,13 +52,13 @@ interface IArrayBaseChange { export type IArrayDidChange = IArrayUpdate | IArraySplice -interface IArrayUpdate extends IArrayBaseChange { +export interface IArrayUpdate extends IArrayBaseChange { type: "update" newValue: T oldValue: T } -interface IArraySplice extends IArrayBaseChange { +export interface IArraySplice extends IArrayBaseChange { type: "splice" added: T[] addedCount: number From 2f5f91c2ac46e4ba490be02645027e04049194d4 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Sat, 22 Aug 2020 16:58:51 +0100 Subject: [PATCH 0505/1043] Fixed some more compatibility issues --- notes.md | 6 +++++- package.json | 2 +- src/core/computedvalue.ts | 7 ++++--- src/mobx.ts | 4 +++- src/types/observablevalue.ts | 5 +++++ 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/notes.md b/notes.md index ced01fb0b..f44e857e1 100644 --- a/notes.md +++ b/notes.md @@ -72,6 +72,8 @@ - [x] fix #2404? - [x] fix #2346? - [x] fix #2309? + - [x] upgrade mobx-utils + - [x] upgrade mobx-state-tree - [ ] docs - [ ] clean up docs - [ ] fix interactive tut @@ -83,11 +85,13 @@ - [ ] better sel page - [ ] link flutter, lit, angular - [ ] update footer -- [ ] mobx-react +- [ ] mobx-react-lite - [ ] displayname for observer components facebook/react#18026 - [ ] update useLocalStore in mobx-react-lite to use autoMakeObservable - [ ] fix React unstable batch setup + - [ ] mobx-react + - [ ] deprecate useAsObservableSource direct usage? - [ ] post 6.0 - [ ] make cheatsheet - [ ] support mobx-utils `computedFn` as annotation? diff --git a/package.json b/package.json index 59f0b2bc0..48d6bcd5c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "6.0.0-rc.3", + "version": "6.0.0-rc.7", "description": "Simple, scalable state management.", "main": "dist/index.js", "module": "dist/mobx.esm.js", diff --git a/src/core/computedvalue.ts b/src/core/computedvalue.ts index 4e2220f7a..2f2775652 100644 --- a/src/core/computedvalue.ts +++ b/src/core/computedvalue.ts @@ -94,7 +94,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva triggeredBy_?: string isComputing_: boolean = false // to check for cycles isRunningSetter_: boolean = false - derivation: () => T + derivation: () => T // N.B: unminified as it is used by MST setter_?: (value: T) => void isTracing_: TraceMode = TraceMode.NONE scope_: Object | undefined @@ -171,7 +171,7 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva if (shouldCompute(this)) { let prevTrackingContext = globalState.trackingContext if (this.keepAlive_ && !prevTrackingContext) globalState.trackingContext = this - if (this.trackAndCompute_()) propagateChangeConfirmed(this) + if (this.trackAndCompute()) propagateChangeConfirmed(this) globalState.trackingContext = prevTrackingContext } } @@ -193,7 +193,8 @@ export class ComputedValue implements IObservable, IComputedValue, IDeriva } else die(34, this.name_) } - private trackAndCompute_(): boolean { + trackAndCompute(): boolean { + // N.B: unminified as it is used by MST const oldValue = this.value_ const wasSuspended = /* see #1208 */ this.dependenciesState_ === IDerivationState_.NOT_TRACKING_ diff --git a/src/mobx.ts b/src/mobx.ts index fc4aa9644..e2b66a60e 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -132,7 +132,9 @@ export { allowStateReadsEnd as _allowStateReadsEnd, makeObservable, makeAutoObservable, - autoAction as _autoAction + autoAction as _autoAction, + AnnotationsMap, + AnnotationMapEntry } from "./internal" // Devtools support diff --git a/src/types/observablevalue.ts b/src/types/observablevalue.ts index 066f305ad..2241f51d1 100644 --- a/src/types/observablevalue.ts +++ b/src/types/observablevalue.ts @@ -165,6 +165,11 @@ export class ObservableValue extends Atom return registerListener(this, listener) } + raw() { + // used by MST ot get undehanced value + return this.value_ + } + toJSON() { return this.get() } From ca40b7f7abab7f3110b382473967c678bb6bcad0 Mon Sep 17 00:00:00 2001 From: Chase Manning Date: Tue, 25 Aug 2020 23:15:40 +1200 Subject: [PATCH 0506/1043] Fixed Formatting Issue with Sponsor Monthly Amount (#2435) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d68d4f81..5b09536ba 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ _Simple, scalable state management_ --- -MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for 100\$/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). +MobX is proudly sponsored by Mendix, Coinbase, Facebook Open Source, Canva, Algolia, Guilded, Auction Frontier, Mantro and TalentPlot for \$100/month or more! And beyond that by many [individual backers](#backers) and through [one time contributions](https://github.com/mobxjs/mobx/blob/master/sponsors.md). **🥇Gold sponsors (\$3000+ total contribution):**
    Mendix From b37d3c6405cbe5fd304a418fb5aa7a48554dd599 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 10 Sep 2020 20:02:48 +0100 Subject: [PATCH 0507/1043] some notes --- notes.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/notes.md b/notes.md index f44e857e1..b00d75bef 100644 --- a/notes.md +++ b/notes.md @@ -85,13 +85,14 @@ - [ ] better sel page - [ ] link flutter, lit, angular - [ ] update footer + - [ ] don't proxy objects tip, makeAutoObservable vs observable - [ ] mobx-react-lite - - [ ] displayname for observer components facebook/react#18026 - - [ ] update useLocalStore in mobx-react-lite to use + - [x] displayname for observer components facebook/react#18026. Fixed: https://github.com/facebook/react/issues/18026 + - [x] update useLocalStore in mobx-react-lite to use autoMakeObservable - - [ ] fix React unstable batch setup - - [ ] mobx-react - - [ ] deprecate useAsObservableSource direct usage? + - [x] fix React unstable batch setup + - [x] mobx-react + - [x] deprecate useAsObservableSource direct usage? - [ ] post 6.0 - [ ] make cheatsheet - [ ] support mobx-utils `computedFn` as annotation? @@ -157,6 +158,10 @@ Why declare fields - not two ways to learn everything - ease to re-decorate once decorators are standardized, still working on that! +useObserver deprecation: +A very simple example: if you have a hook `useUser` which goes like `useObserver(() => state.user`, that looks fine, but actually, if you use that to render the user's name (e.g. `const user = useUser(); return
    {user.name}
    `, it won't pick up updates to `user.name`, but only updates on `store.user` reassignments. That is very confusing and very suboptimal. No you can fix that by changing your hook to create a shallow copy fo user, like `useObserver(() => ({...store.user})`, but that defeats the MobX purpose as well, as now you will be over subscribing and re-render the user.name when his `age` changes. So using `useObserver` in other hooks is likely to under or over-subscribe, or not really reusable anymore and just restating the render deps that MobX can already perfectly determine for you. E.g. `{() =>
    {store.user.name}
    }
    ` instead will subscribe to exactly the relevant things. +For migration: wrapping observer around the callers of your hook should typically do the trick, observer tracks through hook invocations. + ## Mobx Size ## Original: From 6086cebd4ffc4bf3d047c32f28b79b2f23d397aa Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 10 Sep 2020 22:43:22 +0100 Subject: [PATCH 0508/1043] Better intro, and explanation about useEffect --- docs/README.md | 110 ++-- .../flow.excalidraw..excalidraw..excalidraw | 606 ++++++++++++++++++ docs/assets/flow2.png | Bin 0 -> 482175 bytes docs/react/react-integration.md | 94 ++- docs/refguide/autorun.md | 6 +- notes.md | 4 + website/static/css/custom.css | 21 +- 7 files changed, 764 insertions(+), 77 deletions(-) create mode 100644 docs/assets/flow.excalidraw..excalidraw..excalidraw create mode 100644 docs/assets/flow2.png diff --git a/docs/README.md b/docs/README.md index fe5e7ff60..1a3924ede 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,13 +10,10 @@ hide_title: true _Simple, scalable state management_ -[![Build Status](https://travis-ci.org/mobxjs/mobx.svg?branch=master)](https://travis-ci.org/mobxjs/mobx) -[![Coverage Status](https://coveralls.io/repos/mobxjs/mobx/badge.svg?branch=master&service=github)](https://coveralls.io/github/mobxjs/mobx?branch=master) -[![Join the chat at https://gitter.im/mobxjs/mobx](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mobxjs/mobx?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Discuss MobX on Hashnode](https://hashnode.github.io/badges/mobx.svg)](https://hashnode.com/n/mobx) +[![Discuss on Github](https://img.shields.io/badge/discuss%20on-GitHub-orange)](https://github.com/mobxjs/mobx/discussions) +[![npm version](https://badge.fury.io/js/mobx.svg)](https://badge.fury.io/js/mobx) [![OpenCollective](https://opencollective.com/mobx/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/mobx/sponsors/badge.svg)](#sponsors) -[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) --- @@ -46,12 +43,6 @@ MobX is made possible by the generosity of the sponsors below, and many [individ --- -## Installation - -Installation: `npm install mobx --save`. For the React bindings: `npm install mobx-react --save`. - -For more options see the [installation page](intro/installation.md). - ## Introduction MobX is a battle tested library that makes state management simple and scalable by transparently applying functional reactive programming (TFRP). @@ -59,21 +50,42 @@ The philosophy behind MobX is very simple: _Anything that can be derived from the application state, should be derived. Automatically._ -which includes the UI, data serialization, server communication, etc. - -MobX unidirectional flow - -TODO: clean this up - -Easy to read, easy to write. Optimized out of the box. - -React and MobX together are a powerful combination. React renders the application state by providing mechanisms to translate it into a tree of renderable components. MobX provides the mechanism to store and update the application state that React then uses. - -Both React and MobX provide an optimal and unique solutions to common problems in application development. React provides mechanisms to optimally render UI by using a virtual DOM that reduces the number of costly DOM mutations. MobX provides mechanisms to optimally synchronize application state with your React components by building a reactive dependency tree that is only updated when strictly needed and is never stale. MobX will optimize your React components for you, without needing to specify data dependencies, use `memo`, or refactoring states or contexts to make things optimal. - -In fact, with MobX state can be completely separated from your UI layer. This makes testing much simpler and enables code sharing between stacks and frameworks, and leads to a natural separation of concerns. - -## Example +
    +
    +
    😙
    +
    +
    Straight forward code
    +

    With MobX you write minimalistic, boilerplate free code that captures your intent: + Trying to update a record field? Use a good old JavaScript assignment. + Updating data in an asynchronous process? No special tools are needed. + The reactivity system will detect all your changes and propagate them where needed. +

    +
    +
    +
    +
    🚅
    +
    +
    Optimal rendering without effort
    +

    + MobX tracks all updates and usages of your data and runtime, to build a dependency tree that captures all relations between state and output. + This makes sure that computations depending on your state, like React components, run never more than strictly needed. + With MobX there is no need to manually optimize components using error-prone and sub-optimal techniques like memoization and selectors. +

    +
    +
    +
    +
    🤹🏻‍♂️
    +
    +
    Architectural freedom
    +

    + MobX is unopionated and allows you to manage your application state outside any UI framework. + This makes your code decoupled, portable, and above all, easily testable. +

    +
    +
    +
    + +## A quick example So what does code that uses MobX look like? @@ -83,7 +95,7 @@ import ReactDOM from "react-dom" import { makeAutoObservable } from "mobx" import { observer } from "mobx-react" -// define application state +// Model the application state class Timer { secondsPassed = 0 @@ -102,19 +114,33 @@ class Timer { const myTimer = new Timer() -setInterval(() => { - myTimer.increaseTimer() -}, 1000) - +// Build a user interface for this app, that merely uses the state... const TimerView = observer(({ timer }) => ( )) ReactDOM.render(, document.body) + +// For demo's sake, let's force some updates... +setInterval(() => { + myTimer.increaseTimer() +}, 1000) ``` +In the above example, the `observer` wrapper around the React component will automatically detect that the rendering +of the component depends on `timer.secondsPassed`. +Even though this relationship is defined nowhere explicitly, MobX's reactivity system will make sure the component gets re-rendered when _precisely that_ field is updated inthe future. + +## Core concepts + +MobX unidirectional flow + +The above diagram is the conceptual picture you can apply to the above example and any other application using MobX. +Every event (the `onClick` and `setInterval`) invokes an _action_ (`increaseTimer` or `resetTimer`) that updates _observable state_ (`secondsPassed`). +Changes in the observable state are propagated precisely to all _computations_ and _side-effects_ (the `TimerView` component) that depend on the changes made. + To learn about the core concepts of MobX with a larger example, please read [Concepts & Principles](http://mobxjs.github.io/mobx/intro/concepts.html) or take the [10 minute interactive introduction to MobX and React](https://mobx.js.org/getting-started). -Read on to learn about some of the benefits of using MobX. +The philosophy and benefits of the mental model provided by MobX are described in detail in the blogs [UI as an afterthought](https://michel.codes/blogs/ui-as-an-afterthought) and [How to decouple state and UI (a.k.a. you don’t need componentWillMount)](https://hackernoon.com/how-to-decouple-state-and-ui-a-k-a-you-dont-need-componentwillmount-cc90b787aa37). ## What others are saying... @@ -124,30 +150,10 @@ Read on to learn about some of the benefits of using MobX. > Working with #mobx is basically a continuous loop of me going “this is way too simple, it definitely won’t work” only to be proven wrong -> Try react-mobx with es6 and you will love it so much that you will hug someone. - > I have built big apps with MobX already and comparing to the one before that which was using Redux, it is simpler to read and much easier to reason about. > The #mobx is the way I always want things to be! It's really surprising simple and fast! Totally awesome! Don't miss it! -## The benefits of MobX - -TODO: clean this up, and move up, merge with intro section? - -MobX is one of the least obtrusive libraries you can use for state management. That makes the `MobX` approach not just simple, but very scalable as well. It has caused many well known companies to adopt MobX, which is used at companies like Microsoft, Amazon, Netflix, EA Games and [many more](https://github.com/mobxjs/mobx/issues/681). - -The reason for MobX's popularity boil down to this: _With MobX you write typically less and more straight-forward code, that is better optimized than comparable solutions_. In other words, it maximizes productivity. - -- **Mutable Data < Immutable Data < Observable Data**. Immutability is too often seen as silver bullet in programming. While it is justified in many cases, for stateful data or CRUD operations it is often a mismatch. Re-creating an object just to modify one of its attributes is not only cognitive challenging, it is inefficient as well. It does make change detection easy. But only compared to 'classic' mutable data. Observable data will pick up changes without any diffing. At all. And you will always be looking at the latest version. From anywhere. -- **Simpler actions are easier to read and maintain**. As demonstrated above, modifying state when using MobX is very straightforward. You write down your intentions imperatively. And MobX will make sure no mutation will goes undetected. -- **Fine grained observability is efficient**. MobX is a reactive library that builds a graph of all the derivations in your application to find the least number of re-computations that is needed to prevent staleness. By performing runtime analysis it will optimize at a much finer granularity than any programmer would to by hand. -- **Access any observable anywhere**. If an observable is used in a reactive context, MobX will track it. Regardless how it got there; through a closure, module import, React component prop or context? It doesn't matter. That keeps things simple and guarantees architectural freedom. This doesn't mean that there shouldn't be any limitations on how data is organized. But the limitations shouldn't be driven by the limitations of the state management libraries, but rather by the conceptual design decisions your team makes. -- **Structure state using any common language construct**. With MobX you don't need to normalize your data. This makes the library very suitable for very complex domain models (At Mendix for example ~500 different domain classes in a single application). MobX has few opinions, so you are free to either use classes or plain old objects. To store direct references or just identifiers. -- **Easy interoperability**. MobX works with enriched but plain javascript structures. Due to its unobtrusiveness it works with most javascript libraries out of the box, without needing MobX specific flavors. So you can simply keep using promises, async/await, generators, your existing router, data fetching, and utility libraries like `react-router`, `director`, `superagent`, `lodash` etc. -- **Asynchronous processes aren't special**. They are merely multiple synchronous actions spread over time. Because observable data structures allow you to hold on to references, asynchronous processes aren't more complicated than they should be. - -The philosophy and benefits of the mental model provided by MobX are described in detail in the blogs [UI as an afterthought](https://michel.codes/blogs/ui-as-an-afterthought) and [How to decouple state and UI (a.k.a. you don’t need componentWillMount)](https://hackernoon.com/how-to-decouple-state-and-ui-a-k-a-you-dont-need-componentwillmount-cc90b787aa37). - ## Further resources and documentation - [Ten minute, interactive MobX + React tutorial](https://mobx.js.org/getting-started) diff --git a/docs/assets/flow.excalidraw..excalidraw..excalidraw b/docs/assets/flow.excalidraw..excalidraw..excalidraw new file mode 100644 index 000000000..09244e39e --- /dev/null +++ b/docs/assets/flow.excalidraw..excalidraw..excalidraw @@ -0,0 +1,606 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "umJvYNbrYyosAii0TCe8X", + "type": "ellipse", + "x": 600.93359375, + "y": 295.0234375, + "width": 166, + "height": 98.13671875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 798279679, + "version": 61, + "versionNonce": 534261841, + "isDeleted": false, + "boundElementIds": [ + "SQTF1dyrT_6IGmfEPfDFk", + "Qs4t0BM0S_4Pke8rNKbmD", + "c9iGYLrlWNl56Bq2qFVR3" + ] + }, + { + "id": "tMxgXvq5-KCTnP_iTfUt8", + "type": "text", + "x": 648.93359375, + "y": 331.826171875, + "width": 70, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1329095185, + "version": 11, + "versionNonce": 637794161, + "isDeleted": false, + "boundElementIds": null, + "text": "Actions", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 18 + }, + { + "id": "fESH7TjYaPiRAXCLgu6gj", + "type": "ellipse", + "x": 889.2734375, + "y": 293.07421875, + "width": 153.390625, + "height": 97.08984375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#228be6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 754120735, + "version": 162, + "versionNonce": 277796639, + "isDeleted": false, + "boundElementIds": [ + "SQTF1dyrT_6IGmfEPfDFk", + "Gfe2kVUk-oe4nZFYZ4TS2" + ] + }, + { + "id": "YNybqj5LHUYEaaw-npqM0", + "type": "text", + "x": 913.22265625, + "y": 316.373046875, + "width": 105, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1139926705, + "version": 92, + "versionNonce": 806532223, + "isDeleted": false, + "boundElementIds": null, + "text": "Observable\nState", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 43 + }, + { + "id": "Rp_m5EtBqLK880zk0HPes", + "type": "ellipse", + "x": 1168.73046875, + "y": 287.671875, + "width": 152.62109375, + "height": 101.0078125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#82c91e", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 979115551, + "version": 137, + "versionNonce": 842295903, + "isDeleted": false, + "boundElementIds": [ + "Gfe2kVUk-oe4nZFYZ4TS2", + "muBFJlzUT62Z5u6vtgoPo" + ] + }, + { + "id": "bUQmcBczRpetKGA2QAQOC", + "type": "text", + "x": 1198.294921875, + "y": 313.17578125, + "width": 93, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 21397215, + "version": 89, + "versionNonce": 275028479, + "isDeleted": false, + "boundElementIds": null, + "text": "Computed\nValues", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 43 + }, + { + "id": "2iAmN0ThUq3khqXmobwXR", + "type": "ellipse", + "x": 1440.24609375, + "y": 280.24609375, + "width": 180, + "height": 97.82421875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fa5252", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 155797873, + "version": 93, + "versionNonce": 1218509617, + "isDeleted": false, + "boundElementIds": [ + "muBFJlzUT62Z5u6vtgoPo", + "YsOB3_rayI5zJZmc-0vka", + "MwGF75DmHeJQFvsbtXTC3", + "c9iGYLrlWNl56Bq2qFVR3" + ] + }, + { + "id": "-ksRGDFon1_cAw4yzn-NY", + "type": "text", + "x": 1468.4375, + "y": 303.76953125, + "width": 122, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 919383807, + "version": 107, + "versionNonce": 1840129151, + "isDeleted": false, + "boundElementIds": null, + "text": "Side-effects\n(like render)", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 43 + }, + { + "id": "SQTF1dyrT_6IGmfEPfDFk", + "type": "arrow", + "x": 778.8445740250362, + "y": 346.239580272118, + "width": 99.00070983588682, + "height": 1.6378151789648427, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1143683505, + "version": 44, + "versionNonce": 965939217, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 99.00070983588682, + -1.6378151789648427 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "umJvYNbrYyosAii0TCe8X", + "focus": 0.07806863034707597, + "gap": 11.969792579631289 + }, + "endBinding": { + "elementId": "fESH7TjYaPiRAXCLgu6gj", + "focus": -0.031398466371432183, + "gap": 11.536940281179355 + } + }, + { + "id": "Gfe2kVUk-oe4nZFYZ4TS2", + "type": "arrow", + "x": 1053.9983652852434, + "y": 343.1772085606117, + "width": 106.42230116522956, + "height": 0.10172927196111914, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1805338897, + "version": 44, + "versionNonce": 468837745, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 106.42230116522956, + -0.10172927196111914 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "fESH7TjYaPiRAXCLgu6gj", + "focus": 0.034035946947105086, + "gap": 11.364088475962532 + }, + "endBinding": { + "elementId": "Rp_m5EtBqLK880zk0HPes", + "focus": -0.09541448620171078, + "gap": 8.602060160628056 + } + }, + { + "id": "muBFJlzUT62Z5u6vtgoPo", + "type": "arrow", + "x": 1341.157078677608, + "y": 339.7422181379586, + "width": 88.60855868842668, + "height": 2.6091895262144362, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1832057969, + "version": 128, + "versionNonce": 1342081055, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 88.60855868842668, + -2.6091895262144362 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Rp_m5EtBqLK880zk0HPes", + "gap": 19.82936306898931, + "focus": 0.08945444862904846 + }, + "endBinding": { + "elementId": "2iAmN0ThUq3khqXmobwXR", + "gap": 11.37138636336131, + "focus": -0.1024021768851719 + } + }, + { + "id": "Qs4t0BM0S_4Pke8rNKbmD", + "type": "arrow", + "x": 492.0234375, + "y": 350.046875, + "width": 95.43387310642322, + "height": 0.9643864370914343, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 234060401, + "version": 68, + "versionNonce": 297558161, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 95.43387310642322, + -0.9643864370914343 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "umJvYNbrYyosAii0TCe8X", + "focus": -0.08182839036919108, + "gap": 13.781886293370846 + } + }, + { + "id": "c9iGYLrlWNl56Bq2qFVR3", + "type": "arrow", + "x": 1521.4329053171455, + "y": 397.76984274454924, + "width": 847.5934093483568, + "height": 71.62078225545076, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1408772703, + "version": 339, + "versionNonce": 455396689, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -85.06181156714547, + 61.46453225545076 + ], + [ + -770.2180615671455, + 71.62078225545076 + ], + [ + -847.5934093483568, + 15.194066486107488 + ] + ], + "lastCommittedPoint": [ + -834.17578125, + 10.3515625 + ], + "startBinding": { + "elementId": "2iAmN0ThUq3khqXmobwXR", + "gap": 19.92113118460233, + "focus": -0.7649085384743577 + }, + "endBinding": { + "elementId": "umJvYNbrYyosAii0TCe8X", + "focus": 0.9783632894951878, + "gap": 20.136000442647486 + } + }, + { + "id": "eGPmufgc-vKMKmqf5K70-", + "type": "text", + "x": 499.75, + "y": 299.75, + "width": 59, + "height": 24, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1637190321, + "version": 57, + "versionNonce": 722379505, + "isDeleted": false, + "boundElementIds": null, + "text": "event", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 19 + }, + { + "id": "vynyr8w8fVE7OJXHAE365", + "type": "text", + "x": 780, + "y": 300, + "width": 70, + "height": 24, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1893934897, + "version": 361, + "versionNonce": 1504841009, + "isDeleted": false, + "boundElementIds": null, + "text": "update", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 19 + }, + { + "id": "4svZvrPyD8SmDlCrAqiub", + "type": "text", + "x": 1060, + "y": 300, + "width": 70, + "height": 24, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1281306641, + "version": 14, + "versionNonce": 881014001, + "isDeleted": false, + "boundElementIds": null, + "text": "notify", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 19 + }, + { + "id": "9SF49CHx9H587dg3XyxK3", + "type": "text", + "x": 1340, + "y": 300, + "width": 82, + "height": 24, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1159088735, + "version": 18, + "versionNonce": 1065184433, + "isDeleted": false, + "boundElementIds": null, + "text": "trigger", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 19 + }, + { + "id": "Qw_akk4TX_QbVkg5X1aKS", + "type": "text", + "x": 1078.23046875, + "y": 484.29296875, + "width": 59, + "height": 24, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1289093279, + "version": 95, + "versionNonce": 313892977, + "isDeleted": false, + "boundElementIds": null, + "text": "event", + "fontSize": 20, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 19 + } + ], + "appState": { + "viewBackgroundColor": "#ffffff", + "gridSize": null + } +} \ No newline at end of file diff --git a/docs/assets/flow2.png b/docs/assets/flow2.png new file mode 100644 index 0000000000000000000000000000000000000000..91201b77fd44bcdce396a7d1518bd0a8fed38b34 GIT binary patch literal 482175 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 z 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

    P?4Mzjg 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�~Nmf6XFJ3 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%0DUo{5^vm@a$$^>0?35+V8g?0xiMS(#!A?`mb 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�VQXAc@#XnBQ|{ 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Ⓢ~xYzyNN)t8LGuBjBa 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 { - myTimer.increaseTimer() -}, 1000) - // A function component wrapped with `observer` will reacts to any // future change in an observable it used before const TimerView = observer(({ timer }) => Seconds passed: {timer.secondsPassed}) ReactDOM.render(, document.body) + +setInterval(() => { + myTimer.increaseTimer() +}, 1000) ``` The `observer` HoC subscribes React components automatically to _any observables_ that are used _during render_. @@ -193,17 +193,17 @@ const TimerView = observer(() => { ReactDOM.render(, document.body) ``` - + The combination `const [store] = useState(() => observable({ /* something */}))` is -quite common. To make this pattern simpler the [`useLocalStore`](https://github.com/mobxjs/mobx-react#uselocalstore-hook) hook is exposed from `mobx-react-lite`, making it possible to simplify the earlier example to: +quite common. To make this pattern simpler the [`useLocalObservable`](https://github.com/mobxjs/mobx-react#uselocalobservable-hook) hook is exposed from `mobx-react-lite`, making it possible to simplify the earlier example to: ```javascript -import { observer, useLocalStore } from "mobx-react-lite" +import { observer, useLocalObservable } from "mobx-react-lite" import { useState } from "react" const TimerView = observer(() => { - const timer = useLocalStore(() => ({ + const timer = useLocalObservable(() => ({ secondsPassed: 0, increaseTimer() { this.secondsPassed++ @@ -218,12 +218,12 @@ ReactDOM.render(, document.body)

    What about `useMemo`? -A critical reader might notice that we might have used `useMemo`, -rather than `useState`. +A critical reader might notice that we might have used `useMemo`, +rather than `useState`. That would in practice work the same. However, React doesn't _guarantee_ that memoized values are actually memoized in all cases, so it _could_ randomly throw away our Timer instance -and create a fresh one, resetting our timer progress in the process. +and create a fresh one, resetting our timer progress in the process.
    ### You might not need locally observable state @@ -327,14 +327,14 @@ If you use `mobx-react`, there is no need to add `mobx-react-lite` as dependency
    `observer` and `React.memo`? -`observer` automatically applies `memo`, so `observer` components never need to be wrapped in `memo`. -`memo` can be applied safely to observer components because mutations (deeply) inside the props will be picked up by `observer` anyway if relevant. +`observer` automatically applies `memo`, so `observer` components never need to be wrapped in `memo`. +`memo` can be applied safely to observer components because mutations (deeply) inside the props will be picked up by `observer` anyway if relevant.
    Tip: `observer` for class based React components -As stated above, class based components are only supported through `mobx-react`, and not `mobx-react-lite`. +As stated above, class based components are only supported through `mobx-react`, and not `mobx-react-lite`. Briefly, you can wrap class-based components in `observer` just like you can wrap function components: @@ -356,7 +356,7 @@ See the [mobx-react docs](https://github.com/mobxjs/mobx-react#api-documentation
    -Tip: nice component names in React DevTools +Tip: nice component names in React DevTools [React DevTools](https://reactjs.org/blog/2019/08/15/new-react-devtools.html) uses the display name information of components to properly display the component hierarchy. @@ -401,7 +401,7 @@ The following approaches can be used to fix this: MyComponent.displayName = "MyComponent" ``` - This is broken in React at the time of writing; mobx-react `observer` uses a React.memo and runs into this bug: https://github.com/facebook/react/issues/18026 + This is broken in React 16 at the time of writing; mobx-react `observer` uses a React.memo and runs into this bug: https://github.com/facebook/react/issues/18026, but it will be fixed in React 17. Now you can see component names: @@ -419,19 +419,19 @@ otherwise it might do nothing at all.
    🚀 Tip: Deriving computeds from props -In some the computed values of your local observable might depend on some of the +In some the computed values of your local observable might depend on some of the props your component receives. -However, the set of props that a React component receives is in itself not observable, so changes to the props won't be reflected in any computed values. +However, the set of props that a React component receives is in itself not observable, so changes to the props won't be reflected in any computed values. To make props observable, the [`useAsObservableSource`](https://github.com/mobxjs/mobx-react#useasobservablesource-hook) hook can be used, that will sync the props of a component into an local observable object. _Note that it is important to not deconstruct the result of this hook._ ```javascript -import { observer, useLocalStore, useAsObservableSource } from "mobx-react-lite" +import { observer, useLocalObservable, useAsObservableSource } from "mobx-react-lite" import { useState } from "react" const TimerView = observer(({ offset }) => { const observableProps = useAsObservableSource({ offset }) - const timer = useLocalStore(() => ({ + const timer = useLocalObservable(() => ({ secondsPassed: 0, increaseTimer() { this.secondsPassed++ @@ -452,6 +452,60 @@ is a much simpler, albeit slightly less efficient solution.
    +
    🚀 Tip: useEffect and observables + +`useEffect` can be used to set up side effects that need to happen, and which are bound to the life-cycle of the React component. +Using `useEffect` requires specifying dependencies. +With MobX that isn't really needed, since MobX has already a way to automatically determine the dependencies of an effect, `autorun`. +Combining `autorun` and coupling it to the life-cycle of the component using `useEffect` is luckily straight forward: + +```javascript +import { observer, useLocalObservable, useAsObservableSource } from "mobx-react-lite" +import { useState } from "react" + +const TimerView = observer(({ offset }) => { + const timer = useLocalObservable(() => ({ + secondsPassed: 0, + increaseTimer() { + this.secondsPassed++ + } + })) + + // effect that triggers upon observable changes + useEffect( + () => + autorun(() => { + if (timer.secondsPassed > 60) alert("Still there. It's a minute already?!!") + }), + [] + ) + + // effect to set up a timer + // (this one is just here for demo purposes) + useEffect(() => { + const handle = setInterval(() => timer.increaseTimer, 1000) + return () => { + clearInterval(handle) + } + }, []) + + return Seconds passed: {timer.offsetTime} +}) + +ReactDOM.render(, document.body) +``` + +Note that we return the disposer created by `autorun` from our effect function. +This is important, since it makes sure the `autorun` gets cleaned up once the component unmounts! + +The dependency array can typically be left empty, unless a non-observable value should trigger a re-run of the autorun, in which case you will need to add it there. +To make your linter happy, you can define `timer` (in the above example) as a dependency. +That is safe and has no further effect, since the reference will never actually change. + +If you'd rather explicitly define which observables should trigger the effect, use `reaction` instead of `autorun`, beyond that the pattern remains identical. + +
    + ### How can I further optimize my React components? See the relevant [React performance section](react-performance.md). diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 964d40501..6cdb8e3c1 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -346,10 +346,10 @@ It might very well be that your application doesn't use any of those APIs direct Before you set up a reaction, it is good to check if it complies to the following principles first: -1. **Reactions shouldn't derive values**: Is the reaction going to modify some observables? If the answer is yes, typically the observable you want to update should be expressing using a [`computed`](computed.md) value instead. For example, if a collection of todos is altered, don't use a reaction to compute the amount of `remainingTodos`, but express `remainingTodos` as a computed value. That will lead to much clearer and easier to debug code. Reactions should not compute new data but only cause effects. Put differently, side effects are in principle not observable from your application code itself but only affect the 'outside world'. -2. **Reactions should be independent**: Does your code rely on some other reaction to have run first? If that is the case, you probably +1. **Only use Reactions if there is no direct relation between cause and effect**: If a side effect should happen in response to a very limited set of events / actions, it will often be clearer to directly trigger the effect from those specific actions. For example, if pressing a form submit button should lead to a network request to be posted, it is clearer to trigger this effect directly in response of the `onClick` event, rather than indirectly through a reaction. In contrast, if any change you make to the form state should automatically end up in local storage, then a reaction can be very useful, so that you don't have to trigger this effect from every individual `onChange` event. +1. **Reactions shouldn't update other observables**: Is the reaction going to modify some observables? If the answer is yes, typically the observable you want to update should be expressing using a [`computed`](computed.md) value instead. For example, if a collection of todos is altered, don't use a reaction to compute the amount of `remainingTodos`, but express `remainingTodos` as a computed value. That will lead to much clearer and easier to debug code. Reactions should not compute new data but only cause effects. Put differently, side effects are in principle not observable from your application code itself but only affect the 'outside world'. +1. **Reactions should be independent**: Does your code rely on some other reaction to have run first? If that is the case, you probably either violated the first rule, or the new reaction you are about to create should be merged into the one it is depending upon. MobX doesn't guarantee the order in which reactions will be run. -3. **Reactions should be decoupled from their cause**: If a side effect should happen in response to a very limited set of events / actions, it will often be clearer to directly trigger the effect from those specific events. For example, if pressing a form submit button should lead to a network request to be posted, it is clearer to trigger this effect directly in response of the `onClick` event, rather than indirectly through a reaction. In contrast, if any change you make to the form state should automatically end up in local storage, then a reaction can be very useful, so that you don't have to trigger this effect from every individual `onChange` event. There are real-life scenarios that don't fit in above principles. That is why they are _principles_, not _laws_. But, the exceptions are rare so only violate them as a last resort. diff --git a/notes.md b/notes.md index b00d75bef..43c24e004 100644 --- a/notes.md +++ b/notes.md @@ -86,6 +86,10 @@ - [ ] link flutter, lit, angular - [ ] update footer - [ ] don't proxy objects tip, makeAutoObservable vs observable + - [ ] drop interactive tutorial? + - [ ] sync readme's + - [ ] verify that MobX is by default in strict mode + - [ ] make links for all tips - [ ] mobx-react-lite - [x] displayname for observer components facebook/react#18026. Fixed: https://github.com/facebook/react/issues/18026 - [x] update useLocalStore in mobx-react-lite to use diff --git a/website/static/css/custom.css b/website/static/css/custom.css index 9bda40d15..733b35e49 100755 --- a/website/static/css/custom.css +++ b/website/static/css/custom.css @@ -1,8 +1,8 @@ /* your custom css */ -/* -Docusaurus's default displays img tags as block. +/* +Docusaurus's default displays img tags as block. Numerous images in the main README.md relied on default (inline-block) img tag styling when this project was migrated initially. @@ -80,6 +80,23 @@ details[open] > summary { padding: 1.25rem 0px; } +.benefits { + display: flex; + align-items: center; + flex-direction: column; +} + + .benefits > div { + width: 80%; + display: flex; + align-items: center; +} + +.benefits .pic { + font-size: 40px; + margin-right: 40px; +} + /* BLM */ .slidingNav::before { content: "Black Lives Matter"; From 5d5accb6284463dcbbf21e243b1cba83fa6a1610 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Mon, 14 Sep 2020 22:02:35 +0100 Subject: [PATCH 0509/1043] More docs cleanup stuff --- docs/best/debugging-mobx.md | 8 +- docs/best/what-does-mobx-react-to.md | 8 +- docs/faq/migrate-to-6.md | 3 +- docs/intro/concepts.md | 4 +- docs/intro/how-to-read.md | 7 +- docs/intro/installation.md | 7 + docs/react/react-integration.md | 42 ++-- docs/refguide/action.md | 4 +- docs/refguide/api.md | 287 +++++++++++++++++++++------ docs/refguide/autorun.md | 14 +- docs/refguide/computed.md | 10 +- docs/refguide/extending.md | 45 ----- docs/refguide/modifiers.md | 2 +- docs/refguide/object-api.md | 4 +- docs/refguide/object.md | 2 +- docs/refguide/observable.md | 17 +- flow-typed/mobx.js | 2 - notes.md | 22 +- src/mobx.ts | 1 - src/utils/utils.ts | 7 - test/v4/base/array.js | 14 -- test/v5/base/api.js | 1 - test/v5/base/array.js | 14 -- website/core/Footer.js | 2 +- website/sidebars.json | 2 +- website/siteConfig.js | 7 +- website/static/css/custom.css | 27 +++ website/static/js/scripts.js | 15 ++ 28 files changed, 355 insertions(+), 223 deletions(-) create mode 100644 website/static/js/scripts.js diff --git a/docs/best/debugging-mobx.md b/docs/best/debugging-mobx.md index 53a83ba97..2845b24c1 100644 --- a/docs/best/debugging-mobx.md +++ b/docs/best/debugging-mobx.md @@ -62,7 +62,7 @@ trace(user, "fullname") # Introspection APIs The following APIs might come in handy if you want to inspect the internal state of MobX while debugging, or want to build cool tools on top of MobX. -Also relevant are [`toJS`](tojson.md) and the various [`isObservable*` APIs](api.md#isobservable). +Also relevant are the various [`isObservable*` APIs](../refguide/object-api.md). ### `getDebugName` @@ -96,7 +96,7 @@ Returns a tree structure with all reactions / computations that are observing th Returns the backing _Atom_ of a given observable object, property, reaction etc. -# Spy [🚀] +# Spy Usage: @@ -124,13 +124,13 @@ Spy listeners always receive one object, which usually has at least a `type` fie | scheduled-reaction | | name | no | | reaction | | name | yes | | error | | name, message, error | no | -| add,update,remove,delete,splice | \* | see [observe](observe.md) | yes | +| add,update,remove,delete,splice | \* | see [observe](../refguide/observe.md) | yes | | report-end | | spyReportEnd=true, time? (total execution time in ms) | no | The `report-end` events are part of an earlier fired event that had `spyReportStart: true`. This event indicates the end of an event and this way groups of events with sub-events are created. This event might report the total execution time as well. -The spy events for observable values are identical to the events passed to `observe`. See [intercept & observe](observe.md#event-overview) for an extensive overview. +The spy events for observable values are identical to the events passed to `observe`. See [intercept & observe](../refguide/observe.md#event-overview) for an extensive overview. In production builds, the `spy` API is a no-op as it will be minimized away. diff --git a/docs/best/what-does-mobx-react-to.md b/docs/best/what-does-mobx-react-to.md index 62fd11bb8..2e054fc50 100644 --- a/docs/best/what-does-mobx-react-to.md +++ b/docs/best/what-does-mobx-react-to.md @@ -8,15 +8,15 @@ hide_title: true # What does MobX react to? MobX usually reacts to exactly the things you expect it to. -Which means that in 90% of your use cases mobx "just works". +Which means that in 90% of your use cases MobX should "just work". However, at some point you will encounter a case where it does not do what you expected. At that point it is invaluable to understand how MobX determines what to react to. > MobX reacts to any _existing_ **observable** _property_ that is read during the execution of a tracked function. - _"reading"_ is dereferencing an object's property, which can be done through "dotting into" it (eg. `user.name`) or using the bracket notation (eg. `user['name']`, `todos[3]`). -- _"tracked functions"_ are the expression of `computed`, the function of an observer React function component, the `render()` method of an observer React class component, and the functions that are passed as the first param to `autorun`, `reaction` and `when`. -- _"during"_ means that only those observables that are read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. +- _"tracked functions"_ are the expression of `computed`, the _rendering_ of an `observer` React function component, the `render()` method of an `observer` based React class component, and the functions that are passed as the first param to `autorun`, `reaction` and `when`. +- _"during"_ means that only those observables that are read while the function is executing are tracked. It doesn't matter whether these values are used directly or indirectly by the tracked function. But things that have been 'spawned' from the function won't be tracked (e.g. `setTimeout`, `promise.then`, `await` etc). In other words, MobX will not react to: @@ -310,7 +310,7 @@ runInAction(() => { This will **not** react because during the execution of the `autorun` no observables were accessed, only during the `setTimeout`, which is an asynchronous function. -Also see [Asynchronous actions](actions.md). +Also see [Asynchronous actions](../refguide/action.md#asynchronous-actions). #### Using non-observable object properties diff --git a/docs/faq/migrate-to-6.md b/docs/faq/migrate-to-6.md index d0ac91f6c..8fc9dfb12 100644 --- a/docs/faq/migrate-to-6.md +++ b/docs/faq/migrate-to-6.md @@ -104,7 +104,8 @@ flow can be used as annotation - `observableMap.toJSON()` now returns an entries array rather than a new Map, to better support serialization. - `observableSet.toJS()` has been dropped. use `new Set(observableSet)` instead if you want to convert an observable set to to a plain Set shallowly. - `observableMap.toJSON()` now returns an array rather than a new Set, to better support serialization. -- Breaking: sorting or reversing an observableArray in an derivation (without slicing first) will now throw rather than warn. In contrast, it is now allowed to sort or reverse observable arrays in-place, as long as it happens in an action. +- Sorting or reversing an observableArray in an derivation (without slicing first) will now throw rather than warn. In contrast, it is now allowed to sort or reverse observable arrays in-place, as long as it happens in an action. +- `isArrayLike` is no longer exposed as utility. Use `Array.isArray(x) || isObservableArray(x)` instead. ### Obscure things that don't work anymore, but that probably won't affect you diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md index 492059a1d..4e43db3ed 100644 --- a/docs/intro/concepts.md +++ b/docs/intro/concepts.md @@ -164,8 +164,8 @@ To learn more about how React works with MobX, read [React integration](../react #### 3.4. Custom reactions -You will need them rarely, but custom reactions can simply be created using the [`autorun`](../refguide/autorun.md), -[`reaction`](../refguide/reaction.md) or [`when`](../refguide/when.md) functions to fit your specific situations. +You will need them rarely, but custom reactions can simply be created using the [`autorun`](../refguide/autorun.md#autorun), +[`reaction`](../refguide/autorun.md#reaction) or [`when`](../refguide/autorun.md#when) functions to fit your specific situations. For example the following `autorun` prints a log message each time the amount of `unfinishedTodoCount` changes: ```javascript diff --git a/docs/intro/how-to-read.md b/docs/intro/how-to-read.md index e1d697953..effdb0404 100644 --- a/docs/intro/how-to-read.md +++ b/docs/intro/how-to-read.md @@ -14,9 +14,14 @@ of concepts as well as the pages under those headings. We've marked sections and concepts that are more advanced and which you likely don't need to understand until you have a special use case with the [🚀] marker. You can use MobX very effectively without knowing about them, so feel free to skip them and move on to the next section! +The documentation has been rewritten for MobX 6. For older versions of MobX, the documentation can be found [here](https://github.com/mobxjs/mobx/tree/master/docs). +All the principles are the same, and the API is largely the same. The primarily difference is that before MobX 6 [decorators](https://github.com/mobxjs/mobx/blob/master/docs/best/decorators.md) are the recommended syntax to write MobX enhanced classes. + ## Guided tour -To get an overall idea of how to use MobX with React, read through this _Basics_ section, in particular [The gist of MobX](overview.md) and [Concepts & Principles](concepts.md). These introduce the most important principles and patterns. You should actually be ready to use MobX once you read this! +To get an overall idea of how to use MobX with React, read through this _Basics_ section, in particular [The gist of MobX](concepts.md). +These introduce the most important principles, api's and how they relate. +You should actually be ready to use MobX once you read this! Here are a few suggestions about the next things to read: diff --git a/docs/intro/installation.md b/docs/intro/installation.md index d81ecfae8..6735830b3 100644 --- a/docs/intro/installation.md +++ b/docs/intro/installation.md @@ -36,3 +36,10 @@ configure({ useProxies: "never" }) // or "ifavailable" If you have used MobX before, or if you followed online tutorials, you probably saw MobX with decorators like `@observable`. In MobX 6 we have chosen to move away by default from decorators for maximum compatibility with standard JavaScript. They can still be used though if you [enable decorators](../best/decorators.md). + +## MobX on other frameworks / platforms + +- [MobX.dart](https://mobx.netlify.app/): MobX for Flutter / Dart +- [lit-mobx](https://github.com/adobe/lit-mobx): MobX for lit-element +- [mobx-angular](https://github.com/mobxjs/mobx-angular): MobX for angular +- [mobx-vue](https://github.com/mobxjs/mobx-vue): MobX for Vue diff --git a/docs/react/react-integration.md b/docs/react/react-integration.md index e2f3e7809..8f76a786f 100644 --- a/docs/react/react-integration.md +++ b/docs/react/react-integration.md @@ -16,7 +16,7 @@ import {observer} from 'mobx-react-lite const MyComponent = observer(props => ReactElement) ``` -While MobX works independently from React they are most commonly used together. In [the gist of Mobx](../intro/overview.md) as well as the [conceptual introduction](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. +While MobX works independently from React they are most commonly used together. In [the gist of Mobx](../intro/concepts.md) you have already seen the most important part of this integration: the `observer` [HoC](https://reactjs.org/docs/higher-order-components.html) that you can wrap around a React component. `observer` is provided by the separate [`mobx-react-lite` package](https://github.com/mobxjs/mobx-react-lite). Using `observer` is pretty straight forward [[try it]](https://codesandbox.io/s/minimal-observer-p9ti4?file=/src/index.tsx): @@ -171,7 +171,7 @@ useEffect(() => { As stated before, instead of using classes, it is possible to directly create observable objects. -We can leverage [observable](observable.md) for that. +We can leverage [observable](../refguide/observable.md) for that. ```javascript import { observer } from "mobx-react-lite" @@ -217,21 +217,14 @@ ReactDOM.render(, document.body) -
    What about `useMemo`? -A critical reader might notice that we might have used `useMemo`, -rather than `useState`. -That would in practice work the same. -However, React doesn't _guarantee_ that memoized values are actually -memoized in all cases, so it _could_ randomly throw away our Timer instance -and create a fresh one, resetting our timer progress in the process. -
    - ### You might not need locally observable state In general we recommend to not resort to MobX observables for local component state too quickly; as this can theoretically lock you out of some features of React's Suspense mechanism. As a rule of thumb use MobX observables when the state captures domain data that is shared among components (including children), such as todo items, users, bookings, etc. State that is only captures UI state, such as loading state, selections, etc, might be better served by the [`useState` hook](https://reactjs.org/docs/hooks-state.html), since this allows you to leverage React suspense features in the future. +Using observables inside React components adds value as soon as they are either 1) deep, 2) have computed values or 3) are shared with other `observer` components. + ## Always read observables inside `observer` components. You might be wondering, when to apply `observer`? The simple rule of thumb is: _apply `observer` to all components that read observable data_. @@ -259,7 +252,7 @@ If the problem is not entirely clear, make sure to study [what does MobX react t Components wrapped with `observer` _only_ subscribe to observables used during the _own_ render of the component. So if observable objects/ arrays / maps are passed to child components, those have to be marked as `observer` as well. This is also true for any callback based components. -If you want to pass observables to a component that isn't `observer`, either because it is a third-party component, or because you want to keep that component MobX agnostic, you will have to [convert the observables to plain JavaScript values or structures](observable.md#converting-observables-back-to-vanilla-javascript-collections) before passing them on. +If you want to pass observables to a component that isn't `observer`, either because it is a third-party component, or because you want to keep that component MobX agnostic, you will have to [convert the observables to plain JavaScript values or structures](../refguide/observable.md#converting-observables-back-to-vanilla-javascript-collections) before passing them on. To elaborate on the above, take the following example observable `todo` object, a `TodoView` component (observer) and an imaginary `GridRow` component that takes a column / value mapping, but which isn't an `observer`: @@ -311,8 +304,7 @@ const TodoView = observer(({ todo }: { todo: Todo }) => ## Tips -
    mobx-react vs. mobx-react-lite - +
    mobx-react vs. mobx-react-lite In this documentation we used `mobx-react-lite` as default. [`mobx-react`](https://github.com/mobxjs/mobx-react/) is it's big brother, which uses `mobx-react-lite` under the hood. It offers a few more features which are typically not needed anymore in greenfield projects. The additional things offered by mobx-react: @@ -326,13 +318,13 @@ If you use `mobx-react`, there is no need to add `mobx-react-lite` as dependency
    -
    `observer` and `React.memo`? +
    `observer` and `React.memo`? `observer` automatically applies `memo`, so `observer` components never need to be wrapped in `memo`. `memo` can be applied safely to observer components because mutations (deeply) inside the props will be picked up by `observer` anyway if relevant.
    -
    -Tip: `observer` for class based React components +
    +Tip: `observer` for class based React components As stated above, class based components are only supported through `mobx-react`, and not `mobx-react-lite`. Briefly, you can wrap class-based components in `observer` just like @@ -355,8 +347,8 @@ See the [mobx-react docs](https://github.com/mobxjs/mobx-react#api-documentation
    -
    -Tip: nice component names in React DevTools +
    +Tip: nice component names in React DevTools [React DevTools](https://reactjs.org/blog/2019/08/15/new-react-devtools.html) uses the display name information of components to properly display the component hierarchy. @@ -409,8 +401,8 @@ Now you can see component names:
    -
    -🚀 When combining `observer` with other higher-order-components, apply `observer` first +
    +🚀 When combining `observer` with other higher-order-components, apply `observer` first When `observer` needs to be combined with other decorators or higher-order-components, make sure that `observer` is the innermost (first applied) decorator; @@ -418,7 +410,7 @@ otherwise it might do nothing at all.
    -
    🚀 Tip: Deriving computeds from props +
    🚀 Tip: Deriving computeds from props In some the computed values of your local observable might depend on some of the props your component receives. However, the set of props that a React component receives is in itself not observable, so changes to the props won't be reflected in any computed values. @@ -452,7 +444,7 @@ is a much simpler, albeit slightly less efficient solution.
    -
    🚀 Tip: useEffect and observables +
    🚀 Tip: useEffect and observables `useEffect` can be used to set up side effects that need to happen, and which are bound to the life-cycle of the React component. Using `useEffect` requires specifying dependencies. @@ -515,9 +507,9 @@ See the relevant [React performance section](react-performance.md). Help! My component isn't re-rendering... 1. Make sure you didn't forget `observer` (yes, this is the most common mistake) -1. Verify that the thing you intend to react to is indeed observable. Use utilities like [`isObservable`](api.md#isobservable), [`isObservableProp`](api.md#isobservableprop) if needed to verify this at runtime. +1. Verify that the thing you intend to react to is indeed observable. Use utilities like [`isObservable`](../refguide/api.md#isobservable), [`isObservableProp`](../refguide/api.md#isobservableprop) if needed to verify this at runtime. 1. Check the console logs in the browsers for any warnings or errors. 1. Make sure you grok how tracking works in general: [what does MobX react to](../best/what-does-mobx-react-to.md) 1. Read the common pitfalls as described above. 1. [Configure](configure) MobX to warn you of unsound usage of MobX mechanisms and check the console logs. -1. Use [trace](../best/trace.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](../refguide/spy.md) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. +1. Use [trace](../best/debugging-mobx.md) to verify that you are subscribing to the right things or check what MobX is doing in general using [spy](../best/debugging-mobx#spy) / the [mobx-logger](https://github.com/winterbe/mobx-logger) package. diff --git a/docs/refguide/action.md b/docs/refguide/action.md index 1e56da048..34e5b73f8 100644 --- a/docs/refguide/action.md +++ b/docs/refguide/action.md @@ -167,7 +167,7 @@ Usage: The `action.bound` annotation can be used to automatically bind a method to the correct instance, so that `this` is always correctly bound inside the function. -
    Tip: prefer arrow functions over `action.bound` +
    Tip: prefer arrow functions over `action.bound` If you want to bind actions in combination with `makeAutoObservable`, it is usually simpler to use arrow functions instead: ```javascript @@ -376,7 +376,7 @@ However, TypeScript isn't aware of that transformation, so, `flowResult` will ma `makeAutoObservable` and friends will automatically infer generators to be `flow`s. -
    🚀 Using flow on object fields +
    🚀 Using flow on object fields `flow`, like `action` can be used to wrap functions directly, so above example could also have been written as: ```typescript diff --git a/docs/refguide/api.md b/docs/refguide/api.md index 8540af4ee..4d2f17960 100644 --- a/docs/refguide/api.md +++ b/docs/refguide/api.md @@ -43,7 +43,7 @@ Automatically convert object members into observables, computeds and actions. ### `extendObservable` -Usage: +Usage 🚀: - `extendObservable(target, properties, overrides?, options?) @@ -72,7 +72,7 @@ Usage: ### `observable.object` -Usage: +Usage 🚀: - `observable.object(source, overrides?, options?)` @@ -82,7 +82,7 @@ Alias for `observable(source, overrides?, options?)`. Creates a clone of the pro ### `observable.array` -Usage +Usage 🚀: - `observable.array(initialValues?, options?)` @@ -100,7 +100,7 @@ The `{ deep: false }` option can be used to make this array shallowly observable ### `observable.map` -Usage: +Usage 🚀: - `observable.map(initialMap?, options?)` @@ -118,7 +118,7 @@ The `{ deep: false }` option can be used to make this map shallowly observable, ### `observable.set` -Usage: +Usage 🚀: - `observable.set(initialSet?, options?)` @@ -149,7 +149,7 @@ Like the `observable` annotation, except that any assigned value that is structu ### `observable.struct` -Usage: +Usage 🚀: - `observable.struct` (annotation) @@ -159,7 +159,7 @@ Like `observable.ref` but for collections; any collection assigned will be made ### `observable.deep` -Usage: +Usage 🚀: - `observable.deep` (annotation) @@ -169,6 +169,8 @@ Alias for the [`observable`](#observable) annotation. ### `observable.box` +Usage 🚀: + - `observable.box(value, options?)` All primitive values in JavaScript are immutable and hence per definition not observable. @@ -215,7 +217,7 @@ Marking things as action. ### `runInAction` -Usage: +Usage 🚀: - `runInAction(fn)` @@ -234,7 +236,7 @@ MobX friendly replacement for `async` / `await` that supports cancellation. [«details»](action.md#using-flow-instead-of-asyncawait) -### `flow` +### `flowResult` Usage: @@ -251,92 +253,156 @@ _Computed values derived from observables and other computeds._ ### `computed` -Marking things as computed. +Usage: + +- `computed` (annotation) +- `computed(options)` (annotation) +- `computed(fn, options?)` + +Create an observable value that is derived from other observables, but won't re-computed unless one of the underlying observables changes. [«details»](computed.md) ## React integration -From the `mobx-react` package. +From the `mobx-react` / `mobx-react-lite` package. ### `observer` -A higher order component you can use to make a React component re-render when observables change. +Usage: -Is part of the `mobx-react` package. +- `observer(functionComponent)` +- `observer(classComponent)` + +A higher order component you can use to make a React component re-render when observables change. +Is part of the `mobx-react` / `mobx-react-lite` package. [«details»](../react/react-integration.md) +### `Observer` + +Usage: + +- `{() => rendering}` + +Renders the given render function, and automatically re-renders it once one of the observables used in the render function changes. +Is part of the `mobx-react` / `mobx-react-lite` package. + +[«details»](../react/react-integration.md#callback-components-might-require-observer) + +### `useLocalObservable` + +Usage: + +- `useLocalObservable(() => source, annotations?)` + +`useLocalObservable` creates a new observable object using `makeObservable`, and keeps it around in the in the component for the entire life-cycle of the component. +Is part of the `mobx-react` / `mobx-react-lite` package. + +[«details»](../react/react-integration.md#using-local-observable-state-in-observer-components) + ## Reactions Side-effects for observables. ### `autorun` +Usage: + +- `autorun(() => effect, options?)` + Rerun a function each time anything it observes changes. -[«details»](autorun.md) +[«details»](autorun.md#autorun) ### `reaction` -Rerun a side-effect when data it observes changes. +Usage: -[«details»](reaction.md) +- `reaction(() => data, data => effect, options?)` + +Rerun a side-effect when any data selected before changes. + +[«details»](autorun.md#reaction) ### `when` +Usage: + +- `when(() => condition, () => effect, options?)` +- `await when(() => condition, options?)` + Execute a side-effect once when a observable condition becomes true. -[«details»](when.md) +[«details»](autorun.md#when) + +## Utilities + +Here are some utilities that might make working with observable objects or computed values more convenient. +More, less trivial utilities can be found in the [mobx-utils](https://github.com/mobxjs/mobx-utils) package. ### `onReactionError` -Usage: `onReactionError(handler: (error: any, derivation) => void)` +Usage 🚀: + +- `onReactionError(handler: (error: any, derivation) => void)` This function attaches a global error listener, which is invoked for every error that is thrown from a _reaction_. This can be used for monitoring or test purposes. ### `intercept` +Usage 🚀: + +- `intercept(array | set | map, listener)` +- `intercept(object, propertyName, listener)` + Intercept changes before they are applied to an observable api. +Returns a disposer that stops the interception. [«details»](observe.md) ### `observe` +Usage 🚀: + +- `observe(array | set | map, listener)` +- `observe(object, propertyName, listener)` + Low-level api that can be used to observe a single observable value. +Returns a disposer that stops the interception. [«details»](observe.md) ### `onBecomeObserved` +Usage 🚀: + +- `onBecomeObserved(observable, property?, listener: () => void)` + Hook for when something becomes observed. [«details»](on-become-observed.md) ### `onBecomeUnobserved` -Hook for when something stops being observed. +Usage 🚀: -[«details»](on-become-observed.md) +- `onBecomeUnobserved(observable, property?, listener: () => void)` -## Utilities +Hook for when something stops being observed. -Here are some utilities that might make working with observable objects or computed values more convenient. -More, less trivial utilities can be found in the [mobx-utils](https://github.com/mobxjs/mobx-utils) package. +[«details»](on-become-observed.md) ### `toJS` Usage: -`toJS(value)` +- `toJS(value)` Recursively converts an (observable) object to a javascript _structure_. Supports observable arrays, objects, maps and primitives. Computed values and other non-enumerable properties won't be part of the result. -Cycles are detected and properly supported by default, but this can be disabled to improve performance. - -`toJS` accepts three options For more complex (de)serialization scenario's it is recommended to give classes a (computed) `toJSON` method, or use a serialization library like [serializr](https://github.com/mobxjs/serializr) @@ -351,13 +417,7 @@ console.log(mobx.isObservableObject(obj)) // true console.log(mobx.isObservableObject(clone)) // false ``` -### `isArrayLike` - -[Without Proxy support] - -Is this an array of some type, observable or not? - -[«details»](array.md#isarraylike) +[«details»](observable.md#converting-observables-back-to-vanilla-javascript-collections) ## Configuration @@ -368,91 +428,145 @@ Use this to change how MobX behaves as a whole. [«details»](configure.md) -## Object API +## Object API 🚀 -The Object API is an optional, generic API that enables manipulating observable maps, objects and arrays with the same API. This is specially useful -in [environments without `Proxy` support](../best/limitations-without-proxies.md). +The Object API is an optional, generic API that enables manipulating observable maps, objects and arrays with the same API. This can be useful +in [environments without `Proxy` support](configure.md#limitations-without-proxy-support), but are otherwise typically not needed. ### `values` +Usage 🚀: + +- `values(map|set|array|object)` + Return all values in collection as array. +[«details»](object-api.md) + ### `keys` +Usage 🚀: + +- `keys(map|set|array|object)` + Return all keys/indices in collection as array. +[«details»](object-api.md) + ### `entries` +Usage 🚀: + +- `entries(map|set|array|object)` + Return a `[key, value]` pair for all entries in the collection as an array. +[«details»](object-api.md) + ### `set` +Usage 🚀: + +- `set(map|array|object, index, value)` + Update collection. +[«details»](object-api.md) + ### `remove` +Usage 🚀: + +- `remove(map|array|object, index)` + Remove item from collection. +[«details»](object-api.md) + ### `has` +Usage 🚀: + +- `has(map|array|object, index)` + Check for membership in collection. +[«details»](object-api.md) + ### `get` +Usage 🚀: + +- `get(map|array|object, index)` + Get value from collection with key. [«details»](object-api.md) -## Introspection utilities +## Introspection utilities 🚀 The following APIs might come in handy if you want to inspect the internal state of MobX or want to build cool tools on top of MobX. ### `isObservable` -Is a value observable? +Usage 🚀: + +- `isObservable(map | array | set | object)` -[«details»](observable.md#isobservable) +Is an object / collection made observable by MobX? ### `isObservableProp` -Is a property observable? +Usage 🚀: -[«details»](observable.md#isobservableprop) +- `isObservableProp(object, propertyName)` + +Is a property observable? ### `isObservableArray` -Is value an observable array? +Usage 🚀: + +- `isObservableArray(array)` -[«details»](array.md#isobservablearray) +Is value an observable array? ### `isObservableMap` -Is value an observable map? +Usage 🚀: -[«details»](map.md#isobservablemap) +- `isObservableMap(map)` + +Is value an observable map? ### `isObservableSet` -Is value an observable set? +Usage 🚀: -[«details»](set.md#isobservableset) +- `isObservableSet(set)` + +Is value an observable set? ### `isObservableObject` -Is value an observable object? +Usage 🚀: + +- `isObservableObject(object)` -[«details»](object.md#isobservableobject) +Is value an observable object? ### `isBoxedObservable` -Is value an observable box? +Usage 🚀: + +- `isBoxedObservable(value)` -[«details»](boxed.md#isboxedobservable) +Is value an observable box? That is, created using `observable.box`. ### `isAction` -Usage: +Usage 🚀: - `isAction(func)` @@ -460,45 +574,74 @@ Returns `true` if the given function is marked as an `action`. ### `isComputed` -Is this a boxed computed value? +Usage 🚀: -[«details»](computed.md#iscomputed) +- `isComputed(boxedComputed)` + +Is this a boxed computed value? That is, created using `computed(() => expr)`? ### `isComputedProp` -Is this a computed property? +Usage 🚀: + +- `isComputedProp(object, propertyName)` -[«details»](computed.md#iscomputedprop) +Is this a computed property? ### `trace` -Log when value is invalidated, or set debugger breakpoint. +Usage: + +- `trace()` (inside a reaction / observer / computed value) +- `trace(true)` (enter the `debugger;` if this reaction is updated) +- `trace(object, propertyName, enterDebugger?)` (trace the specified computed property) -[«trace»](../best/trace.md) +Should be used inside a reaction / computed value. Log when value is invalidated, or set debugger breakpoint. + +[«trace»](../best/debugging-mobx.md) ### `spy` +Usage 🚀: + +- `spy(eventListener)` + Registers a global spy listener that listens to all events that happen in MobX. -[«trace»](spy.md) +[«trace»](../best/debugging-mobx.md#spy) ### `getDebugName` -Returns a (generated) friendly debug name +Usage 🚀: + +- `getDebugName(reaction)` +- `getDebugName(array | set | map)` +- `getDebugName(object | map, propertyName)` + +Returns the (generated) friendly debug name for an observable or reaction. -[«trace»](introspection-utils.md#getdebugname) +[«trace»](../best/debugging-mobx.md#getdebugname) ### `getDependencyTree` +Usage 🚀: + +- `getDependencyTree(object, computedPropertyName)` + Returns a tree structure with all observables the given reaction / computation currently depends upon. -[«trace»](introspection-utils.md#getdependencytree) +[«trace»](../best/debugging-mobx.md#getdependencytree) ### `getObserverTree` +Usage 🚀: + +- `getObserverTree(array | set | map)` +- `getObserverTree(object | map, propertyName)` + Returns a tree structure with all reactions / computations that are observing the given observable. -[«trace»](introspection-utils.md#getobservertree) +[«trace»](../best/debugging-mobx.md#getobservertree) ## Extending MobX @@ -506,15 +649,27 @@ In the rare case you want to extend MobX itself. ### `createAtom` +Usage 🚀: + +- `createAtom(name, onBecomeObserved?, onBecomeUnobserved?)` + Utility function that can be used to create your own observable data structures and hook them up to MobX. Used internally by all observable data types. +Reports and atom that exposed to methods: + +- `reportObserved()`, to notify that this atom is "used" at should be considered part of the dependency tree of the current derivation +- `reportChanged()`, to report to MobX that this atom has changed, and that all derivations depending on it should be invalidated [«details»](extending.md) ### `getAtom` +Usage 🚀: + +- `getAtom(thing, property?)` + Returns the backing atom. -[«trace»](introspection-utils.md#getatom) +[«trace»](../best/debugging-mobx.md#getatom) ### `transaction` @@ -556,7 +711,7 @@ Usage 🚀: - `untracked(worker: () => any)` -_Untracked is a low-level api, it is recommended to use `action`](#action) / [`runInAction`](#runinaction) instead_ +_Untracked is a low-level api, it is recommended to use `reaction`, `action` or `runInAction` instead_ Untracked allows you to run a piece of code without establishing observers. Like `transaction`, `untracked` is automatically applied by `action`, so usually it makes more sense to use actions than to use `untracked` directly. diff --git a/docs/refguide/autorun.md b/docs/refguide/autorun.md index 6cdb8e3c1..4c57dfc10 100644 --- a/docs/refguide/autorun.md +++ b/docs/refguide/autorun.md @@ -128,8 +128,8 @@ in the _data_ function, and in that way control more precisely when the effect t Unlike `autorun` the side effect won't be run directly when created, but only after the data expression returns a new value for the first time. -
    - Example +
    + Example In the example below, the reaction is only triggered once, when `isHungry` changes. Changes to `giraffe.energyLevel`, which is used by the _effect_ function, do not cause the _effect_ function to be executed. If you wanted `reaction` to respond to this @@ -199,8 +199,8 @@ Once that happens, the given _effect_ function is executed and the autorunner is The `when` function returns a disposer to allow you to cancel it manually, unless you don't pass in a second `effect` function, in which case it returns a `Promise`. -
    - Example +
    + Example This function is really useful to dispose or cancel stuff in a reactive way. For example: @@ -255,7 +255,7 @@ There are a few rules that apply to any reactive context: 2. Autorun tracks only the observables that are read during the synchronous execution of the provided function, but it won't track anything that happens asynchronously. 3. Autorun won't track observables that are read by an action invoked by the autorun, as actions are always _untracked_. -For a more examples on what precisely MobX will and won't react to, see [what does MobX react to](what-does-mobx-react-to.md). +For a more examples on what precisely MobX will and won't react to, see [what does MobX react to](../best/what-does-mobx-react-to.md). For a detailed technical breakdown on how tracking works, read [Becoming fully reactive: an in-depth explanation of MobX](https://hackernoon.com/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254) ## Always dispose reactions @@ -283,7 +283,7 @@ Failing to do so can lead to memory leaks. The `reaction` argument that is passed as second argument to the effect functions of `reaction` and `autorun` can be used to prematurely clean up the reaction as well by calling `reaction.dispose()`. -
    Memory leak example +
    Memory leak example ```javascript class Vat { @@ -331,7 +331,7 @@ class OrderLine { The `options` argument as shown above can be passed to further fine tune the behavior of `autorun` / `reaction` / `when`: -- `name`: Debug name (string) that is used as name for this reaction in for example [`spy`](spy.md) events. +- `name`: Debug name (string) that is used as name for this reaction in for example [`spy`](../best/debugging-mobx.md#spy) events. - `fireImmediately` (reaction): Boolean that indicates that the _effect_ function should immediately be triggered after the first run of the _data_ function. `false` by default. - `delay` (reaction, autorun): Number in milliseconds that can be used to throttle the effect function. If zero (the default), no throttling happens. - `timeout` (when): Set a limited amount of time that `when` will wait. If the deadline passes, `when` will reject / throw. diff --git a/docs/refguide/computed.md b/docs/refguide/computed.md index 21a09db7f..a1aaebe23 100644 --- a/docs/refguide/computed.md +++ b/docs/refguide/computed.md @@ -94,7 +94,7 @@ When using computed values, there are a few best practices to observe: ## Tips -
    Note: computed values will be suspended if they are _not_ observed +
    Note: computed values will be suspended if they are _not_ observed It sometimes confuses people new to MobX (perhaps used to a library like [Reselect](https://github.com/reduxjs/reselect)) that if you create a computed property but don't use it anywhere in a reaction, it is not memoized and appears to be recomputed more often than necessary. For example, if we'd extend the above example with calling `console.log(order.total)` twice, after we called `stop()`, the value would be recomputed twice. @@ -123,7 +123,7 @@ MobX can be configured to report an error when computeds are accessed outside an
    -
    Tip: computed values can have setters +
    Tip: computed values can have setters It is possible to define a [setter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set) for computed values as well. Note that these setters cannot be used to alter the value of the computed property directly, but they can be used as 'inverse' of the derivation. Setters are automatically marked as actions. For example: @@ -147,7 +147,7 @@ class Dimension {
    -
    🚀 Tip: `computed.struct` for comparing output structurally +
    🚀 Tip: `computed.struct` for comparing output structurally If the output of a computed value, that is structurally equivalent to the previous computation, doesn't need to notify observers, `computed.struct` can be used. It will make a structural comparison first (rather than a reference equality check) before notifying observers. Example: @@ -186,13 +186,13 @@ See also the `equals` [option](#option) for further customizations for determini
    -
    🚀 Tip: computed values with arguments +
    🚀 Tip: computed values with arguments Although getters don't take arguments, several strategies to work with derived values that need arguments are discusses [here](computed-with-args.md).
    -
    🚀 Tip: created stand-alone computed values with `computed(expression)` +
    🚀 Tip: created stand-alone computed values with `computed(expression)` `computed` can also be invoked directly as function. Just like [`observable.box`](api.md#observablebox) creates a stand-alone computed value. diff --git a/docs/refguide/extending.md b/docs/refguide/extending.md index 7fce4e363..ba1cb1f6a 100644 --- a/docs/refguide/extending.md +++ b/docs/refguide/extending.md @@ -88,48 +88,3 @@ disposer() // printing stops. If nobody else uses the same `clock` the clock will stop ticking as well. ``` - -# `onBecomeObserved` and `onBecomeUnobserved` [🚀] - -Usage: - -- `onBecomeObserved(observable, property?, listener: () => void): (() => void)` -- `onBecomeUnobserved(observable, property?, listener: () => void): (() => void)` - -These functions are hooks into the observability system of MobX and get notified when observables _start_ / _stop_ becoming observed. It can be used to execute some lazy operations or perform network fetches. - -The return value is a _diposer-function_ that will detach the _listener_. - -```javascript -export class City { - location - temperature - interval - - constructor(location) { - makeAutoObservable(this, { - resume: false, - suspend: false - }) - this.location = location - // only start data fetching if temperature is actually used! - onBecomeObserved(this, "temperature", this.resume) - onBecomeUnobserved(this, "temperature", this.suspend) - } - - resume = () => { - log(`Resuming ${this.location}`) - this.interval = setInterval(() => this.fetchTemperature(), 5000) - } - - suspend = () => { - log(`Suspending ${this.location}`) - this.temperature = undefined - clearInterval(this.interval) - } - - fetchTemperature = flow(function* () { - // data fetching logic - }) -} -``` diff --git a/docs/refguide/modifiers.md b/docs/refguide/modifiers.md index 616daf71a..e25a90839 100644 --- a/docs/refguide/modifiers.md +++ b/docs/refguide/modifiers.md @@ -41,7 +41,7 @@ class Message { } ``` -Note that an observable, boxed reference can be created by using `const box = observable.shallowBox(value)` ([more](boxed.md)). +Note that an observable, boxed reference can be created by using `const box = observable.shallowBox(value)` ([more](api.md#observablebox)). ### Shallow observability diff --git a/docs/refguide/object-api.md b/docs/refguide/object-api.md index f366552c9..400a7fde7 100644 --- a/docs/refguide/object-api.md +++ b/docs/refguide/object-api.md @@ -9,10 +9,12 @@ hide_title: true The Object API is a utility API that enables manipulating observable maps, objects and arrays with the same generic API. -These APIs are fully reactive, which means that even [without `Proxy` support](../best/limitations-without-proxies.md) new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. +These APIs are fully reactive, which means that even [without `Proxy` support](configure.md#limitations-without-proxy-support) new property declarations can be detected by mobx if `set` is used to add them, and `values` or `keys` to iterate them. Another benefit of `values`, `keys` and `entries` is that they return array rather than iterators, which makes it possible to, for example, immediately call `.map(fn)` on the result. +That all being said, the typical project has little reason to use these APIs. + Access: - `values(thing)` returns all values in the collection as array diff --git a/docs/refguide/object.md b/docs/refguide/object.md index 766800536..250f3362d 100644 --- a/docs/refguide/object.md +++ b/docs/refguide/object.md @@ -72,4 +72,4 @@ Returns `true` if `value` is an observable object. ## Limitations in environments without Proxy support -When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](extend-observable.md) is used. See also [limitations without proxies](../best/limitations-without-proxies.md) +When passing objects through `observable`, only the properties that exist at the time of making the object observable will be observable. Properties that are added to the object at a later time won't become observable, unless [`set`](object-api.md) or [`extendObservable`](api.md#extendobservable) is used. See also [limitations without proxies](configure.md#limitations-without-proxy-support) diff --git a/docs/refguide/observable.md b/docs/refguide/observable.md index a2fc7e0ab..fe83d589b 100644 --- a/docs/refguide/observable.md +++ b/docs/refguide/observable.md @@ -31,7 +31,7 @@ The `annotations` argument then maps [annotations](#available-annotations) to ma Methods that derive information and take arguments (for example `findUsersOlderThan(age: number): User[]`) don't need any annotation. Their read operations will still be tracked when they are called from a reaction, but their output won't be memoized to avoid memory leaks (see also [mobx-utils:computedFn](https://github.com/mobxjs/mobx-utils#computedfn)). -
    makeObservable limitations +
    makeObservable limitations MakeObservable can only annotate properties declared by its own class definition. If a sub- or superclass introduces observable fields, it will have to call `makeObservable` for those properties itself. @@ -148,7 +148,7 @@ The object returned by `observable` will be a Proxy, which means that properties The `observable` method can also be called with collections types like [arrays](../refguide/api.md#observablearray), [Maps](../refguide/api.md#observablemap) and [Sets](../refguide/api.md#observableset). Those will be cloned as well and converted into their observable counterpart. -
    Observable array example +
    Observable array example The following example creates an observable and observes it using [`autorun`](autorun.md). Working with Map and Set collections works similarly. @@ -190,7 +190,7 @@ Observable arrays have some additional nifty utility functions:
    -
    Primitives and class instances are never converted to observables +
    Primitives and class instances are never converted to observables Class instances will never be made observable automatically by passing them to `observable` or assigning them to an `observable` property. Making class members observable is considered the responsibility of the class constructor. @@ -200,6 +200,17 @@ Although there is typically no use for this mechanism outside libraries.
    +
    🚀 Tip: observable (proxied) versus makeObservable (unproxied) + +The primary difference between `make(Auto)Observable` and `observable` is that the first one modifies the object you are passing in as first argument, while `observable` creates a _clone_ that is made observable. + +The second difference is that `observable` creates a `Proxy` object, to be able to trap future property additions in case you use the object as a dynamic lookup map. +If the object you want to make observable has a regular structure where all members are known up-front, we recommend to use `makeObservable`: Non proxied objects are a little faster, and they are easier to inspect in the debugger / `console.log`. +So `make(Auto)Observable` is the recommended API to use in for example factory functions. +Note that it is possible to pass `{ proxy: false }` as option to `observable` to get an non-proxied clone. + +
    + ## Available annotations | Annotation | Description | diff --git a/flow-typed/mobx.js b/flow-typed/mobx.js index b064ba204..c8fa08c65 100644 --- a/flow-typed/mobx.js +++ b/flow-typed/mobx.js @@ -456,8 +456,6 @@ declare export function isObservableArray(thing: any): boolean declare export function isObservableObject(thing: T): boolean -declare export function isArrayLike(x: any): boolean - declare export class Reaction { name: string; isDisposed: boolean; diff --git a/notes.md b/notes.md index 43c24e004..75e94a53b 100644 --- a/notes.md +++ b/notes.md @@ -75,21 +75,21 @@ - [x] upgrade mobx-utils - [x] upgrade mobx-state-tree - [ ] docs - - [ ] clean up docs - - [ ] fix interactive tut - - [ ] document and introduce flow annotation - - [ ] fix link warnings + - [x] clean up docs + - [x] finish api ref guide + - [ ] fix / drop interactive tut + - [x] document and introduce flow annotation + - [x] fix link warnings - [ ] revisit how-to-read guide with all things in place - [ ] finish migration guide - - [ ] make details section collapsible - - [ ] better sel page - - [ ] link flutter, lit, angular - - [ ] update footer - - [ ] don't proxy objects tip, makeAutoObservable vs observable - - [ ] drop interactive tutorial? + - [x] make details section collapsible + - [x] better sel page + - [x] link flutter, lit, angular + - [x] update footer + - [x] don't proxy objects tip, makeAutoObservable vs observable - [ ] sync readme's - [ ] verify that MobX is by default in strict mode - - [ ] make links for all tips + - [x] make links for all tips - [ ] mobx-react-lite - [x] displayname for observer components facebook/react#18026. Fixed: https://github.com/facebook/react/issues/18026 - [x] update useLocalStore in mobx-react-lite to use diff --git a/src/mobx.ts b/src/mobx.ts index e2b66a60e..59fabcbc1 100644 --- a/src/mobx.ts +++ b/src/mobx.ts @@ -119,7 +119,6 @@ export { allowStateChanges as _allowStateChanges, runInAction as _allowStateChangesInsideComputed, // This has become the default behavior in Mobx 6 Lambda, - isArrayLike, $mobx, isComputingDerivation as _isComputingDerivation, onReactionError, diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 3a10f8d82..c9c5cbe5f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -135,13 +135,6 @@ export function createInstanceofPredicate( } as any } -/** - * Returns whether the argument is an array, disregarding observability. - */ -export function isArrayLike(x: any): x is Array | IObservableArray { - return Array.isArray(x) || isObservableArray(x) -} - export function isES6Map(thing): boolean { return thing instanceof Map } diff --git a/test/v4/base/array.js b/test/v4/base/array.js index af28a8e88..3721f569d 100644 --- a/test/v4/base/array.js +++ b/test/v4/base/array.js @@ -91,7 +91,6 @@ test("array should support iterall / iterable ", () => { const a = observable([1, 2, 3]) expect(iterall.isIterable(a)).toBe(true) - expect(iterall.isArrayLike(a)).toBe(true) const values = [] iterall.forEach(a, v => values.push(v)) @@ -363,19 +362,6 @@ test("array exposes correct keys", () => { expect(keys).toEqual([]) }) -test("isArrayLike", () => { - const arr = [0, 1, 2] - const observableArr = observable(arr) - - const isArrayLike = mobx.isArrayLike - expect(typeof isArrayLike).toBe("function") - - expect(isArrayLike(observableArr)).toBe(true) - expect(isArrayLike(arr)).toBe(true) - expect(isArrayLike(42)).toBe(false) - expect(isArrayLike({})).toBe(false) -}) - test("accessing out of bound values throws", () => { const a = mobx.observable([]) diff --git a/test/v5/base/api.js b/test/v5/base/api.js index 3137a3494..09b437719 100644 --- a/test/v5/base/api.js +++ b/test/v5/base/api.js @@ -35,7 +35,6 @@ test("correct api should be exposed", function () { "intercept", "_interceptReads", "isAction", - "isArrayLike", "isBoxedObservable", "isComputed", "isComputedProp", diff --git a/test/v5/base/array.js b/test/v5/base/array.js index e2b2fc4bd..3252f8ece 100644 --- a/test/v5/base/array.js +++ b/test/v5/base/array.js @@ -128,7 +128,6 @@ test("array should support iterall / iterable ", () => { const a = observable([1, 2, 3]) expect(iterall.isIterable(a)).toBe(true) - expect(iterall.isArrayLike(a)).toBe(true) const values = [] iterall.forEach(a, v => values.push(v)) @@ -398,19 +397,6 @@ test("array exposes correct keys", () => { expect(keys).toEqual(["0", "1"]) }) -test("isArrayLike", () => { - const arr = [0, 1, 2] - const observableArr = observable(arr) - - const isArrayLike = mobx.isArrayLike - expect(typeof isArrayLike).toBe("function") - - expect(isArrayLike(observableArr)).toBe(true) - expect(isArrayLike(arr)).toBe(true) - expect(isArrayLike(42)).toBe(false) - expect(isArrayLike({})).toBe(false) -}) - test("accessing out of bound values throws", () => { const a = mobx.observable([]) diff --git a/website/core/Footer.js b/website/core/Footer.js index f04143803..91a1a4190 100755 --- a/website/core/Footer.js +++ b/website/core/Footer.js @@ -45,6 +45,7 @@ class Footer extends React.Component { {/* User Showcase */} + GitHub discussions (NEW) Stack Overflow - Project Chat
    More
    diff --git a/website/sidebars.json b/website/sidebars.json index 0f4faeb32..d2db92368 100755 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -21,10 +21,10 @@ "best/store", "react/react-performance", "refguide/mobx-utils", - "refguide/object-api", "refguide/computed-with-args", "refguide/extending", "refguide/on-become-observed", + "refguide/object-api", "refguide/observe" ], "Configuring MobX": [ diff --git a/website/siteConfig.js b/website/siteConfig.js index cf22af3b3..1c9811032 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -57,8 +57,8 @@ const siteConfig = { { href: "https://github.com/mobxjs/mobx", label: "Github" } ], - // docsSideNavCollapsible: true, - + // docsSideNavCollapsible: true, + // If you have users set above, you add it here: users, @@ -97,7 +97,8 @@ myOtherFont: [ // Add custom scripts here that would be placed in -# Optimizing rendering React components - -MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753). - -But here are some tips to get most out of React and MobX. Most tips apply to React in general and are not specific for MobX. +# Optimizing rendering of React components +MobX is very fast, [often even faster than Redux](https://twitter.com/mweststrate/status/718444275239882753), but here are some tips to get most out of React and MobX. Most apply to React in general and are not specific to MobX. Note that while it's good to be aware of these patterns, usually your application -will be fast enough if you don't worry about them at all. Prioritize performance only -when it's an actual issue! +will be fast enough even if you don't worry about them at all. + +Prioritize performance only when it's an actual issue! ## Use many small components `observer` components will track all values they use and re-render if any of them changes. -So the smaller your components are, the smaller the change they have to re-render; it means that more parts of your user interface have the possibility to render independently of each other. +So the smaller your components are, the smaller the change they have to re-render. It means that more parts of your user interface have the possibility to render independently of each other. ## Render lists in dedicated components -This is especially true when rendering big collections. +The above is especially true when rendering big collections. React is notoriously bad at rendering large collections as the reconciler has to evaluate the components produced by a collection on each collection change. -It is therefore recommended to have components that just map over a collection and render it, and render nothing else: +It is therefore recommended to have components that just map over a collection and render it, and render nothing else. Bad: @@ -66,7 +64,7 @@ const TodosView = observer(({ todos }) => ( ## Don't use array indexes as keys Don't use array indexes or any value that might change in the future as key. Generate ids for your objects if needed. -See also this [blog](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318). +Check out this [blog](https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318). ## Dereference values late @@ -74,23 +72,23 @@ When using `mobx-react` it is recommended to dereference values as late as possi This is because MobX will re-render components that dereference observable values automatically. If this happens deeper in your component tree, less components have to re-render. -Fast: +Slower: ```javascript - + ``` -Slower: +Faster: ```javascript - + ``` There is nothing wrong with the latter, but a change in the `name` property will, in the first case, trigger only the `DisplayName` to re-render, while in the latter, the owner of the component has to re-render. If rendering the owning component is fast enough (usually it will be!), that approach will work well. ### Function props -[🚀] You may notice that to deference values late you have to create lots of small observer components where each is customized to render some different part of data, for example: +[🚀] You may notice that to dereference values late you have to create lots of small observer components where each is customized to render some different part of data, for example: ```javascript const PersonNameDisplayer = observer(({ person }) => ) From 8237c738440dc1d048a2c726f78cad1f7417b00f Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Fri, 18 Sep 2020 22:59:29 +0100 Subject: [PATCH 0519/1043] Getting started tutorial update --- docs/assets/getting-started-assets/script.js | 30 +- notes.md | 2 +- website/static/getting-started.html | 325 ++++++++----------- 3 files changed, 155 insertions(+), 202 deletions(-) diff --git a/docs/assets/getting-started-assets/script.js b/docs/assets/getting-started-assets/script.js index da8c1948b..1d51fd9ce 100755 --- a/docs/assets/getting-started-assets/script.js +++ b/docs/assets/getting-started-assets/script.js @@ -1,14 +1,12 @@ /* For demo purposes only, component to track its own (and parents) amount of renderings */ -var RenderCounter = React.createClass({ - _c: 0, - render: function() { - return React.createElement( - "div", - { className: "render-counter " + (++this._c % 2 ? "odd" : "even") }, - this._c - ) - } -}) +var RenderCounter = function() { + var _c = React.useRef(0); + return React.createElement( + "div", + { className: "render-counter " + (++_c.current % 2 ? "odd" : "even") }, + _c.current + ) +} // Save the original source before pretty printer is fired function getCodeFromTA(elem) { @@ -26,15 +24,17 @@ function runCodeHelper(code) { window.observable = mobx.observable window.autorun = mobx.autorun window.computed = mobx.computed - window.observer = mobxReact.observer + window.action = mobx.action + window.observer = mobxReactLite.observer + window.makeObservable = mobx.makeObservable + window.makeAutoObservable = mobx.makeAutoObservable var globalEval = eval // global scope trick, See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval + try { code = Babel.transform(code, { presets: ["react", "es2015-no-commonjs", "stage-1"], - plugins: ["transform-decorators-legacy"] }).code.replace(/"use strict"/g, "") - try { globalEval(code) } catch (e) { console.error(e) @@ -98,9 +98,9 @@ console.error = function(arg) { baseError.apply(console, arguments) $console.html( $console.html() + - "
    " + + "
    " +
                 escapeHtml(arg).replace(/\n/, "
    ") + - "
    \n" + "\n" ) } diff --git a/notes.md b/notes.md index 75e94a53b..0ae193008 100644 --- a/notes.md +++ b/notes.md @@ -77,7 +77,7 @@ - [ ] docs - [x] clean up docs - [x] finish api ref guide - - [ ] fix / drop interactive tut + - [x] fix interactive tut - [x] document and introduce flow annotation - [x] fix link warnings - [ ] revisit how-to-read guide with all things in place diff --git a/website/static/getting-started.html b/website/static/getting-started.html index 91a5dd606..846da2ced 100755 --- a/website/static/getting-started.html +++ b/website/static/getting-started.html @@ -44,7 +44,7 @@

    The core idea

    State is the heart of each application and there is no quicker way to create buggy, unmanageable applications than by producing an inconsistent state or state that is out-of-sync with local variables that linger around. Hence many state management solutions try to restrict the ways in which you can modify state, for example by making state immutable. - But this introduces new problems; data needs to be normalized, referential integrity can no longer be guaranteed and it becomes next to impossible to use powerful concepts like prototypes. + But this introduces new problems; data needs to be normalized, referential integrity can no longer be guaranteed and it becomes next to impossible to use powerful concepts like classes in case you fancy those.

    MobX makes state management simple again by addressing the root issue: it makes it impossible to produce an inconsistent state. The strategy to achieve that is simple: @@ -91,29 +91,29 @@

    A simple todo store...

    -

    That's it! We marked some properties as being @observable to signal MobX that these values can change over time. - The computations are decorated with @computed to identify that these can be derived from the state. +

    That's it! We marked some properties as being observable to signal MobX that these values can change over time. + The computations are decorated with computed to identify that these can be derived from the state and caches as long as no underlying state changed.

    The pendingRequests and assignee attributes are not used so far, but will be used later in this tutorial. - For brevity all examples on this page are using ES6, JSX and decorators. - But don't worry, all decorators in MobX have an ES5 counterpart.

    In the constructor we created a small function that prints the report and @@ -234,83 +241,73 @@

    Becoming reactive

    Making React reactive

    Ok, so far we made a silly report reactive. Time to build a reactive user interface around this very same store. React components are (despite their name) not reactive out of the box. - The @observer decorator from the mobx-react package fixes that by - wrapping the React component render method in autorun, automatically - keeping your components in sync with the state. That is conceptually not different from what we did + The observer HoC wrapper from the mobx-react-lite package fixes that by + basically wrapping the React component in autorun. To automatically + keep components in sync with the state. This is conceptually not different from what we did with the report before.

    The next listing defines a few React components. - The only MobX thing in there is the @observer decorator. + The only MobX specific code in there is the observer wrapping. That is enough to make sure that each component individually re-renders when relevant data changes. - You don't need to call setState anymore, - nor do you have to figure out how to subscribe to the proper parts - of your application state using selectors or higher order components that need configuration. + We don't have to call state useState setters anymore, + nor do we have to figure out how to subscribe to the proper parts + of the application state using selectors or higher order components that need configuration. Basically, all components have become smart. Yet they are defined in a dumb, declarative manner.

    Press the Run code button to see the code below in action. The listing is editable so - feel free to play with it. Try for example to remove all the @observer calls, or + feel free to play with it. Try for example to remove all the observer calls, or just the one decorating the TodoView. The numbers in the preview on the right highlight - each time a component is rendered. + how often a component is rendered.