├── .gitignore ├── .versions ├── CHANGELOG.md ├── LICENSE ├── README.md ├── babel ├── README.md ├── babel.js └── package.json ├── package-lock.json ├── package.js ├── package.json ├── react-loadable-both.js ├── react-loadable-client.js ├── react-loadable-server.js ├── tests.js └── tests.snap.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.versions: -------------------------------------------------------------------------------- 1 | allow-deny@1.1.0 2 | babel-compiler@7.5.3 3 | babel-runtime@1.5.0 4 | base64@1.0.12 5 | binary-heap@1.0.11 6 | boilerplate-generator@1.7.1 7 | callback-hook@1.3.0 8 | check@1.3.1 9 | ddp@1.4.0 10 | ddp-client@2.3.3 11 | ddp-common@1.4.0 12 | ddp-server@2.3.2 13 | diff-sequence@1.1.1 14 | dynamic-import@0.5.2 15 | ecmascript@0.14.3 16 | ecmascript-runtime@0.7.0 17 | ecmascript-runtime-client@0.11.0 18 | ecmascript-runtime-server@0.10.0 19 | ejson@1.1.1 20 | fetch@0.1.1 21 | geojson-utils@1.0.10 22 | id-map@1.1.0 23 | inter-process-messaging@0.1.1 24 | local-test:npdev:react-loadable@1.0.0 25 | logging@1.1.20 26 | meteor@1.9.3 27 | minimongo@1.6.0 28 | modern-browsers@0.1.5 29 | modules@0.15.0 30 | modules-runtime@0.12.0 31 | mongo@1.10.0 32 | mongo-decimal@0.1.1 33 | mongo-dev-server@1.1.0 34 | mongo-id@1.0.7 35 | npdev:react-loadable@1.0.0 36 | npm-mongo@3.8.1 37 | ordered-dict@1.1.0 38 | promise@0.11.2 39 | random@1.2.0 40 | reload@1.3.0 41 | retry@1.1.0 42 | routepolicy@1.1.0 43 | socket-stream-client@0.3.1 44 | tinytest@1.1.0 45 | tracker@1.2.0 46 | underscore@1.0.10 47 | webapp@1.9.1 48 | webapp-hashing@1.0.9 49 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [1.0.0] - 2020-10-18 8 | - Make 1.0.0 Release! 9 | 10 | ## [1.0.0-beta.3] - 2020-04-22 11 | - Remove node_modules from deployed package... 12 | - Also create a publish script to prevent this from happening again. 13 | 14 | ## [1.0.0-beta.2] - 2020-04-22 15 | - Increment main versionsFrom constraint, and update testing packages 16 | 17 | ## [1.0.0-beta.1] - 2019-10-02 18 | - Automatically remove the preloadable script tag from DOM during preload. 19 | - Add client side preloadAllLoadables functionality. 20 | 21 | ## [1.0.0-beta.0] - 2019-8-23 22 | - Restored LoadableMap (with Loadable.Map alias) and tests. 23 | 24 | ## [1.0.0-alpha.1] - 2019-8-21 25 | - Moved common code (server/client) into a "both" file. 26 | - Ported some tests from the old npm version to Tinytest. 27 | 28 | ## [1.0.0-alpha.0] 29 | - First version! 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-present James Kyle 4 | Copyright (c) 2019-present Kevin Newman 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining 7 | a copy of this software and associated documentation files (the 8 | "Software"), to deal in the Software without restriction, including 9 | without limitation the rights to use, copy, modify, merge, publish, 10 | distribute, sublicense, and/or sell copies of the Software, and to 11 | permit persons to whom the Software is furnished to do so, subject to 12 | the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![React Loadable](http://thejameskyle.com/img/react-loadable-header.png) 2 | 3 | A higher order component for loading components with dynamic imports. This is a direct port from the original `react-loadable` project to Meteor. 4 | 5 | Meteor has a few different requirements for making this all work, and some incompatibilities with the original `react-loadable` when it comes to server side rendering (SSR). This fork addresses those issues, while also streamlining some of the APIs. The examples in this readme have also been updated for Meteor. 6 | 7 | ## Install 8 | 9 | ```sh 10 | meteor add npdev:react-loadable 11 | ``` 12 | 13 | ## Example 14 | 15 | ```js 16 | import { Loadable } from 'meteor/npdev:react-loadable'; 17 | import Loading from './my-loading-component'; 18 | 19 | const LoadableComponent = Loadable({ 20 | loader: () => import('./my-component'), 21 | loading: Loading, 22 | }); 23 | 24 | export default class App extends React.Component { 25 | render() { 26 | return ; 27 | } 28 | } 29 | ``` 30 | 31 | ## Happy Customers: 32 | 33 | - ["I'm obsessed with this right now: CRA with React Router v4 and react-loadable. Free code splitting, this is so easy."](https://twitter.com/matzatorski/status/872059865350406144) 34 | - ["Oh hey - using loadable component I knocked 13K off my initial load. Easy win!"](https://twitter.com/AdamRackis/status/846593080992153600) 35 | - ["Had a look and its awesome. shaved like 50kb off our main bundle."](https://github.com/quran/quran.com-frontend/pull/701#issuecomment-287908551) 36 | - ["I've got that server-side rendering + code splitting + PWA ServiceWorker caching setup done 😎 (thanks to react-loadable). Now our frontend is super fast."](https://twitter.com/mxstbr/status/922375575217627136) 37 | - ["Using react-loadable went from 221.28 KB → 115.76 KB @ main bundle. Fucking awesome and very simple API."](https://twitter.com/evgenyrodionov/status/958821614644269057) 38 | - ["We've reduced our entry chunk by a lot & reduced initial load time by ~50%!"](https://github.com/jamiebuilds/react-loadable/pull/181) 39 | - ["React-loadable is killer! We've decreased our load size by over 50kb with only 2 files! Can't wait to see how much lower it will go."](https://github.com/jamiebuilds/react-loadable/pull/180/) 40 | 41 | ## Users 42 | 43 | - [AdHawk / Flooring Stores](https://www.flooringstores.com) 44 | - [Akutbolig.dk](https://www.akutbolig.dk) 45 | - [Analog.Cafe](https://www.analog.cafe) 46 | - [Ambrosus](https://ambrosus.com) 47 | - [Appbase.io](https://github.com/appbaseio/reactivesearch) 48 | - [Atlassian](https://www.atlassian.com/) 49 | - [BBC News](https://github.com/BBC-News/simorgh) 50 | - [Blytzpay](https://www.blytzpay.com) 51 | - [ClearTax](https://cleartax.in) 52 | - [Cloudflare](https://www.cloudflare.com) 53 | - [Chibaki](https://chibaki.co) 54 | - [Curio](https://www.curio.org) 55 | - [Delivery.com](https://www.delivery.com) 56 | - [Doctor.com](https://www.doctor.com/) 57 | - [Dollar Shave Club](https://github.com/dollarshaveclub) 58 | - [Dresez](https://dresez.pk/) 59 | - [Evidation Health](https://evidation.com/) 60 | - [Flyhomes](https://flyhomes.com) 61 | - [Gogo](https://gogoair.com) 62 | - [Gofore](https://gofore.com/en/home/) 63 | - [Graana](https://www.graana.com/) 64 | - [Localie](https://localie.co/en) 65 | - [MediaTek MCS-Lite](https://github.com/MCS-Lite) 66 | - [NiYO Solutions Inc.](https://www.goniyo.com/) 67 | - [NP Dev](https://www.npdev.io/) 68 | - [Officepulse](https://www.officepulse.in/) 69 | - [Perx](https://www.perxtech.com/) 70 | - [Pixstori](https://www.pixstoriplus.com/) 71 | - [Plottu](https://public.plottu.com) 72 | - [Render](https://render.com) 73 | - [Shift](https://shift.com) 74 | - [Snipit](https://snipit.io) 75 | - [Spectrum.chat](https://spectrum.chat) 76 | - [Talentpair](https://talentpair.com) 77 | - [Tinder](https://tinder.com/) 78 | - [Unsplash](https://unsplash.com/) 79 | - [Wave](https://waveapps.com/) 80 | - [WUZZUF](https://wuzzuf.net/) 81 | 82 | > _If your company or project is using React Loadable, please open a PR and add 83 | > yourself to this list (in alphabetical order please)_ 84 | 85 | ## Also See: 86 | 87 | - [`react-loadable-visibility`](https://github.com/stratiformltd/react-loadable-visibility) - Building on top of and keeping the same API as `react-loadable`, this library enables you to load content that is visible on the screen. 88 | 89 |

90 |
91 |
92 | GUIDE 93 |
94 |
95 | Guide 96 |

97 | 98 | So you've got your React app, you're bundling it with Meteor, and things are 99 | going smooth. But then one day you notice your app's bundle is getting so big 100 | that it's slowing things down. 101 | 102 | It's time to start code-splitting your app! 103 | 104 | ![A single giant bundle vs multiple smaller bundles](http://thejameskyle.com/img/react-loadable-split-bundles.png) 105 | 106 | Code-splitting is the process of taking one large bundle containing your entire 107 | app, and splitting them up into multiple smaller bundles which contain separate 108 | parts of your app. 109 | 110 | This might seem difficult to do, but tools like Meteor have this built in, and 111 | React Loadable is designed to make it super simple. 112 | 113 | ### Route-based splitting vs. Component-based splitting 114 | 115 | A common piece of advice you will see is to break your app into separate routes 116 | and load each one asynchronously. This seems to work well enough for many apps– 117 | as a user, clicking a link and waiting for a page to load is a familiar 118 | experience on the web. 119 | 120 | But we can do better than that. 121 | 122 | Using most routing tools for React, a route is simply a component. There's 123 | nothing particularly special about them (Sorry Ryan and Michael– you're what's 124 | special). So what if we optimized for splitting around components instead of 125 | routes? What would that get us? 126 | 127 | ![Route vs. component centric code splitting](http://thejameskyle.com/img/react-loadable-component-splitting.png) 128 | 129 | As it turns out: Quite a lot. There are many more places than just routes where 130 | you can pretty easily split apart your app. Modals, tabs, and many more UI 131 | components hide content until the user has done something to reveal it. 132 | 133 | > **Example:** Maybe your app has a map buried inside of a tab component. Why 134 | > would you load a massive mapping library for the parent route every time when 135 | > the user may never go to that tab? 136 | 137 | Not to mention all the places where you can defer loading content until higher 138 | priority content is finished loading. That component at the bottom of your page 139 | which loads a bunch of libraries: Why should that be loaded at the same time as 140 | the content at the top? 141 | 142 | And because routes are just components, we can still easily code-split at the 143 | route level. 144 | 145 | Introducing new code-splitting points in your app should be so easy that you 146 | don't think twice about it. It should be a matter of changing a few lines of 147 | code and everything else should be automated. 148 | 149 | ### Introducing React Loadable 150 | 151 | React Loadable is a small library that makes component-centric code splitting 152 | incredibly easy in React. 153 | 154 | `Loadable` is a higher-order component (a function that creates a component) 155 | which lets you dynamically load any module before rendering it into your app. 156 | 157 | Let's imagine two components, one that imports and renders another. 158 | 159 | ```js 160 | import Bar from './components/Bar'; 161 | 162 | class Foo extends React.Component { 163 | render() { 164 | return ; 165 | } 166 | } 167 | ``` 168 | 169 | Right now we're depending on `Bar` being imported synchronously via `import`, 170 | but we don't need it until we go to render it. So why don't we just defer that? 171 | 172 | Using a **dynamic import** ([a tc39 proposal currently at Stage 3](https://github.com/tc39/proposal-dynamic-import)) 173 | we can modify our component to load `Bar` asynchronously. 174 | 175 | ```js 176 | class MyComponent extends React.Component { 177 | state = { 178 | Bar: null 179 | }; 180 | 181 | componentDidMount() { 182 | import('./components/Bar').then(Bar => { 183 | this.setState({ Bar: Bar.default }); 184 | }); 185 | } 186 | 187 | render() { 188 | let {Bar} = this.state; 189 | if (!Bar) { 190 | return
Loading...
; 191 | } else { 192 | return ; 193 | }; 194 | } 195 | } 196 | ``` 197 | 198 | But that's a whole bunch of work, and it doesn't even handle a bunch of cases. 199 | What about when `import()` fails? What about server-side rendering? 200 | 201 | Instead you can use `Loadable` to abstract away the problem. 202 | 203 | ```js 204 | import { Loadable } from 'meteor/npdev:react-loadable'; 205 | 206 | const LoadableBar = Loadable({ 207 | loader: () => import('./components/Bar'), 208 | loading() { 209 | return
Loading...
210 | } 211 | }); 212 | 213 | class MyComponent extends React.Component { 214 | render() { 215 | return ; 216 | } 217 | } 218 | ``` 219 | 220 | ### Automatic code-splitting on `import()` 221 | 222 | When you use `import()` with Meteor 1.5+, it will 223 | [automatically code-split](https://blog.meteor.com/dynamic-imports-in-meteor-1-5-c6130419c3cd) for 224 | you with no additional configuration. 225 | 226 | This means that you can easily experiment with new code splitting points just 227 | by switching to `import()` and using React Loadable. Figure out what performs 228 | best for your app. 229 | 230 | ### Creating a great "Loading..." Component 231 | 232 | Rendering a static "Loading..." doesn't communicate enough to the user. You 233 | also need to think about error states, timeouts, and making it a nice 234 | experience. 235 | 236 | ```js 237 | function Loading() { 238 | return
Loading...
; 239 | } 240 | 241 | Loadable({ 242 | loader: () => import('./WillFailToLoad'), // oh no! 243 | loading: Loading, 244 | }); 245 | ``` 246 | 247 | To make this all nice, your [loading component](#loadingcomponent) receives a 248 | couple different props. 249 | 250 | #### Loading error states 251 | 252 | When your [`loader`](optsloader) fails, your [loading component](#loadingcomponent) 253 | will receive an [`error`](propserror) prop which will be an `Error` object (otherwise it 254 | will be `null`). 255 | 256 | ```js 257 | function Loading(props) { 258 | if (props.error) { 259 | return
Error!
; 260 | } else { 261 | return
Loading...
; 262 | } 263 | } 264 | ``` 265 | 266 | #### Avoiding _Flash Of Loading Component_ 267 | 268 | Sometimes components load really quickly (<200ms) and the loading screen only 269 | quickly flashes on the screen. 270 | 271 | A number of user studies have proven that this causes users to perceive things 272 | taking longer than they really have. If you don't show anything, users perceive 273 | it as being faster. 274 | 275 | So your loading component will also get a [`pastDelay` prop](#propspastdelay) 276 | which will only be true once the component has taken longer to load than a set 277 | [delay](#optsdelay). 278 | 279 | ```js 280 | function Loading(props) { 281 | if (props.error) { 282 | return
Error!
; 283 | } else if (props.pastDelay) { 284 | return
Loading...
; 285 | } else { 286 | return null; 287 | } 288 | } 289 | ``` 290 | 291 | This delay defaults to `200ms` but you can also customize the 292 | [delay](#optsdelay) in `Loadable`. 293 | 294 | ```js 295 | Loadable({ 296 | loader: () => import('./components/Bar'), 297 | loading: Loading, 298 | delay: 300, // 0.3 seconds 299 | }); 300 | ``` 301 | 302 | #### Timing out when the `loader` is taking too long 303 | 304 | Sometimes network connections suck and never resolve or fail, they just hang 305 | there forever. This sucks for the user because they won't know if it should 306 | always take this long, or if they should try refreshing. 307 | 308 | The [loading component](#loadingcomponent) will receive a 309 | [`timedOut` prop](#propstimedout) which will be set to `true` when the 310 | [`loader`](#optsloader) has timed out. 311 | 312 | ```js 313 | function Loading(props) { 314 | if (props.error) { 315 | return
Error!
; 316 | } else if (props.timedOut) { 317 | return
Taking a long time...
; 318 | } else if (props.pastDelay) { 319 | return
Loading...
; 320 | } else { 321 | return null; 322 | } 323 | } 324 | ``` 325 | 326 | However, this feature is disabled by default. To turn it on, you can pass a 327 | [`timeout` option](#optstimeout) to `Loadable`. 328 | 329 | ```js 330 | Loadable({ 331 | loader: () => import('./components/Bar'), 332 | loading: Loading, 333 | timeout: 10000, // 10 seconds 334 | }); 335 | ``` 336 | 337 | ### Customizing rendering 338 | 339 | By default `Loadable` will render the `default` export of the returned module. 340 | If you want to customize this behavior you can use the 341 | [`render` option](#optsrender). 342 | 343 | ```js 344 | Loadable({ 345 | loader: () => import('./my-component'), 346 | render(loaded, props) { 347 | let Component = loaded.namedExport; 348 | return ; 349 | } 350 | }); 351 | ``` 352 | 353 | ### Loading multiple resources 354 | 355 | Technically you can do whatever you want within `loader()` as long as it 356 | returns a promise and [you're able to render something](#customizing-rendering). 357 | But writing it out can be a bit annoying. 358 | 359 | To make it easier to load multiple resources in parallel, you can use 360 | [`LoadableMap`](#loadablemap). 361 | 362 | ```js 363 | LoadableMap({ 364 | loader: { 365 | Bar: () => import('./Bar'), 366 | i18n: () => fetch('./i18n/bar.json').then(res => res.json()), 367 | }, 368 | render(loaded, props) { 369 | let Bar = loaded.Bar.default; 370 | let i18n = loaded.i18n; 371 | return ; 372 | }, 373 | }); 374 | ``` 375 | 376 | When using `LoadableMap` the [`render()` method](#optsrender) is required. It 377 | will be passed a `loaded` param which will be an object matching the shape of 378 | your `loader`. 379 | 380 | ### Preloading 381 | 382 | As an optimization, you can also decide to preload a component before it gets 383 | rendered. 384 | 385 | For example, if you need to load a new component when a button gets pressed, 386 | you could start preloading the component when the user hovers over the button. 387 | 388 | The component created by `Loadable` exposes a 389 | [static `preload` method](#loadablecomponentpreload) which does exactly this. 390 | 391 | ```js 392 | const LoadableBar = Loadable({ 393 | loader: () => import('./Bar'), 394 | loading: Loading, 395 | }); 396 | 397 | class MyComponent extends React.Component { 398 | state = { showBar: false }; 399 | 400 | onClick = () => { 401 | this.setState({ showBar: true }); 402 | }; 403 | 404 | onMouseOver = () => { 405 | LoadableBar.preload(); 406 | }; 407 | 408 | render() { 409 | return ( 410 |
411 | 416 | {this.state.showBar && } 417 |
418 | ) 419 | } 420 | } 421 | ``` 422 | 423 |

424 |
425 |
426 | SERVER SIDE RENDERING 427 |
428 |
429 | Server-Side Rendering 430 |

431 | 432 | When you go to render all these dynamically loaded components, what you'll get 433 | is a whole bunch of loading screens. 434 | 435 | This really sucks, but the good news is that React Loadable is designed to 436 | make server-side rendering work as if nothing is being loaded dynamically. 437 | 438 | Here's our starting server-rendering using [Meteor](https://meteor.com/). 439 | 440 | ```js 441 | import React from 'react' 442 | import { renderToString } from 'react-dom/server' 443 | import { onPageLoad } from 'meteor/server-render' 444 | import App from '/imports/App' 445 | 446 | onPageLoad(sink => { 447 | sink.renderIntoElementById('root', renderToString() 448 | }) 449 | ``` 450 | 451 | ### Preloading all your loadable components on the server 452 | 453 | The first step to rendering the correct content from the server is to make sure 454 | that all of your loadable components are already loaded when you go to render 455 | them. 456 | 457 | To do this, you can use the [`preloadLoadables`](#preloadloadables) 458 | method. It returns a promise that will resolve when all your loadable 459 | components are ready. 460 | 461 | ```js 462 | preloadLoadables().then(() => { 463 | onPageLoad(sink => { 464 | sink.renderIntoElementById('root', renderToString() 465 | }) 466 | }); 467 | ``` 468 | 469 | ### Picking up a server-side rendered app on the client 470 | 471 | This is where things get a little bit tricky. So let's prepare ourselves 472 | little bit. 473 | 474 | In order for us to pick up what was rendered from the server we need to have 475 | all the same code that was used to render on the server. 476 | 477 | To do this, we first need our loadable components telling us which modules they 478 | are rendering. 479 | 480 | #### Declaring which modules are being loaded 481 | 482 | There is one option in [`Loadable`](#loadable) and 483 | [`LoadableMap`](#loadablemap) which is used to tell us which modules our 484 | component is trying to load: [`opts.meteor`](#optsmeteor). 485 | 486 | ```js 487 | Loadable({ 488 | loader: () => import('./Bar'), 489 | meteor: () => [require.resolve('./Bar')] 490 | }); 491 | ``` 492 | 493 | But don't worry too much about this option. React Loadable includes a 494 | [Babel plugin](#babel-plugin) to add it for you. 495 | 496 | Install the npdev version of the react-loadable babel plugin from npm: 497 | 498 | ``` 499 | $ meteor npm i -D npdev-react-loadable-babel 500 | ``` 501 | 502 | And add the `npdev-react-loadable-babel` plugin to your Babel config: 503 | 504 | ```json 505 | { 506 | "plugins": [ 507 | "npdev-react-loadable-babel" 508 | ] 509 | } 510 | ``` 511 | 512 | Now this option will automatically be provided. 513 | 514 | #### Finding out which dynamic modules were rendered 515 | 516 | Next we need to find out which modules were actually rendered when a request 517 | comes in. 518 | 519 | For this, there is [`LoadableCaptureProvider`](#loadablecaptureprovider) component which can 520 | be used to collect all the modules that were rendered. 521 | 522 | ```js 523 | import { LoadableCaptureProvider, preloadAllLoadables } from 'meteor/npdev:react-loadable' 524 | 525 | preloadAllLoadables().then(() => { 526 | onPageLoad(sink => { 527 | const loadableHandle = {}; 528 | 529 | const html = ReactDOMServer.renderToString( 530 | 531 | 532 | 533 | ); 534 | sink.renderIntoElementById('root', renderToString(app)) 535 | 536 | console.log(modules); 537 | 538 | sink.appendToBody(loadableHandle.toScriptTag()) 539 | }) 540 | }); 541 | ``` 542 | 543 | #### Preloading ready loadable components on the client 544 | 545 | We can use the [`preloadLoadables()`](#preloadLoadables) method on the 546 | client to preload the loadable components that were included on the page. 547 | 548 | Like [`preloadAllLoadables()`](#preloadAllLoadables) on the server, it returns 549 | a promise, which on resolution means that we can hydrate our app. 550 | 551 | ```js 552 | // src/entry.js 553 | import React from 'react'; 554 | import ReactDOM from 'react-dom'; 555 | import { preloadLoadables } from 'meteor/npdev:react-loadable' 556 | import App from './components/App'; 557 | 558 | preloadLoadables().then(() => { 559 | ReactDOM.hydrate(, document.getElementById('app')); 560 | }); 561 | 562 | ``` 563 | 564 |

565 | Now server-side rendering should work perfectly! 566 |

567 | 568 |

569 |
570 |
571 | API DOCS 572 |
573 |
574 | API Docs 575 |

576 | 577 | ### `Loadable` 578 | 579 | A higher-order component for dynamically [loading](#optsloader) a module before 580 | [rendering](#optsrender) it, a [loading](#opts.loading) component is rendered 581 | while the module is unavailable. 582 | 583 | ```js 584 | const LoadableComponent = Loadable({ 585 | loader: () => import('./Bar'), 586 | loading: Loading, 587 | delay: 200, 588 | timeout: 10000, 589 | }); 590 | ``` 591 | 592 | This returns a [LoadableComponent](#loadablecomponent). 593 | 594 | ### `LoadableMap` 595 | 596 | A higher-order component that allows you to load multiple resources in parallel. 597 | 598 | LoadableMap's [`opts.loader`](#optsloader) accepts an object of functions, and 599 | needs a [`opts.render`](#optsrender) method. 600 | 601 | ```js 602 | LoadableMap({ 603 | loader: { 604 | Bar: () => import('./Bar'), 605 | i18n: () => fetch('./i18n/bar.json').then(res => res.json()), 606 | }, 607 | render(loaded, props) { 608 | let Bar = loaded.Bar.default; 609 | let i18n = loaded.i18n; 610 | return ; 611 | } 612 | }); 613 | ``` 614 | 615 | When using `LoadableMap` the `render()` method's `loaded` param will be an 616 | object with the same shape as your `loader`. Note: A reference to `LoadableMap` 617 | is available on `Loadable.Map` for backward compatibility and easy porting. 618 | 619 | ### `Loadable` and `LoadableMap` Options 620 | 621 | #### `opts.loader` 622 | 623 | A function returning a promise that loads your module. 624 | 625 | ```js 626 | Loadable({ 627 | loader: () => import('./Bar'), 628 | }); 629 | ``` 630 | 631 | When using with [`LoadableMap`](#loadablemap) this accepts an object of these 632 | types of functions. 633 | 634 | ```js 635 | LoadableMap({ 636 | loader: { 637 | Bar: () => import('./Bar'), 638 | i18n: () => fetch('./i18n/bar.json').then(res => res.json()), 639 | }, 640 | }); 641 | ``` 642 | 643 | When using with `LoadableMap` you'll also need to pass a 644 | [`opts.render`](#optsrender) function. 645 | 646 | #### `opts.loading` 647 | 648 | A [`LoadingComponent`](#loadingcomponent) that renders while a module is 649 | loading or when it errors. 650 | 651 | ```js 652 | Loadable({ 653 | loading: LoadingComponent, 654 | }); 655 | ``` 656 | 657 | This option is required, if you don't want to render anything, return `null`. 658 | 659 | ```js 660 | Loadable({ 661 | loading: () => null, 662 | }); 663 | ``` 664 | 665 | #### `opts.delay` 666 | 667 | Time to wait (in milliseconds) before passing 668 | [`props.pastDelay`](#propspastdelay) to your [`loading`](#optsloading) 669 | component. This defaults to `200`. 670 | 671 | ```js 672 | Loadable({ 673 | delay: 200 674 | }); 675 | ``` 676 | 677 | [Read more about delays](#avoiding-flash-of-loading-component). 678 | 679 | #### `opts.timeout` 680 | 681 | Time to wait (in milliseconds) before passing 682 | [`props.timedOut`](#propstimedout) to your [`loading`](#optsloading) component. 683 | This is turned off by default. 684 | 685 | ```js 686 | Loadable({ 687 | timeout: 10000 688 | }); 689 | ``` 690 | 691 | [Read more about timeouts](#timing-out-when-the-loader-is-taking-too-long). 692 | 693 | #### `opts.render` 694 | 695 | A function to customize the rendering of loaded modules. 696 | 697 | Receives `loaded` which is the resolved value of [`opts.loader`](#optsloader) 698 | and `props` which are the props passed to the 699 | [`LoadableComponent`](#loadablecomponent). 700 | 701 | ```js 702 | Loadable({ 703 | render(loaded, props) { 704 | let Component = loaded.default; 705 | return ; 706 | } 707 | }); 708 | ``` 709 | 710 | #### `opts.meteor` 711 | 712 | An optional function which returns an array of meteor module ids which you can 713 | get with `require.resolve`. 714 | 715 | ```js 716 | Loadable({ 717 | loader: () => import('./Foo'), 718 | meteor: () => [require.resolve('./Foo')], 719 | }); 720 | ``` 721 | 722 | This option can be automated with the [Babel Plugin](#babel-plugin). 723 | 724 | ### `LoadableComponent` 725 | 726 | This is the component returned by `Loadable` and `LoadableMap`. 727 | 728 | ```js 729 | const LoadableComponent = Loadable({ 730 | // ... 731 | }); 732 | ``` 733 | 734 | Props passed to this component will be passed straight through to the 735 | dynamically loaded component via [`opts.render`](#optsrender). 736 | 737 | #### `LoadableComponent.preload()` 738 | 739 | This is a static method on [`LoadableComponent`](#loadablecomponent) which can 740 | be used to load the component ahead of time. 741 | 742 | ```js 743 | const LoadableComponent = Loadable({...}); 744 | 745 | LoadableComponent.preload(); 746 | ``` 747 | 748 | This returns a promise, but you should avoid waiting for that promise to 749 | resolve to update your UI. In most cases it creates a bad user experience. 750 | 751 | [Read more about preloading](#preloading). 752 | 753 | ### `LoadingComponent` 754 | 755 | This is the component you pass to [`opts.loading`](#optsloading). 756 | 757 | ```js 758 | function LoadingComponent(props) { 759 | if (props.error) { 760 | // When the loader has errored 761 | return
Error!
; 762 | } else if (props.timedOut) { 763 | // When the loader has taken longer than the timeout 764 | return
Taking a long time...
; 765 | } else if (props.pastDelay) { 766 | // When the loader has taken longer than the delay 767 | return
Loading...
; 768 | } else { 769 | // When the loader has just started 770 | return null; 771 | } 772 | } 773 | 774 | Loadable({ 775 | loading: LoadingComponent, 776 | }); 777 | ``` 778 | 779 | [Read more about loading components](#creating-a-great-loading-component) 780 | 781 | #### `props.error` 782 | 783 | An `Error` object passed to [`LoadingComponent`](#loadingcomponent) when the 784 | [`loader`](#optsloader) has failed. When there is no error, `null` is 785 | passed. 786 | 787 | ```js 788 | function LoadingComponent(props) { 789 | if (props.error) { 790 | return
Error!
; 791 | } else { 792 | return
Loading...
; 793 | } 794 | } 795 | ``` 796 | 797 | [Read more about errors](#loading-error-states). 798 | 799 | #### `props.timedOut` 800 | 801 | A boolean prop passed to [`LoadingComponent`](#loadingcomponent) after a set 802 | [`timeout`](#optstimeout). 803 | 804 | ```js 805 | function LoadingComponent(props) { 806 | if (props.timedOut) { 807 | return
Taking a long time...
; 808 | } else { 809 | return
Loading...
; 810 | } 811 | } 812 | ``` 813 | 814 | [Read more about timeouts](#timing-out-when-the-loader-is-taking-too-long). 815 | 816 | #### `props.pastDelay` 817 | 818 | A boolean prop passed to [`LoadingComponent`](#loadingcomponent) after a set 819 | [`delay`](#optsdelay). 820 | 821 | ```js 822 | function LoadingComponent(props) { 823 | if (props.pastDelay) { 824 | return
Loading...
; 825 | } else { 826 | return null; 827 | } 828 | } 829 | ``` 830 | 831 | [Read more about delays](#avoiding-flash-of-loading-component). 832 | 833 | ### `preloadAllLoadables()` 834 | 835 | This will call all of the 836 | [`LoadableComponent.preload`](#loadablecomponentpreload) methods recursively 837 | until they are all resolved. Allowing you to preload all of your dynamic 838 | modules in environments like the server. 839 | 840 | ```js 841 | import { preloadAllLoadables } from 'meteor/npdev:react-loadable' 842 | 843 | preloadAllLoadables().then(() => onPageLoad(sink => { 844 | // do server rendering 845 | }); 846 | ``` 847 | 848 | It's important to note that this requires that you declare all of your loadable 849 | components when modules are initialized rather than when your app is being 850 | rendered. 851 | 852 | **Good:** 853 | 854 | ```js 855 | // During module initialization... 856 | const LoadableComponent = Loadable({...}); 857 | 858 | class MyComponent extends React.Component { 859 | componentDidMount() { 860 | // ... 861 | } 862 | } 863 | ``` 864 | 865 | **Bad:** 866 | 867 | ```js 868 | // ... 869 | 870 | class MyComponent extends React.Component { 871 | componentDidMount() { 872 | // During app render... 873 | const LoadableComponent = Loadable({...}); 874 | } 875 | } 876 | ``` 877 | 878 | > **Note:** `preloadLoadables()` will not work if you have more than one 879 | > copy of `react-loadable` in your app. 880 | 881 | [Read more about preloading on the server](#preloading-all-your-loadable-components-on-the-server). 882 | 883 | ### `preloadLoadables()` 884 | 885 | Check for modules that hav been rendered on the server and call the matching 886 | [`LoadableComponent.preload`](#loadablecomponentpreload) methods. 887 | 888 | ```js 889 | preloadLoadables().then(() => { 890 | ReactDOM.hydrate(, document.getElementById('app')); 891 | }); 892 | ``` 893 | 894 | [Read more about preloading on the client](#waiting-to-render-on-the-client-until-all-the-bundles-are-loaded). 895 | 896 | ### `LoadableCaptureProvider` 897 | 898 | A component for recording which modules were rendered in SSR. 899 | 900 | Accepts a `handle` prop, and object which is extended with a list of 901 | resolved module ids, and helpful methods; `toEJON` and `toScriptTag`. 902 | 903 | ```js 904 | import { LoadableCaptureProvider, preloadLoadables } from 'meteor/npdev:react-loadable' 905 | 906 | preloadLoadables().then(() => onPageLoad(sink => { 907 | const loadableHandle = {}; 908 | 909 | const html = ReactDOMServer.renderToString( 910 | 911 | 912 | 913 | ); 914 | sink.renderIntoElementById('root', html) 915 | 916 | console.log(loadableHandle); 917 | 918 | sink.appendToBody(loadableHandle.toScriptTag()); 919 | })); 920 | ``` 921 | 922 | [Read more about capturing rendered modules](#finding-out-which-dynamic-modules-were-rendered). 923 | 924 | ## Babel Plugin 925 | 926 | Providing [`opts.meteor`](#optsmeteor) for 927 | every loadable component is a lot of manual work to remember to do. 928 | 929 | Instead you can install the babel plugin from npm, and add the 930 | Babel plugin to your config and it will automate it for you: 931 | 932 | ``` 933 | $ meteor npm i -D npdev-react-loadable-babel 934 | ``` 935 | 936 | ```json 937 | { 938 | "plugins": ["npdev-react-loadable-babel"] 939 | } 940 | ``` 941 | 942 | **Input** 943 | 944 | ```js 945 | import { Loadable, LoadableMap } from 'meteor/npdev:react-loadable'; 946 | 947 | const LoadableMyComponent = Loadable({ 948 | loader: () => import('./MyComponent'), 949 | }); 950 | 951 | const LoadableComponents = LoadableMap({ 952 | loader: { 953 | One: () => import('./One'), 954 | Two: () => import('./Two'), 955 | }, 956 | }); 957 | ``` 958 | 959 | **Output** 960 | 961 | ```js 962 | import { Loadable, LoadableMap } from 'meteor/npdev:react-loadable'; 963 | import path from 'path'; 964 | 965 | const LoadableMyComponent = Loadable({ 966 | loader: () => import('./MyComponent'), 967 | meteor: () => [require.resolve('./MyComponent')] 968 | }); 969 | 970 | const LoadableComponents = LoadableMap({ 971 | loader: { 972 | One: () => import('./One'), 973 | Two: () => import('./Two'), 974 | }, 975 | meteor: () => [require.resolve('./One'), require.resolve('./Two')] 976 | }); 977 | ``` 978 | 979 | [Read more about declaring modules](#declaring-which-modules-are-being-loaded). 980 | 981 | ### How do I avoid repetition? 982 | 983 | Specifying the same `loading` component or `delay` every time you use 984 | `Loadable()` gets repetitive fast. Instead you can wrap `Loadable` with your 985 | own Higher-Order Component (HOC) to set default options. 986 | 987 | ```js 988 | import { Loadable } from 'meteor/npdev:react-loadable'; 989 | import Loading from './my-loading-component'; 990 | 991 | export default function MyLoadable(opts) { 992 | return Loadable(Object.assign({ 993 | loading: Loading, 994 | delay: 200, 995 | timeout: 10000, 996 | }, opts)); 997 | }; 998 | ``` 999 | 1000 | Then you can just specify a `loader` when you go to use it. 1001 | 1002 | ```js 1003 | import MyLoadable from './MyLoadable'; 1004 | 1005 | const LoadableMyComponent = MyLoadable({ 1006 | loader: () => import('./MyComponent'), 1007 | }); 1008 | 1009 | export default class App extends React.Component { 1010 | render() { 1011 | return ; 1012 | } 1013 | } 1014 | ``` 1015 | 1016 | Unfortunately at the moment using wrapped Loadable breaks [npdev-react-loadable-babel](#babel-plugin) so in such case you have to add required property (`meteor`) manually. 1017 | 1018 | ```js 1019 | import MyLoadable from './MyLoadable'; 1020 | 1021 | const LoadableMyComponent = MyLoadable({ 1022 | loader: () => import('./MyComponent'), 1023 | meteor: () => [require.resolve('./MyComponent')] 1024 | }); 1025 | 1026 | export default class App extends React.Component { 1027 | render() { 1028 | return ; 1029 | } 1030 | } 1031 | ``` 1032 | -------------------------------------------------------------------------------- /babel/README.md: -------------------------------------------------------------------------------- 1 | npdev-babel-react-loadable 2 | ========================== 3 | 4 | This is a babel plugin for use with `npdev:react-loadable`, a port of [React Loadable](https://github.com/jamiebuilds/react-loadable) for Meteor. It is not meant to be used on its own. 5 | 6 | See the [npdev:react-loadable readme](https://github.com/CaptainN/npdev-react-loadable) for more details. 7 | -------------------------------------------------------------------------------- /babel/babel.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | exports.__esModule = true 3 | exports.default = function ({ types: t }) { 4 | return { 5 | visitor: { 6 | ImportDeclaration (path) { 7 | var source = path.node.source.value 8 | if (source !== 'meteor/npdev:react-loadable') return 9 | 10 | var specifier = path.get('specifiers').find(specifier => { 11 | return (specifier.parent.source.value === 'meteor/npdev:react-loadable' && 12 | specifier.node.local.name === 'Loadable') 13 | }) 14 | 15 | if (!specifier) return 16 | 17 | var bindingName = specifier.node.local.name 18 | var binding = path.scope.getBinding(bindingName) 19 | 20 | binding.referencePaths.forEach(refPath => { 21 | var callExpression = refPath.parentPath 22 | 23 | if ( 24 | callExpression.isMemberExpression() && 25 | callExpression.node.computed === false && 26 | callExpression.get('property').isIdentifier({ name: 'Map' }) 27 | ) { 28 | callExpression = callExpression.parentPath 29 | } 30 | 31 | if (!callExpression.isCallExpression()) return 32 | 33 | var args = callExpression.get('arguments') 34 | if (args.length !== 1) throw callExpression.error 35 | 36 | var options = args[0] 37 | if (!options.isObjectExpression()) return 38 | 39 | var properties = options.get('properties') 40 | var propertiesMap = {} 41 | 42 | properties.forEach(property => { 43 | var key = property.get('key') 44 | propertiesMap[key.node.name] = property 45 | }) 46 | 47 | if (propertiesMap.meteor) { 48 | return 49 | } 50 | 51 | var loaderMethod = propertiesMap.loader.get('value') 52 | var dynamicImports = [] 53 | 54 | loaderMethod.traverse({ 55 | Import (path) { 56 | dynamicImports.push(path.parentPath) 57 | } 58 | }) 59 | 60 | if (!dynamicImports.length) return 61 | 62 | propertiesMap.loader.insertAfter( 63 | t.objectProperty( 64 | t.identifier('meteor'), 65 | t.arrowFunctionExpression( 66 | [], 67 | t.arrayExpression( 68 | dynamicImports.map(dynamicImport => { 69 | return t.callExpression( 70 | t.memberExpression( 71 | t.identifier('require'), 72 | t.identifier('resolve') 73 | ), 74 | [dynamicImport.get('arguments')[0].node] 75 | ) 76 | }) 77 | ) 78 | ) 79 | ) 80 | ) 81 | }) 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /babel/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npdev-react-loadable-babel", 3 | "version": "1.1.0", 4 | "description": "The babel plugin for use with `npdev:react-loadable` in Meteor projects.", 5 | "main": "babel.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/CaptainN/npdev-react-loadable.git" 12 | }, 13 | "keywords": [ 14 | "react", 15 | "loadable", 16 | "code splitting", 17 | "dynamic imports" 18 | ], 19 | "author": "James Kyle & Kevin Newman", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/CaptainN/npdev-react-loadable/issues" 23 | }, 24 | "homepage": "https://github.com/CaptainN/npdev-react-loadable" 25 | } 26 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npdev-react-loadable", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@babel/code-frame": { 7 | "version": "7.8.3", 8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 9 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 10 | "dev": true, 11 | "requires": { 12 | "@babel/highlight": "^7.8.3" 13 | } 14 | }, 15 | "@babel/generator": { 16 | "version": "7.9.5", 17 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", 18 | "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", 19 | "dev": true, 20 | "requires": { 21 | "@babel/types": "^7.9.5", 22 | "jsesc": "^2.5.1", 23 | "lodash": "^4.17.13", 24 | "source-map": "^0.5.0" 25 | } 26 | }, 27 | "@babel/helper-function-name": { 28 | "version": "7.9.5", 29 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", 30 | "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/helper-get-function-arity": "^7.8.3", 34 | "@babel/template": "^7.8.3", 35 | "@babel/types": "^7.9.5" 36 | } 37 | }, 38 | "@babel/helper-get-function-arity": { 39 | "version": "7.8.3", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", 41 | "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", 42 | "dev": true, 43 | "requires": { 44 | "@babel/types": "^7.8.3" 45 | } 46 | }, 47 | "@babel/helper-split-export-declaration": { 48 | "version": "7.8.3", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", 50 | "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", 51 | "dev": true, 52 | "requires": { 53 | "@babel/types": "^7.8.3" 54 | } 55 | }, 56 | "@babel/helper-validator-identifier": { 57 | "version": "7.9.5", 58 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 59 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 60 | "dev": true 61 | }, 62 | "@babel/highlight": { 63 | "version": "7.9.0", 64 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 65 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 66 | "dev": true, 67 | "requires": { 68 | "@babel/helper-validator-identifier": "^7.9.0", 69 | "chalk": "^2.0.0", 70 | "js-tokens": "^4.0.0" 71 | } 72 | }, 73 | "@babel/parser": { 74 | "version": "7.9.4", 75 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", 76 | "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", 77 | "dev": true 78 | }, 79 | "@babel/template": { 80 | "version": "7.8.6", 81 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", 82 | "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", 83 | "dev": true, 84 | "requires": { 85 | "@babel/code-frame": "^7.8.3", 86 | "@babel/parser": "^7.8.6", 87 | "@babel/types": "^7.8.6" 88 | } 89 | }, 90 | "@babel/traverse": { 91 | "version": "7.9.5", 92 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", 93 | "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", 94 | "dev": true, 95 | "requires": { 96 | "@babel/code-frame": "^7.8.3", 97 | "@babel/generator": "^7.9.5", 98 | "@babel/helper-function-name": "^7.9.5", 99 | "@babel/helper-split-export-declaration": "^7.8.3", 100 | "@babel/parser": "^7.9.0", 101 | "@babel/types": "^7.9.5", 102 | "debug": "^4.1.0", 103 | "globals": "^11.1.0", 104 | "lodash": "^4.17.13" 105 | } 106 | }, 107 | "@babel/types": { 108 | "version": "7.9.5", 109 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", 110 | "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", 111 | "dev": true, 112 | "requires": { 113 | "@babel/helper-validator-identifier": "^7.9.5", 114 | "lodash": "^4.17.13", 115 | "to-fast-properties": "^2.0.0" 116 | } 117 | }, 118 | "@eslint/eslintrc": { 119 | "version": "0.1.3", 120 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", 121 | "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", 122 | "dev": true, 123 | "requires": { 124 | "ajv": "^6.12.4", 125 | "debug": "^4.1.1", 126 | "espree": "^7.3.0", 127 | "globals": "^12.1.0", 128 | "ignore": "^4.0.6", 129 | "import-fresh": "^3.2.1", 130 | "js-yaml": "^3.13.1", 131 | "lodash": "^4.17.19", 132 | "minimatch": "^3.0.4", 133 | "strip-json-comments": "^3.1.1" 134 | }, 135 | "dependencies": { 136 | "globals": { 137 | "version": "12.4.0", 138 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 139 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 140 | "dev": true, 141 | "requires": { 142 | "type-fest": "^0.8.1" 143 | } 144 | } 145 | } 146 | }, 147 | "@jest/types": { 148 | "version": "26.5.2", 149 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.5.2.tgz", 150 | "integrity": "sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg==", 151 | "dev": true, 152 | "requires": { 153 | "@types/istanbul-lib-coverage": "^2.0.0", 154 | "@types/istanbul-reports": "^3.0.0", 155 | "@types/node": "*", 156 | "@types/yargs": "^15.0.0", 157 | "chalk": "^4.0.0" 158 | }, 159 | "dependencies": { 160 | "ansi-styles": { 161 | "version": "4.3.0", 162 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 163 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 164 | "dev": true, 165 | "requires": { 166 | "color-convert": "^2.0.1" 167 | } 168 | }, 169 | "chalk": { 170 | "version": "4.1.0", 171 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 172 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 173 | "dev": true, 174 | "requires": { 175 | "ansi-styles": "^4.1.0", 176 | "supports-color": "^7.1.0" 177 | } 178 | }, 179 | "color-convert": { 180 | "version": "2.0.1", 181 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 182 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 183 | "dev": true, 184 | "requires": { 185 | "color-name": "~1.1.4" 186 | } 187 | }, 188 | "color-name": { 189 | "version": "1.1.4", 190 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 191 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 192 | "dev": true 193 | }, 194 | "has-flag": { 195 | "version": "4.0.0", 196 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 197 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 198 | "dev": true 199 | }, 200 | "supports-color": { 201 | "version": "7.2.0", 202 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 203 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 204 | "dev": true, 205 | "requires": { 206 | "has-flag": "^4.0.0" 207 | } 208 | } 209 | } 210 | }, 211 | "@types/istanbul-lib-coverage": { 212 | "version": "2.0.3", 213 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 214 | "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", 215 | "dev": true 216 | }, 217 | "@types/istanbul-lib-report": { 218 | "version": "3.0.0", 219 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 220 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 221 | "dev": true, 222 | "requires": { 223 | "@types/istanbul-lib-coverage": "*" 224 | } 225 | }, 226 | "@types/istanbul-reports": { 227 | "version": "3.0.0", 228 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", 229 | "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", 230 | "dev": true, 231 | "requires": { 232 | "@types/istanbul-lib-report": "*" 233 | } 234 | }, 235 | "@types/json5": { 236 | "version": "0.0.29", 237 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 238 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 239 | "dev": true 240 | }, 241 | "@types/node": { 242 | "version": "14.11.10", 243 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.10.tgz", 244 | "integrity": "sha512-yV1nWZPlMFpoXyoknm4S56y2nlTAuFYaJuQtYRAOU7xA/FJ9RY0Xm7QOkaYMMmr8ESdHIuUb6oQgR/0+2NqlyA==", 245 | "dev": true 246 | }, 247 | "@types/yargs": { 248 | "version": "15.0.9", 249 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", 250 | "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", 251 | "dev": true, 252 | "requires": { 253 | "@types/yargs-parser": "*" 254 | } 255 | }, 256 | "@types/yargs-parser": { 257 | "version": "15.0.0", 258 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", 259 | "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", 260 | "dev": true 261 | }, 262 | "acorn": { 263 | "version": "7.4.1", 264 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 265 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 266 | "dev": true 267 | }, 268 | "acorn-jsx": { 269 | "version": "5.3.1", 270 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 271 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 272 | "dev": true 273 | }, 274 | "ajv": { 275 | "version": "6.12.6", 276 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 277 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 278 | "dev": true, 279 | "requires": { 280 | "fast-deep-equal": "^3.1.1", 281 | "fast-json-stable-stringify": "^2.0.0", 282 | "json-schema-traverse": "^0.4.1", 283 | "uri-js": "^4.2.2" 284 | } 285 | }, 286 | "ansi-colors": { 287 | "version": "4.1.1", 288 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 289 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 290 | "dev": true 291 | }, 292 | "ansi-regex": { 293 | "version": "5.0.0", 294 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 295 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 296 | "dev": true 297 | }, 298 | "ansi-styles": { 299 | "version": "3.2.1", 300 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 301 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 302 | "dev": true, 303 | "requires": { 304 | "color-convert": "^1.9.0" 305 | } 306 | }, 307 | "argparse": { 308 | "version": "1.0.10", 309 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 310 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 311 | "dev": true, 312 | "requires": { 313 | "sprintf-js": "~1.0.2" 314 | } 315 | }, 316 | "array-includes": { 317 | "version": "3.1.1", 318 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 319 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 320 | "dev": true, 321 | "requires": { 322 | "define-properties": "^1.1.3", 323 | "es-abstract": "^1.17.0", 324 | "is-string": "^1.0.5" 325 | } 326 | }, 327 | "array.prototype.flat": { 328 | "version": "1.2.3", 329 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", 330 | "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", 331 | "dev": true, 332 | "requires": { 333 | "define-properties": "^1.1.3", 334 | "es-abstract": "^1.17.0-next.1" 335 | } 336 | }, 337 | "array.prototype.flatmap": { 338 | "version": "1.2.3", 339 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", 340 | "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", 341 | "dev": true, 342 | "requires": { 343 | "define-properties": "^1.1.3", 344 | "es-abstract": "^1.17.0-next.1", 345 | "function-bind": "^1.1.1" 346 | } 347 | }, 348 | "astral-regex": { 349 | "version": "1.0.0", 350 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 351 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 352 | "dev": true 353 | }, 354 | "babel-eslint": { 355 | "version": "10.1.0", 356 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", 357 | "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", 358 | "dev": true, 359 | "requires": { 360 | "@babel/code-frame": "^7.0.0", 361 | "@babel/parser": "^7.7.0", 362 | "@babel/traverse": "^7.7.0", 363 | "@babel/types": "^7.7.0", 364 | "eslint-visitor-keys": "^1.0.0", 365 | "resolve": "^1.12.0" 366 | } 367 | }, 368 | "balanced-match": { 369 | "version": "1.0.0", 370 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 371 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 372 | "dev": true 373 | }, 374 | "brace-expansion": { 375 | "version": "1.1.11", 376 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 377 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 378 | "dev": true, 379 | "requires": { 380 | "balanced-match": "^1.0.0", 381 | "concat-map": "0.0.1" 382 | } 383 | }, 384 | "callsites": { 385 | "version": "3.1.0", 386 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 387 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 388 | "dev": true 389 | }, 390 | "chalk": { 391 | "version": "2.4.2", 392 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 393 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 394 | "dev": true, 395 | "requires": { 396 | "ansi-styles": "^3.2.1", 397 | "escape-string-regexp": "^1.0.5", 398 | "supports-color": "^5.3.0" 399 | } 400 | }, 401 | "color-convert": { 402 | "version": "1.9.3", 403 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 404 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 405 | "dev": true, 406 | "requires": { 407 | "color-name": "1.1.3" 408 | } 409 | }, 410 | "color-name": { 411 | "version": "1.1.3", 412 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 413 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 414 | "dev": true 415 | }, 416 | "concat-map": { 417 | "version": "0.0.1", 418 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 419 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 420 | "dev": true 421 | }, 422 | "contains-path": { 423 | "version": "0.1.0", 424 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 425 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 426 | "dev": true 427 | }, 428 | "cross-spawn": { 429 | "version": "7.0.3", 430 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 431 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 432 | "dev": true, 433 | "requires": { 434 | "path-key": "^3.1.0", 435 | "shebang-command": "^2.0.0", 436 | "which": "^2.0.1" 437 | } 438 | }, 439 | "debug": { 440 | "version": "4.1.1", 441 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 442 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 443 | "dev": true, 444 | "requires": { 445 | "ms": "^2.1.1" 446 | } 447 | }, 448 | "deep-is": { 449 | "version": "0.1.3", 450 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 451 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 452 | "dev": true 453 | }, 454 | "define-properties": { 455 | "version": "1.1.3", 456 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 457 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 458 | "dev": true, 459 | "requires": { 460 | "object-keys": "^1.0.12" 461 | } 462 | }, 463 | "doctrine": { 464 | "version": "3.0.0", 465 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 466 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 467 | "dev": true, 468 | "requires": { 469 | "esutils": "^2.0.2" 470 | } 471 | }, 472 | "emoji-regex": { 473 | "version": "7.0.3", 474 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 475 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 476 | "dev": true 477 | }, 478 | "enquirer": { 479 | "version": "2.3.6", 480 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 481 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 482 | "dev": true, 483 | "requires": { 484 | "ansi-colors": "^4.1.1" 485 | } 486 | }, 487 | "error-ex": { 488 | "version": "1.3.2", 489 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 490 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 491 | "dev": true, 492 | "requires": { 493 | "is-arrayish": "^0.2.1" 494 | } 495 | }, 496 | "es-abstract": { 497 | "version": "1.17.7", 498 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", 499 | "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", 500 | "dev": true, 501 | "requires": { 502 | "es-to-primitive": "^1.2.1", 503 | "function-bind": "^1.1.1", 504 | "has": "^1.0.3", 505 | "has-symbols": "^1.0.1", 506 | "is-callable": "^1.2.2", 507 | "is-regex": "^1.1.1", 508 | "object-inspect": "^1.8.0", 509 | "object-keys": "^1.1.1", 510 | "object.assign": "^4.1.1", 511 | "string.prototype.trimend": "^1.0.1", 512 | "string.prototype.trimstart": "^1.0.1" 513 | } 514 | }, 515 | "es-to-primitive": { 516 | "version": "1.2.1", 517 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 518 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 519 | "dev": true, 520 | "requires": { 521 | "is-callable": "^1.1.4", 522 | "is-date-object": "^1.0.1", 523 | "is-symbol": "^1.0.2" 524 | } 525 | }, 526 | "escape-string-regexp": { 527 | "version": "1.0.5", 528 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 529 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 530 | "dev": true 531 | }, 532 | "eslint": { 533 | "version": "7.11.0", 534 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", 535 | "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", 536 | "dev": true, 537 | "requires": { 538 | "@babel/code-frame": "^7.0.0", 539 | "@eslint/eslintrc": "^0.1.3", 540 | "ajv": "^6.10.0", 541 | "chalk": "^4.0.0", 542 | "cross-spawn": "^7.0.2", 543 | "debug": "^4.0.1", 544 | "doctrine": "^3.0.0", 545 | "enquirer": "^2.3.5", 546 | "eslint-scope": "^5.1.1", 547 | "eslint-utils": "^2.1.0", 548 | "eslint-visitor-keys": "^2.0.0", 549 | "espree": "^7.3.0", 550 | "esquery": "^1.2.0", 551 | "esutils": "^2.0.2", 552 | "file-entry-cache": "^5.0.1", 553 | "functional-red-black-tree": "^1.0.1", 554 | "glob-parent": "^5.0.0", 555 | "globals": "^12.1.0", 556 | "ignore": "^4.0.6", 557 | "import-fresh": "^3.0.0", 558 | "imurmurhash": "^0.1.4", 559 | "is-glob": "^4.0.0", 560 | "js-yaml": "^3.13.1", 561 | "json-stable-stringify-without-jsonify": "^1.0.1", 562 | "levn": "^0.4.1", 563 | "lodash": "^4.17.19", 564 | "minimatch": "^3.0.4", 565 | "natural-compare": "^1.4.0", 566 | "optionator": "^0.9.1", 567 | "progress": "^2.0.0", 568 | "regexpp": "^3.1.0", 569 | "semver": "^7.2.1", 570 | "strip-ansi": "^6.0.0", 571 | "strip-json-comments": "^3.1.0", 572 | "table": "^5.2.3", 573 | "text-table": "^0.2.0", 574 | "v8-compile-cache": "^2.0.3" 575 | }, 576 | "dependencies": { 577 | "ansi-styles": { 578 | "version": "4.3.0", 579 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 580 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 581 | "dev": true, 582 | "requires": { 583 | "color-convert": "^2.0.1" 584 | } 585 | }, 586 | "chalk": { 587 | "version": "4.1.0", 588 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 589 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 590 | "dev": true, 591 | "requires": { 592 | "ansi-styles": "^4.1.0", 593 | "supports-color": "^7.1.0" 594 | } 595 | }, 596 | "color-convert": { 597 | "version": "2.0.1", 598 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 599 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 600 | "dev": true, 601 | "requires": { 602 | "color-name": "~1.1.4" 603 | } 604 | }, 605 | "color-name": { 606 | "version": "1.1.4", 607 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 608 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 609 | "dev": true 610 | }, 611 | "eslint-visitor-keys": { 612 | "version": "2.0.0", 613 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", 614 | "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", 615 | "dev": true 616 | }, 617 | "globals": { 618 | "version": "12.4.0", 619 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 620 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 621 | "dev": true, 622 | "requires": { 623 | "type-fest": "^0.8.1" 624 | } 625 | }, 626 | "has-flag": { 627 | "version": "4.0.0", 628 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 629 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 630 | "dev": true 631 | }, 632 | "semver": { 633 | "version": "7.3.2", 634 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 635 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 636 | "dev": true 637 | }, 638 | "supports-color": { 639 | "version": "7.2.0", 640 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 641 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 642 | "dev": true, 643 | "requires": { 644 | "has-flag": "^4.0.0" 645 | } 646 | } 647 | } 648 | }, 649 | "eslint-config-standard": { 650 | "version": "14.1.1", 651 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", 652 | "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", 653 | "dev": true 654 | }, 655 | "eslint-config-standard-jsx": { 656 | "version": "8.1.0", 657 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-8.1.0.tgz", 658 | "integrity": "sha512-ULVC8qH8qCqbU792ZOO6DaiaZyHNS/5CZt3hKqHkEhVlhPEPN3nfBqqxJCyp59XrjIBZPu1chMYe9T2DXZ7TMw==", 659 | "dev": true 660 | }, 661 | "eslint-import-resolver-meteor": { 662 | "version": "0.4.0", 663 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-meteor/-/eslint-import-resolver-meteor-0.4.0.tgz", 664 | "integrity": "sha1-yGhjhAghIIz4EzxczlGQnCamFWk=", 665 | "dev": true, 666 | "requires": { 667 | "object-assign": "^4.0.1", 668 | "resolve": "^1.1.6" 669 | } 670 | }, 671 | "eslint-import-resolver-node": { 672 | "version": "0.3.4", 673 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", 674 | "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", 675 | "dev": true, 676 | "requires": { 677 | "debug": "^2.6.9", 678 | "resolve": "^1.13.1" 679 | }, 680 | "dependencies": { 681 | "debug": { 682 | "version": "2.6.9", 683 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 684 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 685 | "dev": true, 686 | "requires": { 687 | "ms": "2.0.0" 688 | } 689 | }, 690 | "ms": { 691 | "version": "2.0.0", 692 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 693 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 694 | "dev": true 695 | }, 696 | "resolve": { 697 | "version": "1.17.0", 698 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 699 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 700 | "dev": true, 701 | "requires": { 702 | "path-parse": "^1.0.6" 703 | } 704 | } 705 | } 706 | }, 707 | "eslint-module-utils": { 708 | "version": "2.6.0", 709 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", 710 | "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", 711 | "dev": true, 712 | "requires": { 713 | "debug": "^2.6.9", 714 | "pkg-dir": "^2.0.0" 715 | }, 716 | "dependencies": { 717 | "debug": { 718 | "version": "2.6.9", 719 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 720 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 721 | "dev": true, 722 | "requires": { 723 | "ms": "2.0.0" 724 | } 725 | }, 726 | "ms": { 727 | "version": "2.0.0", 728 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 729 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 730 | "dev": true 731 | } 732 | } 733 | }, 734 | "eslint-plugin-es": { 735 | "version": "3.0.0", 736 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", 737 | "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", 738 | "dev": true, 739 | "requires": { 740 | "eslint-utils": "^2.0.0", 741 | "regexpp": "^3.0.0" 742 | } 743 | }, 744 | "eslint-plugin-import": { 745 | "version": "2.22.1", 746 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", 747 | "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", 748 | "dev": true, 749 | "requires": { 750 | "array-includes": "^3.1.1", 751 | "array.prototype.flat": "^1.2.3", 752 | "contains-path": "^0.1.0", 753 | "debug": "^2.6.9", 754 | "doctrine": "1.5.0", 755 | "eslint-import-resolver-node": "^0.3.4", 756 | "eslint-module-utils": "^2.6.0", 757 | "has": "^1.0.3", 758 | "minimatch": "^3.0.4", 759 | "object.values": "^1.1.1", 760 | "read-pkg-up": "^2.0.0", 761 | "resolve": "^1.17.0", 762 | "tsconfig-paths": "^3.9.0" 763 | }, 764 | "dependencies": { 765 | "debug": { 766 | "version": "2.6.9", 767 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 768 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 769 | "dev": true, 770 | "requires": { 771 | "ms": "2.0.0" 772 | } 773 | }, 774 | "doctrine": { 775 | "version": "1.5.0", 776 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 777 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 778 | "dev": true, 779 | "requires": { 780 | "esutils": "^2.0.2", 781 | "isarray": "^1.0.0" 782 | } 783 | }, 784 | "ms": { 785 | "version": "2.0.0", 786 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 787 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 788 | "dev": true 789 | }, 790 | "resolve": { 791 | "version": "1.17.0", 792 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 793 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 794 | "dev": true, 795 | "requires": { 796 | "path-parse": "^1.0.6" 797 | } 798 | } 799 | } 800 | }, 801 | "eslint-plugin-meteor": { 802 | "version": "7.2.1", 803 | "resolved": "https://registry.npmjs.org/eslint-plugin-meteor/-/eslint-plugin-meteor-7.2.1.tgz", 804 | "integrity": "sha512-P5kyQ+DTQvGiarlaAorEAIyK7u45PvoWCdiH01IxAqDK+7n4sgHVkKaoJuBhxkaA7JNK6jKGTs3AYzai7CUjoA==", 805 | "dev": true, 806 | "requires": { 807 | "invariant": "2.2.4" 808 | } 809 | }, 810 | "eslint-plugin-node": { 811 | "version": "11.1.0", 812 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", 813 | "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", 814 | "dev": true, 815 | "requires": { 816 | "eslint-plugin-es": "^3.0.0", 817 | "eslint-utils": "^2.0.0", 818 | "ignore": "^5.1.1", 819 | "minimatch": "^3.0.4", 820 | "resolve": "^1.10.1", 821 | "semver": "^6.1.0" 822 | }, 823 | "dependencies": { 824 | "ignore": { 825 | "version": "5.1.4", 826 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", 827 | "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", 828 | "dev": true 829 | } 830 | } 831 | }, 832 | "eslint-plugin-promise": { 833 | "version": "4.2.1", 834 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", 835 | "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", 836 | "dev": true 837 | }, 838 | "eslint-plugin-react": { 839 | "version": "7.21.4", 840 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.4.tgz", 841 | "integrity": "sha512-uHeQ8A0hg0ltNDXFu3qSfFqTNPXm1XithH6/SY318UX76CMj7Q599qWpgmMhVQyvhq36pm7qvoN3pb6/3jsTFg==", 842 | "dev": true, 843 | "requires": { 844 | "array-includes": "^3.1.1", 845 | "array.prototype.flatmap": "^1.2.3", 846 | "doctrine": "^2.1.0", 847 | "has": "^1.0.3", 848 | "jsx-ast-utils": "^2.4.1 || ^3.0.0", 849 | "object.entries": "^1.1.2", 850 | "object.fromentries": "^2.0.2", 851 | "object.values": "^1.1.1", 852 | "prop-types": "^15.7.2", 853 | "resolve": "^1.17.0", 854 | "string.prototype.matchall": "^4.0.2" 855 | }, 856 | "dependencies": { 857 | "doctrine": { 858 | "version": "2.1.0", 859 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 860 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 861 | "dev": true, 862 | "requires": { 863 | "esutils": "^2.0.2" 864 | } 865 | }, 866 | "resolve": { 867 | "version": "1.17.0", 868 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 869 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 870 | "dev": true, 871 | "requires": { 872 | "path-parse": "^1.0.6" 873 | } 874 | } 875 | } 876 | }, 877 | "eslint-plugin-react-hooks": { 878 | "version": "4.1.2", 879 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.1.2.tgz", 880 | "integrity": "sha512-ykUeqkGyUGgwTtk78C0o8UG2fzwmgJ0qxBGPp2WqRKsTwcLuVf01kTDRAtOsd4u6whX2XOC8749n2vPydP82fg==", 881 | "dev": true 882 | }, 883 | "eslint-plugin-standard": { 884 | "version": "4.0.1", 885 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", 886 | "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", 887 | "dev": true 888 | }, 889 | "eslint-scope": { 890 | "version": "5.1.1", 891 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 892 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 893 | "dev": true, 894 | "requires": { 895 | "esrecurse": "^4.3.0", 896 | "estraverse": "^4.1.1" 897 | } 898 | }, 899 | "eslint-utils": { 900 | "version": "2.1.0", 901 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 902 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 903 | "dev": true, 904 | "requires": { 905 | "eslint-visitor-keys": "^1.1.0" 906 | } 907 | }, 908 | "eslint-visitor-keys": { 909 | "version": "1.1.0", 910 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 911 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 912 | "dev": true 913 | }, 914 | "espree": { 915 | "version": "7.3.0", 916 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", 917 | "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", 918 | "dev": true, 919 | "requires": { 920 | "acorn": "^7.4.0", 921 | "acorn-jsx": "^5.2.0", 922 | "eslint-visitor-keys": "^1.3.0" 923 | }, 924 | "dependencies": { 925 | "eslint-visitor-keys": { 926 | "version": "1.3.0", 927 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 928 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 929 | "dev": true 930 | } 931 | } 932 | }, 933 | "esprima": { 934 | "version": "4.0.1", 935 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 936 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 937 | "dev": true 938 | }, 939 | "esquery": { 940 | "version": "1.3.1", 941 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 942 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 943 | "dev": true, 944 | "requires": { 945 | "estraverse": "^5.1.0" 946 | }, 947 | "dependencies": { 948 | "estraverse": { 949 | "version": "5.2.0", 950 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 951 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 952 | "dev": true 953 | } 954 | } 955 | }, 956 | "esrecurse": { 957 | "version": "4.3.0", 958 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 959 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 960 | "dev": true, 961 | "requires": { 962 | "estraverse": "^5.2.0" 963 | }, 964 | "dependencies": { 965 | "estraverse": { 966 | "version": "5.2.0", 967 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 968 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 969 | "dev": true 970 | } 971 | } 972 | }, 973 | "estraverse": { 974 | "version": "4.3.0", 975 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 976 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 977 | "dev": true 978 | }, 979 | "esutils": { 980 | "version": "2.0.3", 981 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 982 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 983 | "dev": true 984 | }, 985 | "fast-deep-equal": { 986 | "version": "3.1.3", 987 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 988 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 989 | "dev": true 990 | }, 991 | "fast-json-stable-stringify": { 992 | "version": "2.1.0", 993 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 994 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 995 | "dev": true 996 | }, 997 | "fast-levenshtein": { 998 | "version": "2.0.6", 999 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1000 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1001 | "dev": true 1002 | }, 1003 | "file-entry-cache": { 1004 | "version": "5.0.1", 1005 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 1006 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 1007 | "dev": true, 1008 | "requires": { 1009 | "flat-cache": "^2.0.1" 1010 | } 1011 | }, 1012 | "find-up": { 1013 | "version": "2.1.0", 1014 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1015 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1016 | "dev": true, 1017 | "requires": { 1018 | "locate-path": "^2.0.0" 1019 | } 1020 | }, 1021 | "flat-cache": { 1022 | "version": "2.0.1", 1023 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 1024 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 1025 | "dev": true, 1026 | "requires": { 1027 | "flatted": "^2.0.0", 1028 | "rimraf": "2.6.3", 1029 | "write": "1.0.3" 1030 | } 1031 | }, 1032 | "flatted": { 1033 | "version": "2.0.2", 1034 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 1035 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 1036 | "dev": true 1037 | }, 1038 | "fs.realpath": { 1039 | "version": "1.0.0", 1040 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1041 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1042 | "dev": true 1043 | }, 1044 | "function-bind": { 1045 | "version": "1.1.1", 1046 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1047 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1048 | "dev": true 1049 | }, 1050 | "functional-red-black-tree": { 1051 | "version": "1.0.1", 1052 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1053 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1054 | "dev": true 1055 | }, 1056 | "glob": { 1057 | "version": "7.1.6", 1058 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1059 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1060 | "dev": true, 1061 | "requires": { 1062 | "fs.realpath": "^1.0.0", 1063 | "inflight": "^1.0.4", 1064 | "inherits": "2", 1065 | "minimatch": "^3.0.4", 1066 | "once": "^1.3.0", 1067 | "path-is-absolute": "^1.0.0" 1068 | } 1069 | }, 1070 | "glob-parent": { 1071 | "version": "5.1.1", 1072 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 1073 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 1074 | "dev": true, 1075 | "requires": { 1076 | "is-glob": "^4.0.1" 1077 | } 1078 | }, 1079 | "globals": { 1080 | "version": "11.12.0", 1081 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1082 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1083 | "dev": true 1084 | }, 1085 | "graceful-fs": { 1086 | "version": "4.2.4", 1087 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 1088 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 1089 | "dev": true 1090 | }, 1091 | "has": { 1092 | "version": "1.0.3", 1093 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1094 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1095 | "dev": true, 1096 | "requires": { 1097 | "function-bind": "^1.1.1" 1098 | } 1099 | }, 1100 | "has-flag": { 1101 | "version": "3.0.0", 1102 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1103 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1104 | "dev": true 1105 | }, 1106 | "has-symbols": { 1107 | "version": "1.0.1", 1108 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1109 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1110 | "dev": true 1111 | }, 1112 | "hosted-git-info": { 1113 | "version": "2.8.8", 1114 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 1115 | "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 1116 | "dev": true 1117 | }, 1118 | "ignore": { 1119 | "version": "4.0.6", 1120 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1121 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1122 | "dev": true 1123 | }, 1124 | "import-fresh": { 1125 | "version": "3.2.1", 1126 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 1127 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 1128 | "dev": true, 1129 | "requires": { 1130 | "parent-module": "^1.0.0", 1131 | "resolve-from": "^4.0.0" 1132 | } 1133 | }, 1134 | "imurmurhash": { 1135 | "version": "0.1.4", 1136 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1137 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1138 | "dev": true 1139 | }, 1140 | "inflight": { 1141 | "version": "1.0.6", 1142 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1143 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1144 | "dev": true, 1145 | "requires": { 1146 | "once": "^1.3.0", 1147 | "wrappy": "1" 1148 | } 1149 | }, 1150 | "inherits": { 1151 | "version": "2.0.4", 1152 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1153 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1154 | "dev": true 1155 | }, 1156 | "internal-slot": { 1157 | "version": "1.0.2", 1158 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", 1159 | "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", 1160 | "dev": true, 1161 | "requires": { 1162 | "es-abstract": "^1.17.0-next.1", 1163 | "has": "^1.0.3", 1164 | "side-channel": "^1.0.2" 1165 | } 1166 | }, 1167 | "invariant": { 1168 | "version": "2.2.4", 1169 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1170 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1171 | "dev": true, 1172 | "requires": { 1173 | "loose-envify": "^1.0.0" 1174 | } 1175 | }, 1176 | "is-arrayish": { 1177 | "version": "0.2.1", 1178 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1179 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1180 | "dev": true 1181 | }, 1182 | "is-callable": { 1183 | "version": "1.2.2", 1184 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", 1185 | "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", 1186 | "dev": true 1187 | }, 1188 | "is-date-object": { 1189 | "version": "1.0.2", 1190 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1191 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1192 | "dev": true 1193 | }, 1194 | "is-extglob": { 1195 | "version": "2.1.1", 1196 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1197 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1198 | "dev": true 1199 | }, 1200 | "is-fullwidth-code-point": { 1201 | "version": "2.0.0", 1202 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1203 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1204 | "dev": true 1205 | }, 1206 | "is-glob": { 1207 | "version": "4.0.1", 1208 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1209 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1210 | "dev": true, 1211 | "requires": { 1212 | "is-extglob": "^2.1.1" 1213 | } 1214 | }, 1215 | "is-negative-zero": { 1216 | "version": "2.0.0", 1217 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", 1218 | "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", 1219 | "dev": true 1220 | }, 1221 | "is-regex": { 1222 | "version": "1.1.1", 1223 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 1224 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 1225 | "dev": true, 1226 | "requires": { 1227 | "has-symbols": "^1.0.1" 1228 | } 1229 | }, 1230 | "is-string": { 1231 | "version": "1.0.5", 1232 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1233 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1234 | "dev": true 1235 | }, 1236 | "is-symbol": { 1237 | "version": "1.0.3", 1238 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1239 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1240 | "dev": true, 1241 | "requires": { 1242 | "has-symbols": "^1.0.1" 1243 | } 1244 | }, 1245 | "isarray": { 1246 | "version": "1.0.0", 1247 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1248 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1249 | "dev": true 1250 | }, 1251 | "isexe": { 1252 | "version": "2.0.0", 1253 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1254 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1255 | "dev": true 1256 | }, 1257 | "js-tokens": { 1258 | "version": "4.0.0", 1259 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1260 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1261 | "dev": true 1262 | }, 1263 | "js-yaml": { 1264 | "version": "3.14.0", 1265 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 1266 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 1267 | "dev": true, 1268 | "requires": { 1269 | "argparse": "^1.0.7", 1270 | "esprima": "^4.0.0" 1271 | } 1272 | }, 1273 | "jsesc": { 1274 | "version": "2.5.2", 1275 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1276 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1277 | "dev": true 1278 | }, 1279 | "json-schema-traverse": { 1280 | "version": "0.4.1", 1281 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1282 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1283 | "dev": true 1284 | }, 1285 | "json-stable-stringify-without-jsonify": { 1286 | "version": "1.0.1", 1287 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1288 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1289 | "dev": true 1290 | }, 1291 | "json5": { 1292 | "version": "1.0.1", 1293 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 1294 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 1295 | "dev": true, 1296 | "requires": { 1297 | "minimist": "^1.2.0" 1298 | } 1299 | }, 1300 | "jsx-ast-utils": { 1301 | "version": "3.1.0", 1302 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.1.0.tgz", 1303 | "integrity": "sha512-d4/UOjg+mxAWxCiF0c5UTSwyqbchkbqCvK87aBovhnh8GtysTjWmgC63tY0cJx/HzGgm9qnA147jVBdpOiQ2RA==", 1304 | "dev": true, 1305 | "requires": { 1306 | "array-includes": "^3.1.1", 1307 | "object.assign": "^4.1.1" 1308 | } 1309 | }, 1310 | "levn": { 1311 | "version": "0.4.1", 1312 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1313 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1314 | "dev": true, 1315 | "requires": { 1316 | "prelude-ls": "^1.2.1", 1317 | "type-check": "~0.4.0" 1318 | } 1319 | }, 1320 | "load-json-file": { 1321 | "version": "2.0.0", 1322 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1323 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1324 | "dev": true, 1325 | "requires": { 1326 | "graceful-fs": "^4.1.2", 1327 | "parse-json": "^2.2.0", 1328 | "pify": "^2.0.0", 1329 | "strip-bom": "^3.0.0" 1330 | } 1331 | }, 1332 | "locate-path": { 1333 | "version": "2.0.0", 1334 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1335 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1336 | "dev": true, 1337 | "requires": { 1338 | "p-locate": "^2.0.0", 1339 | "path-exists": "^3.0.0" 1340 | } 1341 | }, 1342 | "lodash": { 1343 | "version": "4.17.20", 1344 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 1345 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", 1346 | "dev": true 1347 | }, 1348 | "loose-envify": { 1349 | "version": "1.4.0", 1350 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1351 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1352 | "dev": true, 1353 | "requires": { 1354 | "js-tokens": "^3.0.0 || ^4.0.0" 1355 | } 1356 | }, 1357 | "minimatch": { 1358 | "version": "3.0.4", 1359 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1360 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1361 | "dev": true, 1362 | "requires": { 1363 | "brace-expansion": "^1.1.7" 1364 | } 1365 | }, 1366 | "minimist": { 1367 | "version": "1.2.5", 1368 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1369 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1370 | "dev": true 1371 | }, 1372 | "mkdirp": { 1373 | "version": "0.5.5", 1374 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1375 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1376 | "dev": true, 1377 | "requires": { 1378 | "minimist": "^1.2.5" 1379 | } 1380 | }, 1381 | "ms": { 1382 | "version": "2.1.2", 1383 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1384 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1385 | "dev": true 1386 | }, 1387 | "natural-compare": { 1388 | "version": "1.4.0", 1389 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1390 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1391 | "dev": true 1392 | }, 1393 | "normalize-package-data": { 1394 | "version": "2.5.0", 1395 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1396 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1397 | "dev": true, 1398 | "requires": { 1399 | "hosted-git-info": "^2.1.4", 1400 | "resolve": "^1.10.0", 1401 | "semver": "2 || 3 || 4 || 5", 1402 | "validate-npm-package-license": "^3.0.1" 1403 | }, 1404 | "dependencies": { 1405 | "semver": { 1406 | "version": "5.7.1", 1407 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1408 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1409 | "dev": true 1410 | } 1411 | } 1412 | }, 1413 | "npdev-react-loadable-babel": { 1414 | "version": "file:babel", 1415 | "dev": true 1416 | }, 1417 | "object-assign": { 1418 | "version": "4.1.1", 1419 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1420 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1421 | "dev": true 1422 | }, 1423 | "object-inspect": { 1424 | "version": "1.8.0", 1425 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 1426 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 1427 | "dev": true 1428 | }, 1429 | "object-keys": { 1430 | "version": "1.1.1", 1431 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1432 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1433 | "dev": true 1434 | }, 1435 | "object.assign": { 1436 | "version": "4.1.1", 1437 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", 1438 | "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", 1439 | "dev": true, 1440 | "requires": { 1441 | "define-properties": "^1.1.3", 1442 | "es-abstract": "^1.18.0-next.0", 1443 | "has-symbols": "^1.0.1", 1444 | "object-keys": "^1.1.1" 1445 | }, 1446 | "dependencies": { 1447 | "es-abstract": { 1448 | "version": "1.18.0-next.1", 1449 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 1450 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 1451 | "dev": true, 1452 | "requires": { 1453 | "es-to-primitive": "^1.2.1", 1454 | "function-bind": "^1.1.1", 1455 | "has": "^1.0.3", 1456 | "has-symbols": "^1.0.1", 1457 | "is-callable": "^1.2.2", 1458 | "is-negative-zero": "^2.0.0", 1459 | "is-regex": "^1.1.1", 1460 | "object-inspect": "^1.8.0", 1461 | "object-keys": "^1.1.1", 1462 | "object.assign": "^4.1.1", 1463 | "string.prototype.trimend": "^1.0.1", 1464 | "string.prototype.trimstart": "^1.0.1" 1465 | } 1466 | } 1467 | } 1468 | }, 1469 | "object.entries": { 1470 | "version": "1.1.2", 1471 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", 1472 | "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", 1473 | "dev": true, 1474 | "requires": { 1475 | "define-properties": "^1.1.3", 1476 | "es-abstract": "^1.17.5", 1477 | "has": "^1.0.3" 1478 | } 1479 | }, 1480 | "object.fromentries": { 1481 | "version": "2.0.2", 1482 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", 1483 | "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", 1484 | "dev": true, 1485 | "requires": { 1486 | "define-properties": "^1.1.3", 1487 | "es-abstract": "^1.17.0-next.1", 1488 | "function-bind": "^1.1.1", 1489 | "has": "^1.0.3" 1490 | } 1491 | }, 1492 | "object.values": { 1493 | "version": "1.1.1", 1494 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 1495 | "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 1496 | "dev": true, 1497 | "requires": { 1498 | "define-properties": "^1.1.3", 1499 | "es-abstract": "^1.17.0-next.1", 1500 | "function-bind": "^1.1.1", 1501 | "has": "^1.0.3" 1502 | } 1503 | }, 1504 | "once": { 1505 | "version": "1.4.0", 1506 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1507 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1508 | "dev": true, 1509 | "requires": { 1510 | "wrappy": "1" 1511 | } 1512 | }, 1513 | "optionator": { 1514 | "version": "0.9.1", 1515 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1516 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1517 | "dev": true, 1518 | "requires": { 1519 | "deep-is": "^0.1.3", 1520 | "fast-levenshtein": "^2.0.6", 1521 | "levn": "^0.4.1", 1522 | "prelude-ls": "^1.2.1", 1523 | "type-check": "^0.4.0", 1524 | "word-wrap": "^1.2.3" 1525 | } 1526 | }, 1527 | "p-limit": { 1528 | "version": "1.3.0", 1529 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1530 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1531 | "dev": true, 1532 | "requires": { 1533 | "p-try": "^1.0.0" 1534 | } 1535 | }, 1536 | "p-locate": { 1537 | "version": "2.0.0", 1538 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1539 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1540 | "dev": true, 1541 | "requires": { 1542 | "p-limit": "^1.1.0" 1543 | } 1544 | }, 1545 | "p-try": { 1546 | "version": "1.0.0", 1547 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1548 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1549 | "dev": true 1550 | }, 1551 | "parent-module": { 1552 | "version": "1.0.1", 1553 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1554 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1555 | "dev": true, 1556 | "requires": { 1557 | "callsites": "^3.0.0" 1558 | } 1559 | }, 1560 | "parse-json": { 1561 | "version": "2.2.0", 1562 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1563 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1564 | "dev": true, 1565 | "requires": { 1566 | "error-ex": "^1.2.0" 1567 | } 1568 | }, 1569 | "path-exists": { 1570 | "version": "3.0.0", 1571 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1572 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1573 | "dev": true 1574 | }, 1575 | "path-is-absolute": { 1576 | "version": "1.0.1", 1577 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1578 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1579 | "dev": true 1580 | }, 1581 | "path-key": { 1582 | "version": "3.1.1", 1583 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1584 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1585 | "dev": true 1586 | }, 1587 | "path-parse": { 1588 | "version": "1.0.6", 1589 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1590 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1591 | "dev": true 1592 | }, 1593 | "path-type": { 1594 | "version": "2.0.0", 1595 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1596 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1597 | "dev": true, 1598 | "requires": { 1599 | "pify": "^2.0.0" 1600 | } 1601 | }, 1602 | "pify": { 1603 | "version": "2.3.0", 1604 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1605 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1606 | "dev": true 1607 | }, 1608 | "pkg-dir": { 1609 | "version": "2.0.0", 1610 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1611 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1612 | "dev": true, 1613 | "requires": { 1614 | "find-up": "^2.1.0" 1615 | } 1616 | }, 1617 | "prelude-ls": { 1618 | "version": "1.2.1", 1619 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1620 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1621 | "dev": true 1622 | }, 1623 | "pretty-format": { 1624 | "version": "26.5.2", 1625 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.5.2.tgz", 1626 | "integrity": "sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og==", 1627 | "dev": true, 1628 | "requires": { 1629 | "@jest/types": "^26.5.2", 1630 | "ansi-regex": "^5.0.0", 1631 | "ansi-styles": "^4.0.0", 1632 | "react-is": "^16.12.0" 1633 | }, 1634 | "dependencies": { 1635 | "ansi-styles": { 1636 | "version": "4.3.0", 1637 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1638 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1639 | "dev": true, 1640 | "requires": { 1641 | "color-convert": "^2.0.1" 1642 | } 1643 | }, 1644 | "color-convert": { 1645 | "version": "2.0.1", 1646 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1647 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1648 | "dev": true, 1649 | "requires": { 1650 | "color-name": "~1.1.4" 1651 | } 1652 | }, 1653 | "color-name": { 1654 | "version": "1.1.4", 1655 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1656 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1657 | "dev": true 1658 | } 1659 | } 1660 | }, 1661 | "progress": { 1662 | "version": "2.0.3", 1663 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1664 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1665 | "dev": true 1666 | }, 1667 | "prop-types": { 1668 | "version": "15.7.2", 1669 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1670 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1671 | "dev": true, 1672 | "requires": { 1673 | "loose-envify": "^1.4.0", 1674 | "object-assign": "^4.1.1", 1675 | "react-is": "^16.8.1" 1676 | } 1677 | }, 1678 | "punycode": { 1679 | "version": "2.1.1", 1680 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1681 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1682 | "dev": true 1683 | }, 1684 | "react": { 1685 | "version": "16.14.0", 1686 | "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", 1687 | "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", 1688 | "dev": true, 1689 | "requires": { 1690 | "loose-envify": "^1.1.0", 1691 | "object-assign": "^4.1.1", 1692 | "prop-types": "^15.6.2" 1693 | } 1694 | }, 1695 | "react-dom": { 1696 | "version": "16.14.0", 1697 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", 1698 | "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", 1699 | "dev": true, 1700 | "requires": { 1701 | "loose-envify": "^1.1.0", 1702 | "object-assign": "^4.1.1", 1703 | "prop-types": "^15.6.2", 1704 | "scheduler": "^0.19.1" 1705 | } 1706 | }, 1707 | "react-is": { 1708 | "version": "16.13.1", 1709 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 1710 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 1711 | "dev": true 1712 | }, 1713 | "react-test-renderer": { 1714 | "version": "16.14.0", 1715 | "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", 1716 | "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", 1717 | "dev": true, 1718 | "requires": { 1719 | "object-assign": "^4.1.1", 1720 | "prop-types": "^15.6.2", 1721 | "react-is": "^16.8.6", 1722 | "scheduler": "^0.19.1" 1723 | } 1724 | }, 1725 | "read-pkg": { 1726 | "version": "2.0.0", 1727 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1728 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1729 | "dev": true, 1730 | "requires": { 1731 | "load-json-file": "^2.0.0", 1732 | "normalize-package-data": "^2.3.2", 1733 | "path-type": "^2.0.0" 1734 | } 1735 | }, 1736 | "read-pkg-up": { 1737 | "version": "2.0.0", 1738 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1739 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1740 | "dev": true, 1741 | "requires": { 1742 | "find-up": "^2.0.0", 1743 | "read-pkg": "^2.0.0" 1744 | } 1745 | }, 1746 | "regexp.prototype.flags": { 1747 | "version": "1.3.0", 1748 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 1749 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 1750 | "dev": true, 1751 | "requires": { 1752 | "define-properties": "^1.1.3", 1753 | "es-abstract": "^1.17.0-next.1" 1754 | } 1755 | }, 1756 | "regexpp": { 1757 | "version": "3.1.0", 1758 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 1759 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 1760 | "dev": true 1761 | }, 1762 | "resolve": { 1763 | "version": "1.12.0", 1764 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 1765 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 1766 | "dev": true, 1767 | "requires": { 1768 | "path-parse": "^1.0.6" 1769 | } 1770 | }, 1771 | "resolve-from": { 1772 | "version": "4.0.0", 1773 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1774 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1775 | "dev": true 1776 | }, 1777 | "rimraf": { 1778 | "version": "2.6.3", 1779 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1780 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1781 | "dev": true, 1782 | "requires": { 1783 | "glob": "^7.1.3" 1784 | } 1785 | }, 1786 | "scheduler": { 1787 | "version": "0.19.1", 1788 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", 1789 | "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", 1790 | "dev": true, 1791 | "requires": { 1792 | "loose-envify": "^1.1.0", 1793 | "object-assign": "^4.1.1" 1794 | } 1795 | }, 1796 | "semver": { 1797 | "version": "6.3.0", 1798 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1799 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1800 | "dev": true 1801 | }, 1802 | "shebang-command": { 1803 | "version": "2.0.0", 1804 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1805 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1806 | "dev": true, 1807 | "requires": { 1808 | "shebang-regex": "^3.0.0" 1809 | } 1810 | }, 1811 | "shebang-regex": { 1812 | "version": "3.0.0", 1813 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1814 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1815 | "dev": true 1816 | }, 1817 | "side-channel": { 1818 | "version": "1.0.3", 1819 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", 1820 | "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", 1821 | "dev": true, 1822 | "requires": { 1823 | "es-abstract": "^1.18.0-next.0", 1824 | "object-inspect": "^1.8.0" 1825 | }, 1826 | "dependencies": { 1827 | "es-abstract": { 1828 | "version": "1.18.0-next.1", 1829 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", 1830 | "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", 1831 | "dev": true, 1832 | "requires": { 1833 | "es-to-primitive": "^1.2.1", 1834 | "function-bind": "^1.1.1", 1835 | "has": "^1.0.3", 1836 | "has-symbols": "^1.0.1", 1837 | "is-callable": "^1.2.2", 1838 | "is-negative-zero": "^2.0.0", 1839 | "is-regex": "^1.1.1", 1840 | "object-inspect": "^1.8.0", 1841 | "object-keys": "^1.1.1", 1842 | "object.assign": "^4.1.1", 1843 | "string.prototype.trimend": "^1.0.1", 1844 | "string.prototype.trimstart": "^1.0.1" 1845 | } 1846 | } 1847 | } 1848 | }, 1849 | "slice-ansi": { 1850 | "version": "2.1.0", 1851 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1852 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1853 | "dev": true, 1854 | "requires": { 1855 | "ansi-styles": "^3.2.0", 1856 | "astral-regex": "^1.0.0", 1857 | "is-fullwidth-code-point": "^2.0.0" 1858 | } 1859 | }, 1860 | "source-map": { 1861 | "version": "0.5.7", 1862 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1863 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1864 | "dev": true 1865 | }, 1866 | "spdx-correct": { 1867 | "version": "3.1.1", 1868 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 1869 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 1870 | "dev": true, 1871 | "requires": { 1872 | "spdx-expression-parse": "^3.0.0", 1873 | "spdx-license-ids": "^3.0.0" 1874 | } 1875 | }, 1876 | "spdx-exceptions": { 1877 | "version": "2.3.0", 1878 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 1879 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 1880 | "dev": true 1881 | }, 1882 | "spdx-expression-parse": { 1883 | "version": "3.0.1", 1884 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 1885 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 1886 | "dev": true, 1887 | "requires": { 1888 | "spdx-exceptions": "^2.1.0", 1889 | "spdx-license-ids": "^3.0.0" 1890 | } 1891 | }, 1892 | "spdx-license-ids": { 1893 | "version": "3.0.6", 1894 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", 1895 | "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", 1896 | "dev": true 1897 | }, 1898 | "sprintf-js": { 1899 | "version": "1.0.3", 1900 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1901 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1902 | "dev": true 1903 | }, 1904 | "string-width": { 1905 | "version": "3.1.0", 1906 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1907 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1908 | "dev": true, 1909 | "requires": { 1910 | "emoji-regex": "^7.0.1", 1911 | "is-fullwidth-code-point": "^2.0.0", 1912 | "strip-ansi": "^5.1.0" 1913 | }, 1914 | "dependencies": { 1915 | "ansi-regex": { 1916 | "version": "4.1.0", 1917 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1918 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1919 | "dev": true 1920 | }, 1921 | "strip-ansi": { 1922 | "version": "5.2.0", 1923 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1924 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1925 | "dev": true, 1926 | "requires": { 1927 | "ansi-regex": "^4.1.0" 1928 | } 1929 | } 1930 | } 1931 | }, 1932 | "string.prototype.matchall": { 1933 | "version": "4.0.2", 1934 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", 1935 | "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", 1936 | "dev": true, 1937 | "requires": { 1938 | "define-properties": "^1.1.3", 1939 | "es-abstract": "^1.17.0", 1940 | "has-symbols": "^1.0.1", 1941 | "internal-slot": "^1.0.2", 1942 | "regexp.prototype.flags": "^1.3.0", 1943 | "side-channel": "^1.0.2" 1944 | } 1945 | }, 1946 | "string.prototype.trimend": { 1947 | "version": "1.0.1", 1948 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1949 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1950 | "dev": true, 1951 | "requires": { 1952 | "define-properties": "^1.1.3", 1953 | "es-abstract": "^1.17.5" 1954 | } 1955 | }, 1956 | "string.prototype.trimstart": { 1957 | "version": "1.0.1", 1958 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1959 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1960 | "dev": true, 1961 | "requires": { 1962 | "define-properties": "^1.1.3", 1963 | "es-abstract": "^1.17.5" 1964 | } 1965 | }, 1966 | "strip-ansi": { 1967 | "version": "6.0.0", 1968 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1969 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1970 | "dev": true, 1971 | "requires": { 1972 | "ansi-regex": "^5.0.0" 1973 | } 1974 | }, 1975 | "strip-bom": { 1976 | "version": "3.0.0", 1977 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1978 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1979 | "dev": true 1980 | }, 1981 | "strip-json-comments": { 1982 | "version": "3.1.1", 1983 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1984 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1985 | "dev": true 1986 | }, 1987 | "supports-color": { 1988 | "version": "5.5.0", 1989 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1990 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1991 | "dev": true, 1992 | "requires": { 1993 | "has-flag": "^3.0.0" 1994 | } 1995 | }, 1996 | "table": { 1997 | "version": "5.4.6", 1998 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1999 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2000 | "dev": true, 2001 | "requires": { 2002 | "ajv": "^6.10.2", 2003 | "lodash": "^4.17.14", 2004 | "slice-ansi": "^2.1.0", 2005 | "string-width": "^3.0.0" 2006 | } 2007 | }, 2008 | "text-table": { 2009 | "version": "0.2.0", 2010 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2011 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2012 | "dev": true 2013 | }, 2014 | "to-fast-properties": { 2015 | "version": "2.0.0", 2016 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2017 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 2018 | "dev": true 2019 | }, 2020 | "tsconfig-paths": { 2021 | "version": "3.9.0", 2022 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 2023 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 2024 | "dev": true, 2025 | "requires": { 2026 | "@types/json5": "^0.0.29", 2027 | "json5": "^1.0.1", 2028 | "minimist": "^1.2.0", 2029 | "strip-bom": "^3.0.0" 2030 | } 2031 | }, 2032 | "type-check": { 2033 | "version": "0.4.0", 2034 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2035 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2036 | "dev": true, 2037 | "requires": { 2038 | "prelude-ls": "^1.2.1" 2039 | } 2040 | }, 2041 | "type-fest": { 2042 | "version": "0.8.1", 2043 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2044 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2045 | "dev": true 2046 | }, 2047 | "uri-js": { 2048 | "version": "4.4.0", 2049 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 2050 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 2051 | "dev": true, 2052 | "requires": { 2053 | "punycode": "^2.1.0" 2054 | } 2055 | }, 2056 | "v8-compile-cache": { 2057 | "version": "2.1.1", 2058 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", 2059 | "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", 2060 | "dev": true 2061 | }, 2062 | "validate-npm-package-license": { 2063 | "version": "3.0.4", 2064 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2065 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2066 | "dev": true, 2067 | "requires": { 2068 | "spdx-correct": "^3.0.0", 2069 | "spdx-expression-parse": "^3.0.0" 2070 | } 2071 | }, 2072 | "which": { 2073 | "version": "2.0.2", 2074 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2075 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2076 | "dev": true, 2077 | "requires": { 2078 | "isexe": "^2.0.0" 2079 | } 2080 | }, 2081 | "word-wrap": { 2082 | "version": "1.2.3", 2083 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2084 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2085 | "dev": true 2086 | }, 2087 | "wrappy": { 2088 | "version": "1.0.2", 2089 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2090 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2091 | "dev": true 2092 | }, 2093 | "write": { 2094 | "version": "1.0.3", 2095 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2096 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2097 | "dev": true, 2098 | "requires": { 2099 | "mkdirp": "^0.5.1" 2100 | } 2101 | } 2102 | } 2103 | } 2104 | -------------------------------------------------------------------------------- /package.js: -------------------------------------------------------------------------------- 1 | /* global Package */ 2 | Package.describe({ 3 | name: 'npdev:react-loadable', 4 | summary: 'A React component for easy code splitting with Meteor\'s dynamic-import', 5 | version: '1.0.0', 6 | documentation: 'README.md', 7 | git: 'https://github.com/CaptainN/npdev-react-loadable' 8 | }) 9 | 10 | Package.onUse(function (api) { 11 | api.versionsFrom(['1.5', '1.10']) 12 | api.use('ecmascript') 13 | api.mainModule('react-loadable-client.js', ['client'], { lazy: true }) 14 | api.mainModule('react-loadable-server.js', ['server'], { lazy: true }) 15 | }) 16 | 17 | Package.onTest(function (api) { 18 | api.use(['ecmascript', 'tinytest']) 19 | api.mainModule('tests.js') 20 | }) 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "npdev-react-loadable", 3 | "repository": { 4 | "type": "git", 5 | "url": "git+https://github.com/CaptainN/npdev-react-loadable.git" 6 | }, 7 | "author": "James Kyle & Kevin Newman", 8 | "license": "MIT", 9 | "scripts": { 10 | "test": "meteor test-packages ./", 11 | "publish": "rm -rf node_modules && meteor publish" 12 | }, 13 | "devDependencies": { 14 | "babel-eslint": "^10.1.0", 15 | "eslint": "^7.11.0", 16 | "eslint-config-standard": "^14.1.1", 17 | "eslint-config-standard-jsx": "^8.1.0", 18 | "eslint-import-resolver-meteor": "^0.4.0", 19 | "eslint-plugin-import": "^2.22.1", 20 | "eslint-plugin-meteor": "^7.2.1", 21 | "eslint-plugin-node": "^11.1.0", 22 | "eslint-plugin-promise": "^4.2.1", 23 | "eslint-plugin-react": "^7.21.4", 24 | "eslint-plugin-react-hooks": "^4.1.2", 25 | "eslint-plugin-standard": "^4.0.1", 26 | "npdev-react-loadable-babel": "file:babel", 27 | "pretty-format": "^26.5.2", 28 | "react": "^16.14.0", 29 | "react-dom": "^16.14.0", 30 | "react-test-renderer": "^16.14.0" 31 | }, 32 | "browserslist": [ 33 | "> 1%", 34 | "Android >= 4.4", 35 | "IE >= 10", 36 | "Firefox ESR" 37 | ], 38 | "eslintConfig": { 39 | "extends": [ 40 | "plugin:meteor/recommended", 41 | "standard", 42 | "standard-jsx" 43 | ], 44 | "parser": "babel-eslint", 45 | "parserOptions": { 46 | "sourceType": "module", 47 | "allowImportExportEverywhere": true 48 | }, 49 | "plugins": [ 50 | "react-hooks", 51 | "meteor" 52 | ], 53 | "rules": { 54 | "jsx-quotes": 0, 55 | "react-hooks/rules-of-hooks": "error", 56 | "react-hooks/exhaustive-deps": "warn" 57 | }, 58 | "settings": { 59 | "import/resolver": "meteor" 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /react-loadable-both.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export function load (loader) { 4 | const promise = loader() 5 | 6 | const state = { 7 | loading: true, 8 | loaded: null, 9 | error: null 10 | } 11 | 12 | state.promise = promise 13 | .then(loaded => { 14 | state.loading = false 15 | state.loaded = loaded 16 | return loaded 17 | }) 18 | .catch(err => { 19 | state.loading = false 20 | state.error = err 21 | throw err 22 | }) 23 | 24 | return state 25 | } 26 | 27 | export function loadMap (obj) { 28 | const state = { 29 | loading: false, 30 | loaded: {}, 31 | error: null 32 | } 33 | 34 | const promises = [] 35 | 36 | try { 37 | Object.keys(obj).forEach(key => { 38 | const result = load(obj[key]) 39 | 40 | if (!result.loading) { 41 | state.loaded[key] = result.loaded 42 | state.error = result.error 43 | } else { 44 | state.loading = true 45 | } 46 | 47 | promises.push(result.promise) 48 | 49 | result.promise 50 | .then(res => { 51 | state.loaded[key] = res 52 | }) 53 | .catch(err => { 54 | state.error = err 55 | }) 56 | }) 57 | } catch (err) { 58 | state.error = err 59 | } 60 | 61 | state.promise = Promise.all(promises) 62 | .then(res => { 63 | state.loading = false 64 | return res 65 | }) 66 | .catch(err => { 67 | state.loading = false 68 | throw err 69 | }) 70 | 71 | return state 72 | } 73 | 74 | function resolve (obj) { 75 | return obj && obj.__esModule ? obj.default : obj 76 | } 77 | 78 | export function resolveRender (loaded, props) { 79 | return React.createElement(resolve(loaded), props) 80 | } 81 | 82 | export function flushInitializers (initializers) { 83 | const promises = [] 84 | 85 | while (initializers.length) { 86 | const init = initializers.pop() 87 | promises.push(init()) 88 | } 89 | 90 | return Promise.all(promises).then(() => { 91 | if (initializers.length) { 92 | return flushInitializers(initializers) 93 | } 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /react-loadable-client.js: -------------------------------------------------------------------------------- 1 | /* global Meteor */ 2 | import { EJSON } from 'meteor/ejson' 3 | import { useState, useEffect, useReducer, createElement } from 'react' 4 | import { load, loadMap, resolveRender, flushInitializers } from './react-loadable-both' 5 | 6 | const INITIALIZERS = [] 7 | const INITIALIZERS_BY_MODULE = {} 8 | 9 | // Used to create a forceUpdate from useReducer. Forces update by 10 | // incrementing a number whenever the dispatch method is invoked. 11 | const fur = x => x + 1 12 | 13 | /** 14 | * Creates a "Loadable" component at startup, which will persist for the length of the program. 15 | */ 16 | const createLoadable = (load) => ({ render = resolveRender, meteor, loader, loading, delay = 200, timeout = null }) => { 17 | if (!loading) { 18 | throw new Error('react-loadable requires a `loading` component') 19 | } 20 | 21 | // Gets ready to load the module, and maintain status 22 | let status = null 23 | function init () { 24 | if (!status) { 25 | status = load(loader) 26 | } 27 | return status.promise 28 | } 29 | 30 | // Store all the INITIALIZERS for later use 31 | INITIALIZERS.push(init) 32 | if (typeof meteor === 'function') { 33 | INITIALIZERS_BY_MODULE[meteor().sort().join(',')] = () => { 34 | return init() 35 | } 36 | } 37 | 38 | function Loadable (props) { 39 | // We are starting load as early as possible. We are counting 40 | // on Meteor to avoid problems if this happens to get fired 41 | // off more than once in concurrent mode. 42 | if (!status) { 43 | init() 44 | } 45 | 46 | const [pastDelay, setPastDelay] = useState(delay === 0) 47 | const [timedOut, setTimedOut] = useState(false) 48 | const [, forceUpdate] = useReducer(fur, 0) 49 | 50 | const wasLoading = status.loading 51 | useEffect(() => { 52 | // If status.loading is false, then we either have an error 53 | // state, or have loaded successfully. In either case, we 54 | // don't need to set up any timeouts, or watch for updates. 55 | if (!status.loading) { 56 | // It's possible loading completed between render and commit. 57 | if (wasLoading) { 58 | forceUpdate() 59 | } 60 | return 61 | } 62 | 63 | // If we got this far, we need to set up the two timeouts 64 | let tidDelay 65 | let tidTimeout 66 | const _clearTimeouts = () => { 67 | if (tidDelay) clearTimeout(tidDelay) 68 | if (tidTimeout) clearTimeout(tidTimeout) 69 | } 70 | 71 | if (typeof delay === 'number' && delay > 0) { 72 | tidDelay = setTimeout(() => { 73 | setPastDelay(true) 74 | }, delay) 75 | } 76 | 77 | if (typeof timeout === 'number') { 78 | tidTimeout = setTimeout(() => { 79 | setTimedOut(true) 80 | }, timeout) 81 | } 82 | 83 | // Use to avoid updating state after unmount. 84 | let mounted = true 85 | 86 | const update = () => { 87 | _clearTimeouts() 88 | if (mounted) { 89 | forceUpdate() 90 | } 91 | } 92 | 93 | status.promise 94 | .then(() => { 95 | update() 96 | }) 97 | .catch(err => { 98 | console.error(err) 99 | update() 100 | }) 101 | 102 | return () => { 103 | mounted = false 104 | _clearTimeouts() 105 | } 106 | }, []) 107 | 108 | // render 109 | if (status.loading || status.error) { 110 | return createElement(loading, { 111 | isLoading: status.loading, 112 | pastDelay: pastDelay, 113 | timedOut: timedOut, 114 | error: status.error 115 | }) 116 | } else if (status.loaded) { 117 | return render(status.loaded, props) 118 | } else { 119 | return null 120 | } 121 | } 122 | 123 | Loadable.preload = () => { 124 | return init() 125 | } 126 | 127 | return Loadable 128 | } 129 | 130 | export const Loadable = createLoadable(load) 131 | export const LoadableMap = Meteor.isDevelopment 132 | ? (((LoadableMap) => (opts) => { 133 | if (typeof opts.render !== 'function') { 134 | throw new Error('LoadableMap requires a `render(loaded, props)` function') 135 | } 136 | return LoadableMap(opts) 137 | })(createLoadable(loadMap))) 138 | : createLoadable(loadMap) 139 | 140 | // For backward compat and easy porting 141 | Loadable.Map = LoadableMap 142 | 143 | const preload = (preloadables) => { 144 | const initializers = preloadables.map(preloadable => { 145 | return INITIALIZERS_BY_MODULE[preloadable] 146 | }) 147 | return flushInitializers(initializers) 148 | } 149 | 150 | export const preloadLoadables = (id = '__preloadables__') => { 151 | const preloadablesNode = document.getElementById(id) 152 | if (preloadablesNode) { 153 | const preloadables = EJSON.parse(preloadablesNode.innerText) 154 | preloadablesNode.parentNode.removeChild(preloadablesNode) 155 | return preload(preloadables) 156 | } else { 157 | return new Promise((resolve) => { resolve() }) 158 | } 159 | } 160 | 161 | export const preloadAllLoadables = () => flushInitializers(INITIALIZERS) 162 | -------------------------------------------------------------------------------- /react-loadable-server.js: -------------------------------------------------------------------------------- 1 | /* global Meteor */ 2 | import { EJSON } from 'meteor/ejson' 3 | import { useContext, createContext, createElement } from 'react' 4 | import { load, loadMap, resolveRender, flushInitializers } from './react-loadable-both' 5 | 6 | const INITIALIZERS = [] 7 | 8 | const LoadableContext = createContext(false) 9 | export const LoadableCaptureProvider = ({ handle, children }) => { 10 | if (!handle.loadables) { 11 | handle.loadables = [] 12 | handle.toEJSON = () => ( 13 | EJSON.stringify(handle.loadables) 14 | ) 15 | handle.toScriptTag = () => ( 16 | `` 17 | ) 18 | } 19 | return createElement(LoadableContext.Provider, { value: handle }, children) 20 | } 21 | 22 | /** 23 | * Creates a "Loadable" component at startup, which will persist for the length of the program. 24 | */ 25 | const createLoadable = (load) => (options) => { 26 | const { render = resolveRender, loader, meteor, loading } = options 27 | 28 | if (!loading) { 29 | throw new Error('react-loadable requires a `loading` component') 30 | } 31 | 32 | // Gets ready to load the module 33 | let res = null 34 | function init () { 35 | if (!res) { 36 | res = load(loader) 37 | } 38 | return res.promise 39 | } 40 | 41 | // Store all the INITIALIZERS for later use 42 | INITIALIZERS.push(init) 43 | 44 | const Loadable = (props) => { 45 | if (!res || !res.loaded) init() 46 | 47 | // record the path for use in client loading 48 | const capture = useContext(LoadableContext) 49 | if (capture && typeof meteor === 'function') { 50 | capture.loadables.push(meteor().sort().join(',')) 51 | } 52 | 53 | // render 54 | if (res.loading || res.error) { 55 | return createElement(loading, { 56 | isLoading: res.loading, 57 | pastDelay: false, 58 | timedOut: false, 59 | error: res.error 60 | }) 61 | } else if (res.loaded) { 62 | return render(res.loaded, props) 63 | } else { 64 | return null 65 | } 66 | } 67 | 68 | Loadable.preload = () => { 69 | return init() 70 | } 71 | 72 | return Loadable 73 | } 74 | 75 | export const Loadable = createLoadable(load) 76 | export const LoadableMap = Meteor.isDevelopment 77 | ? (((LoadableMap) => (opts) => { 78 | if (typeof opts.render !== 'function') { 79 | throw new Error('LoadableMap requires a `render(loaded, props)` function') 80 | } 81 | return LoadableMap(opts) 82 | })(createLoadable(loadMap))) 83 | : createLoadable(loadMap) 84 | 85 | // For backward compat and easy porting 86 | Loadable.Map = LoadableMap 87 | 88 | export const preloadAllLoadables = () => { 89 | return new Promise((resolve, reject) => { 90 | flushInitializers(INITIALIZERS).then(resolve, reject) 91 | }) 92 | } 93 | -------------------------------------------------------------------------------- /tests.js: -------------------------------------------------------------------------------- 1 | /* global Meteor Tinytest */ 2 | import React from 'react' 3 | import { create, act } from 'react-test-renderer' 4 | import snapshots from './tests.snap.js' 5 | import prettyFormat from 'pretty-format' 6 | 7 | class FixtureComponent extends React.Component { 8 | render () { 9 | return
fixture1
10 | } 11 | } 12 | const fixtureEs6 = { 13 | default: () =>
fixture2
, 14 | __esModule: true 15 | } 16 | 17 | const pretty = (component) => '\n' + prettyFormat(component.toJSON(), { 18 | plugins: [prettyFormat.plugins.ReactTestComponent], 19 | printFunctionName: false 20 | }) + '\n' 21 | 22 | function waitFor (delay) { 23 | return new Promise(resolve => { 24 | setTimeout(resolve, delay) 25 | }) 26 | } 27 | 28 | function createLoader (delay, loader, error) { 29 | return () => { 30 | return waitFor(delay).then(() => { 31 | if (loader) { 32 | return loader() 33 | } else { 34 | throw error 35 | } 36 | }) 37 | } 38 | } 39 | 40 | function MyLoadingComponent (props) { 41 | return
MyLoadingComponent {JSON.stringify(props)}
42 | } 43 | 44 | function MyComponent (props) { 45 | return
MyComponent {JSON.stringify(props)}
46 | } 47 | 48 | // afterEach(async () => { 49 | // try { 50 | // await Loadable.preloadAll() 51 | // } catch (err) {} 52 | // }) 53 | 54 | Tinytest.addAsync('loading success', async (test) => { 55 | import { Loadable } from './react-loadable-client' 56 | 57 | const LoadableMyComponent = Loadable({ 58 | loader: createLoader(400, () => MyComponent), 59 | loading: MyLoadingComponent 60 | }) 61 | 62 | let component1 63 | act(() => { 64 | component1 = create() 65 | }) 66 | 67 | test.equal(pretty(component1), snapshots['loading success 1']) // initial 68 | await waitFor(200) 69 | test.equal(pretty(component1), snapshots['loading success 2']) // loading 70 | await waitFor(200) 71 | test.equal(pretty(component1), snapshots['loading success 3']) // loaded 72 | 73 | let component2 74 | act(() => { 75 | component2 = create() 76 | }) 77 | 78 | test.equal(pretty(component2), snapshots['loading success 4']) // reload 79 | }) 80 | 81 | Tinytest.addAsync('delay and timeout', async (test) => { 82 | import { Loadable } from './react-loadable-client' 83 | 84 | const LoadableMyComponent = Loadable({ 85 | loader: createLoader(300, () => MyComponent), 86 | loading: MyLoadingComponent, 87 | delay: 100, 88 | timeout: 200 89 | }) 90 | 91 | let component1 92 | act(() => { 93 | component1 = create() 94 | }) 95 | 96 | test.equal(pretty(component1), snapshots['delay and timeout 1']) // initial 97 | await waitFor(100) 98 | test.equal(pretty(component1), snapshots['delay and timeout 2']) // loading 99 | await waitFor(100) 100 | test.equal(pretty(component1), snapshots['delay and timeout 3']) // timed out 101 | await waitFor(100) 102 | test.equal(pretty(component1), snapshots['delay and timeout 4']) // loaded 103 | }) 104 | 105 | if (Meteor.isServer) { 106 | Tinytest.addAsync('server side preload all', async (test) => { 107 | import { Loadable, preloadAllLoadables } from './react-loadable-server' 108 | 109 | const LoadableMyComponent = Loadable({ 110 | loader: createLoader(400, () => FixtureComponent), 111 | loading: MyLoadingComponent 112 | }) 113 | 114 | await preloadAllLoadables() 115 | 116 | let component 117 | act(() => { 118 | component = create() 119 | }) 120 | 121 | test.equal(pretty(component), snapshots['server side rendering 1']) 122 | }) 123 | 124 | Tinytest.addAsync('server side preload all es6', async (test) => { 125 | import { Loadable, preloadAllLoadables } from './react-loadable-server' 126 | 127 | const LoadableMyComponent = Loadable({ 128 | loader: createLoader(400, () => fixtureEs6), 129 | loading: MyLoadingComponent 130 | }) 131 | 132 | await preloadAllLoadables() 133 | 134 | let component 135 | act(() => { 136 | component = create() 137 | }) 138 | 139 | test.equal(pretty(component), snapshots['server side rendering es6 1']) 140 | }) 141 | } else if (Meteor.isClient) { 142 | Tinytest.addAsync('client side preload all', async (test) => { 143 | import { Loadable, preloadAllLoadables } from './react-loadable-client' 144 | 145 | const LoadableMyComponent = Loadable({ 146 | loader: createLoader(400, () => FixtureComponent), 147 | loading: MyLoadingComponent 148 | }) 149 | 150 | await preloadAllLoadables() 151 | 152 | let component 153 | act(() => { 154 | component = create() 155 | }) 156 | 157 | test.equal(pretty(component), snapshots['server side rendering 1']) 158 | }) 159 | 160 | Tinytest.addAsync('client side preload all es6', async (test) => { 161 | import { Loadable, preloadAllLoadables } from './react-loadable-client' 162 | 163 | const LoadableMyComponent = Loadable({ 164 | loader: createLoader(400, () => fixtureEs6), 165 | loading: MyLoadingComponent 166 | }) 167 | 168 | await preloadAllLoadables() 169 | 170 | let component 171 | act(() => { 172 | component = create() 173 | }) 174 | 175 | test.equal(pretty(component), snapshots['server side rendering es6 1']) 176 | }) 177 | } 178 | 179 | Tinytest.addAsync('loading error', async (test) => { 180 | import { Loadable } from './react-loadable-client' 181 | 182 | const LoadableMyComponent = Loadable({ 183 | loader: createLoader(400, null, new Error('test error')), 184 | loading: MyLoadingComponent 185 | }) 186 | 187 | let component 188 | act(() => { 189 | component = create() 190 | }) 191 | 192 | test.equal(pretty(component), snapshots['loading error 1']) // initial 193 | await waitFor(200) 194 | test.equal(pretty(component), snapshots['loading error 2']) // loading 195 | await waitFor(200) 196 | test.equal(pretty(component), snapshots['loading error 3']) // errored 197 | }) 198 | 199 | Tinytest.addAsync('preload', async (test) => { 200 | import { Loadable } from './react-loadable-client' 201 | 202 | const LoadableMyComponent = Loadable({ 203 | loader: createLoader(400, () => MyComponent), 204 | loading: MyLoadingComponent 205 | }) 206 | 207 | const promise = LoadableMyComponent.preload() 208 | await waitFor(200) 209 | 210 | let component1 211 | act(() => { 212 | component1 = create() 213 | }) 214 | 215 | test.equal(pretty(component1), snapshots['preload 1']) // still loading... 216 | await promise 217 | test.equal(pretty(component1), snapshots['preload 2']) // success 218 | 219 | let component2 220 | act(() => { 221 | component2 = create() 222 | }) 223 | test.equal(pretty(component2), snapshots['preload 3']) // success 224 | }) 225 | 226 | Tinytest.addAsync('render', async (test) => { 227 | import { Loadable } from './react-loadable-client' 228 | 229 | const LoadableMyComponent = Loadable({ 230 | loader: createLoader(400, () => ({ MyComponent })), 231 | loading: MyLoadingComponent, 232 | render (loaded, props) { 233 | return 234 | } 235 | }) 236 | let component 237 | act(() => { 238 | component = create() 239 | }) 240 | test.equal(pretty(component), snapshots['render 1']) // initial 241 | await waitFor(200) 242 | test.equal(pretty(component), snapshots['render 2']) // loading 243 | await waitFor(200) 244 | test.equal(pretty(component), snapshots['render 3']) // success 245 | }) 246 | 247 | Tinytest.addAsync('loadable map success', async (test) => { 248 | import { Loadable } from './react-loadable-client' 249 | 250 | const LoadableMyComponent = Loadable.Map({ 251 | loader: { 252 | a: createLoader(200, () => ({ MyComponent })), 253 | b: createLoader(400, () => ({ MyComponent })) 254 | }, 255 | loading: MyLoadingComponent, 256 | render (loaded, props) { 257 | return ( 258 |
259 | 260 | 261 |
262 | ) 263 | } 264 | }) 265 | 266 | let component 267 | act(() => { 268 | component = create() 269 | }) 270 | test.equal(pretty(component), snapshots['loadable map success 1']) // initial 271 | await waitFor(200) 272 | test.equal(pretty(component), snapshots['loadable map success 2']) // loading 273 | await waitFor(200) 274 | test.equal(pretty(component), snapshots['loadable map success 3']) // success 275 | }) 276 | 277 | Tinytest.addAsync('loadable map error', async (test) => { 278 | import { Loadable } from './react-loadable-client' 279 | 280 | const LoadableMyComponent = Loadable.Map({ 281 | loader: { 282 | a: createLoader(200, () => ({ MyComponent })), 283 | b: createLoader(400, null, new Error('test error')) 284 | }, 285 | loading: MyLoadingComponent, 286 | render (loaded, props) { 287 | return ( 288 |
289 | 290 | 291 |
292 | ) 293 | } 294 | }) 295 | 296 | let component 297 | act(() => { 298 | component = create() 299 | }) 300 | test.equal(pretty(component), snapshots['loadable map error 1']) // initial 301 | await waitFor(200) 302 | test.equal(pretty(component), snapshots['loadable map error 2']) // loading 303 | await waitFor(200) 304 | test.equal(pretty(component), snapshots['loadable map error 3']) // success 305 | }) 306 | -------------------------------------------------------------------------------- /tests.snap.js: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`delay and timeout 1`] = ` 4 |
5 | MyLoadingComponent 6 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 7 |
8 | `; 9 | 10 | exports[`delay and timeout 2`] = ` 11 |
12 | MyLoadingComponent 13 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 14 |
15 | `; 16 | 17 | exports[`delay and timeout 3`] = ` 18 |
19 | MyLoadingComponent 20 | {"isLoading":true,"pastDelay":true,"timedOut":true,"error":null} 21 |
22 | `; 23 | 24 | exports[`delay and timeout 4`] = ` 25 |
26 | MyComponent 27 | {"prop":"foo"} 28 |
29 | `; 30 | 31 | exports[`loadable map error 1`] = ` 32 |
33 | MyLoadingComponent 34 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 35 |
36 | `; 37 | 38 | exports[`loadable map error 2`] = ` 39 |
40 | MyLoadingComponent 41 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 42 |
43 | `; 44 | 45 | exports[`loadable map error 3`] = ` 46 |
47 | MyLoadingComponent 48 | {"isLoading":false,"pastDelay":true,"timedOut":false,"error":{}} 49 |
50 | `; 51 | 52 | exports[`loadable map success 1`] = ` 53 |
54 | MyLoadingComponent 55 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 56 |
57 | `; 58 | 59 | exports[`loadable map success 2`] = ` 60 |
61 | MyLoadingComponent 62 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 63 |
64 | `; 65 | 66 | exports[`loadable map success 3`] = ` 67 |
68 |
69 | MyComponent 70 | {"prop":"baz"} 71 |
72 |
73 | MyComponent 74 | {"prop":"baz"} 75 |
76 |
77 | `; 78 | 79 | exports[`loading error 1`] = ` 80 |
81 | MyLoadingComponent 82 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 83 |
84 | `; 85 | 86 | exports[`loading error 2`] = ` 87 |
88 | MyLoadingComponent 89 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 90 |
91 | `; 92 | 93 | exports[`loading error 3`] = ` 94 |
95 | MyLoadingComponent 96 | {"isLoading":false,"pastDelay":true,"timedOut":false,"error":{}} 97 |
98 | `; 99 | 100 | exports[`loading success 1`] = ` 101 |
102 | MyLoadingComponent 103 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 104 |
105 | `; 106 | 107 | exports[`loading success 2`] = ` 108 |
109 | MyLoadingComponent 110 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 111 |
112 | `; 113 | 114 | exports[`loading success 3`] = ` 115 |
116 | MyComponent 117 | {"prop":"foo"} 118 |
119 | `; 120 | 121 | exports[`loading success 4`] = ` 122 |
123 | MyComponent 124 | {"prop":"bar"} 125 |
126 | `; 127 | 128 | exports[`preload 1`] = ` 129 |
130 | MyLoadingComponent 131 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 132 |
133 | `; 134 | 135 | exports[`preload 2`] = ` 136 |
137 | MyComponent 138 | {"prop":"baz"} 139 |
140 | `; 141 | 142 | exports[`preload 3`] = ` 143 |
144 | MyComponent 145 | {"prop":"baz"} 146 |
147 | `; 148 | 149 | exports[`preloadReady delay with 0 1`] = ` 150 |
151 | MyLoadingComponent 152 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 153 |
154 | `; 155 | 156 | exports[`preloadReady many 1`] = ` 157 |
158 | MyComponent 159 | {"prop":"baz"} 160 |
161 | `; 162 | 163 | exports[`preloadReady missing 1`] = ` 164 |
165 | MyLoadingComponent 166 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 167 |
168 | `; 169 | 170 | exports[`preloadReady one 1`] = ` 171 |
172 | MyComponent 173 | {"prop":"baz"} 174 |
175 | `; 176 | 177 | exports[`preloadReady undefined 1`] = ` 178 |
179 | MyLoadingComponent 180 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 181 |
182 | `; 183 | 184 | exports[`render 1`] = ` 185 |
186 | MyLoadingComponent 187 | {"isLoading":true,"pastDelay":false,"timedOut":false,"error":null} 188 |
189 | `; 190 | 191 | exports[`render 2`] = ` 192 |
193 | MyLoadingComponent 194 | {"isLoading":true,"pastDelay":true,"timedOut":false,"error":null} 195 |
196 | `; 197 | 198 | exports[`render 3`] = ` 199 |
200 | MyComponent 201 | {"prop":"baz"} 202 |
203 | `; 204 | 205 | exports[`server side rendering 1`] = ` 206 |
207 | fixture1 208 |
209 | `; 210 | 211 | exports[`server side rendering es6 1`] = ` 212 |
213 | fixture2 214 |
215 | `; --------------------------------------------------------------------------------