From 2bb5641ee40ad8c86fdee53cd1dcfd99833a780b Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:06:53 +0000 Subject: [PATCH 1/7] thinking-in-react: references --- content/docs/design-principles.md | 2 +- content/docs/getting-started.md | 4 ++-- content/docs/nav.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/design-principles.md b/content/docs/design-principles.md index 9e10f39d5..936ed7548 100644 --- a/content/docs/design-principles.md +++ b/content/docs/design-principles.md @@ -14,7 +14,7 @@ We wrote this document so that you have a better idea of how we decide what Reac > >This document assumes a strong understanding of React. It describes the design principles of *React itself*, not React components or applications. > ->For an introduction to React, check out [Thinking in React](/docs/thinking-in-react.html) instead. +>For an introduction to React, check out [Pensare in React](/docs/thinking-in-react.html) instead. ### Composition {#composition} diff --git a/content/docs/getting-started.md b/content/docs/getting-started.md index 37972e83e..92993a8a0 100644 --- a/content/docs/getting-started.md +++ b/content/docs/getting-started.md @@ -89,9 +89,9 @@ If you prefer to **learn by doing,** check out our [practical tutorial](/tutoria If you prefer to **learn concepts step by step,** our [guide to main concepts](/docs/hello-world.html) is the best place to start. Every next chapter in it builds on the knowledge introduced in the previous chapters so you won't miss anything as you go along. -### Thinking in React {#thinking-in-react} +### Pensare in React {#thinking-in-react} -Many React users credit reading [Thinking in React](/docs/thinking-in-react.html) as the moment React finally "clicked" for them. It's probably the oldest React walkthrough but it's still just as relevant. +Many React users credit reading [Pensare in React](/docs/thinking-in-react.html) as the moment React finally "clicked" for them. It's probably the oldest React walkthrough but it's still just as relevant. ### Recommended Courses {#recommended-courses} diff --git a/content/docs/nav.yml b/content/docs/nav.yml index 6d5ad4d6d..e3be1cd58 100644 --- a/content/docs/nav.yml +++ b/content/docs/nav.yml @@ -34,7 +34,7 @@ - id: composition-vs-inheritance title: Composition vs Inheritance - id: thinking-in-react - title: Thinking In React + title: Pensare in React - title: Advanced Guides items: - id: accessibility From f0d4d74797e6f2f8d826a4091650466fc8b205f0 Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:07:52 +0000 Subject: [PATCH 2/7] thinking-in-react: page --- content/docs/thinking-in-react.md | 161 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 81 deletions(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 7b2e2e7e6..43c361ba8 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -1,6 +1,6 @@ --- id: thinking-in-react -title: Thinking in React +title: Pensare in React permalink: docs/thinking-in-react.html redirect_from: - 'blog/2013/11/05/thinking-in-react.html' @@ -8,141 +8,140 @@ redirect_from: prev: composition-vs-inheritance.html --- -React is, in our opinion, the premier way to build big, fast Web apps with JavaScript. It has scaled very well for us at Facebook and Instagram. +React è, secondo noi, il miglior modo per sviluppare applicazioni web complesse e performanti in JavaScript. Ha [scalato](https://it.wikipedia.org/wiki/Scalabilit%C3%A0) molto bene per noi in Facebook ed Instagram. -One of the many great parts of React is how it makes you think about apps as you build them. In this document, we'll walk you through the thought process of building a searchable product data table using React. +Una delle caratteristiche migliori di React è il modo in cui ti permette di pensare alle applicazioni mentre le sviluppi. In questo documento, ti guideremo nel processo di costruzione di una tabella di prodotti con funzionalità di ricerca usando React. -## Start With A Mock {#start-with-a-mock} +## Comincia Con Una Bozza {#start-with-a-mock} -Imagine that we already have a JSON API and a mock from our designer. The mock looks like this: +Immaginiamo di avere già a disposizione una API JSON e che il nostro designer ci abbia fornito una bozza come questa: - + -Our JSON API returns some data that looks like this: +La nostra API JSON ritorna dati in questa forma: ``` [ - {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"}, - {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"}, - {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"}, - {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"}, - {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"}, - {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"} + {categoria: "Attrezzatura Sportiva", prezzo: "$49.99", disponibile: true, nome: "Palla da calcio"}, + {categoria: "Attrezzatura Sportiva", prezzo: "$9.99", disponibile: true, nome: "Palla da tennis"}, + {categoria: "Attrezzatura Sportiva", prezzo: "$29.99", disponibile: false, nome: "Palla da canestro"}, + {categoria: "Elettronica", prezzo: "$99.99", disponibile: true, nome: "iPod Touch"}, + {categoria: "Elettronica", prezzo: "$399.99", disponibile: false, nome: "iPhone 5"}, + {categoria: "Elettronica", prezzo: "$199.99", disponibile: true, nome: "Nexus 7"} ]; ``` -## Step 1: Break The UI Into A Component Hierarchy {#step-1-break-the-ui-into-a-component-hierarchy} +## Passo 1: Scomponi La UI In Una Gerarchia Di Componenti {#step-1-break-the-ui-into-a-component-hierarchy} -The first thing you'll want to do is to draw boxes around every component (and subcomponent) in the mock and give them all names. If you're working with a designer, they may have already done this, so go talk to them! Their Photoshop layer names may end up being the names of your React components! +La prima cosa da fare è disegnare rettangoli attorno ad ogni componente (e sotto-componente) presente nella bozza e di dare un nome ad ognuno di essi. Se stai lavorando con un designer, probabilmente qualche passo in questa direzione è stato già fatto, consultatevi! I nomi dei livelli in Photoshop usati dai designers potrebbero dare nome anche ai tuoi componenti React! -But how do you know what should be its own component? Just use the same techniques for deciding if you should create a new function or object. One such technique is the [single responsibility principle](https://en.wikipedia.org/wiki/Single_responsibility_principle), that is, a component should ideally only do one thing. If it ends up growing, it should be decomposed into smaller subcomponents. +Ma come fare a sapere cosa deve essere un componente a se stante? Usa le stesse tecniche che usi per decidere se devi creare una nuova funzione od un oggetto. Una di queste tecniche è il [principio di singola responsabilità](https://it.wikipedia.org/wiki/Principio_di_singola_responsabilit%C3%A0), che dice che un componente dovrebbe idealmente occuparsi di una cosa soltanto. Nel caso in cui un componente diventi troppo grande e complesso, dovrebbe essere decomposto in sotto-componenti più piccoli e semplici. -Since you're often displaying a JSON data model to a user, you'll find that if your model was built correctly, your UI (and therefore your component structure) will map nicely. That's because UI and data models tend to adhere to the same *information architecture*, which means the work of separating your UI into components is often trivial. Just break it up into components that represent exactly one piece of your data model. +Dato che ti ritroverai spesso a dover presentare all'utente dei modelli dati JSON, noterai che se tali modelli sono stati definiti correttamente, la tua UI (e di conseguenza la struttura della gerarchia dei tuoi componenti) corrisponderanno. Ciò avviene perché entrambe tendono ad aderire alla stessa *architettura dell'informazione*, il che rende la separazione della tua UI in componenti talvolta estremamente semplice. Basta solo rappresentare ogni parte del tuo modello dati con esattamente un componente. - + -You'll see here that we have five components in our simple app. We've italicized the data each component represents. +Abbiamo identificato cinque componenti nella nostra semplice applicazione. In corsivo, la parte del modello dati rappresentata da ogni componente. - 1. **`FilterableProductTable` (orange):** contains the entirety of the example - 2. **`SearchBar` (blue):** receives all *user input* - 3. **`ProductTable` (green):** displays and filters the *data collection* based on *user input* - 4. **`ProductCategoryRow` (turquoise):** displays a heading for each *category* - 5. **`ProductRow` (red):** displays a row for each *product* + 1. **`TabellaProdottiRicercabile` (arancione):** contiene l'intero esempio + 2. **`BarraRicerca` (blu):** riceve tutti gli *input dell'utente* + 3. **`TabellaProdotti` (verde):** visualizza e filtra la *lista dei prodotti* a seconda dell'*input dell'utente* + 4. **`RigaCategoriaProdotti` (turchese):** visualizza una testata per ogni *categoria* + 5. **`RigaProdotto` (rosso):** visualizza una riga per ogni *prodotto* -If you look at `ProductTable`, you'll see that the table header (containing the "Name" and "Price" labels) isn't its own component. This is a matter of preference, and there's an argument to be made either way. For this example, we left it as part of `ProductTable` because it is part of rendering the *data collection* which is `ProductTable`'s responsibility. However, if this header grows to be complex (i.e. if we were to add affordances for sorting), it would certainly make sense to make this its own `ProductTableHeader` component. +Se dai un'occhiata a `TabellaProdotti`, noterai che la testata della tabella (contenente le etichette "Nome" e "Prezzo") non rappresenta un componente a se stante. Si tratta di una questione soggettiva, e ci sono argomenti validi in entrambi i sensi. In questo esempio, l'abbiamo lasciata come parte di `TabellaProdotti` perché fa parte della renderizzazione della *lista dei prodotti* che è una responsabilità di `TabellaProdotti`. Comunque, qualora questa testata dovesse diventare complessa (per esempio se volessimo aggiungere la gestione dell'ordinamento per colonna), avrebbe sicuramente senso creare un suo proprio componente `TestataTabellaProdotti`. -Now that we've identified the components in our mock, let's arrange them into a hierarchy. This is easy. Components that appear within another component in the mock should appear as a child in the hierarchy: +Adesso che abbiamo identificato i componenti nella nostra bozza, ordiniamoli gerarchicamente. È facile. I componenti che appaiono all'interno di un altro componente nella bozza, devono essere loro figli nella gerarchia: - * `FilterableProductTable` - * `SearchBar` - * `ProductTable` - * `ProductCategoryRow` - * `ProductRow` + * `TabellaProdottiRicercabile` + * `BarraRicerca` + * `TabellaProdotti` + * `RigaCategoriaProdotti` + * `RigaProdotto` -## Step 2: Build A Static Version in React {#step-2-build-a-static-version-in-react} +## Passo 2: Sviluppa Una Versione Statica in React {#step-2-build-a-static-version-in-react} -<p data-height="600" data-theme-id="0" data-slug-hash="BwWzwm" data-default-tab="js" data-user="lacker" data-embed-version="2" class="codepen">See the Pen <a href="https://codepen.io/gaearon/pen/BwWzwm">Thinking In React: Step 2</a> on <a href="https://codepen.io">CodePen</a>.</p> -<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script> +[Prova su CodeSandbox](embedded-codesandbox://thinking-in-react/1?view=split&editorsize=70) -Now that you have your component hierarchy, it's time to implement your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's best to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why. +Adesso che hai la gerarchia dei componenti, è ora di implementare la tua applicazione. Il modo più facile è quello di sviluppare una versione che riceve dati dal modello e renderizza la UI senza alcuna interattività. È bene mantenere separati questi processi perché implementare una versione statica richiede la scrittura di molto codice non complesso, aggiungere interattività, al contrario, richiede di spremersi le meningi e la scrittura di poco codice. Vediamo perché. -To build a static version of your app that renders your data model, you'll want to build components that reuse other components and pass data using *props*. *props* are a way of passing data from parent to child. If you're familiar with the concept of *state*, **don't use state at all** to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app, you don't need it. +Per costruire una versione statica della tua applicazione che renderizza il tuo modello dati, devi implementare componenti che riutilizzano altri componenti e passano dati usando *props*. Le *props* sono un modo di passare dati da genitore a figlio. Se sei familiare con il concetto di *state*, **evita di utilizzarlo del tutto** nella costruzione di una versione statica. Lo stato (nella forma della proprietà `state`) è riservato all'interattività, ovvero, dati che cambiano nel tempo. Dato che si tratta di una versione statica, non ne abbiamo bisogno. -You can build top-down or bottom-up. That is, you can either start with building the components higher up in the hierarchy (i.e. starting with `FilterableProductTable`) or with the ones lower in it (`ProductRow`). In simpler examples, it's usually easier to go top-down, and on larger projects, it's easier to go bottom-up and write tests as you build. +Puoi cominciare partendo dall'alto (top-down) o dal basso (bottom-up). Il che significa che puoi cominciare con l'implementazione dei componenti più un alto nella gerarchia (per esempio cominciando da `TabellaProdottiRicercabile`) o con quelli più in basso al suo interno (`RigaProdotto`). Nei casi più semplici, è meglio preferire l'approccio top-down, nei progetti più grandi, è più facile l'approccio bottom-up e la contestuale scrittura di test man mano che si implementa. -At the end of this step, you'll have a library of reusable components that render your data model. The components will only have `render()` methods since this is a static version of your app. The component at the top of the hierarchy (`FilterableProductTable`) will take your data model as a prop. If you make a change to your underlying data model and call `ReactDOM.render()` again, the UI will be updated. It's easy to see how your UI is updated and where to make changes since there's nothing complicated going on. React's **one-way data flow** (also called *one-way binding*) keeps everything modular and fast. +Alla fine di questo passo, avrai una libreria di componenti riutilizzabili che renderizza il tuo modello dati. I componenti avranno solo metodi `render()` dati che è una versione statica dell'applicazione. Il componente al vertice della gerarchia (`TabellaProdottiRicercabile`) riceverà il tuo modello dati come prop. Qualora tu cambiassi il modello dati sottostante, richiamando `ReactDOM.render()` di nuovo, la UI verrà aggiornata. È facile vedere come la UI si aggiorna al fine di individuare i necessari cambiamenti dato che quanto sta accadendo non è per nulla complicato. Il **flusso dati monodirezionale** di React (noto anche come *one-way binding*) mantiene ogni cosa modulare e veloce. -Simply refer to the [React docs](/docs/) if you need help executing this step. +Fai riferimento alla [Documentazione](/docs/) se hai bisogno di aiuto nell'esecuzione di questo passo. -### A Brief Interlude: Props vs State {#a-brief-interlude-props-vs-state} +### Un Breve Intervallo: Props vs State {#a-brief-interlude-props-vs-state} -There are two types of "model" data in React: props and state. It's important to understand the distinction between the two; skim [the official React docs](/docs/interactivity-and-dynamic-uis.html) if you aren't sure what the difference is. +Esistono due tipi di "modello" dati in React: props e state. È importante capire la distinzione tra le due cose; sfoglia [la documentazione ufficiale di React](/docs/interactivity-and-dynamic-uis.html) nel caso avessi dubbi. -## Step 3: Identify The Minimal (but complete) Representation Of UI State {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} +## Passo 3: Identifica la Minima (ma completa) Rappresentazione dello Stato della UI {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} -To make your UI interactive, you need to be able to trigger changes to your underlying data model. React makes this easy with **state**. +Per rendere la tua UI interattiva, devi fare in modo che sia possibile alterare il modello dati sottostante. React rende ciò semplice grazie all'uso di **state**. -To build your app correctly, you first need to think of the minimal set of mutable state that your app needs. The key here is [DRY: *Don't Repeat Yourself*](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). Figure out the absolute minimal representation of the state your application needs and compute everything else you need on-demand. For example, if you're building a TODO list, just keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count, simply take the length of the TODO items array. +Al fine di implementare l'applicazione correttamente, devi innanzitutto pensare alla minima parte di stato mutabile del quale la tua applicazione ha bisogno. La chiave qui è [DRY: *Don't Repeat Yourself*](https://it.wikipedia.org/wiki/Don%27t_repeat_yourself). Individua la minima rappresentazione di stato richiesta dall'applicazione e calcola tutto il resto al bisogno. Ad esempio, se stai costruendo una "Lista delle cose da fare"; mantieni solo l'array degli elementi della lista; non mantenere una variabile separata nello stato per il conteggio, utilizza semplicemente la proprietà `length` dell'array. -Think of all of the pieces of data in our example application. We have: +Pensa a tutte le parti di dati nell'applicazione d'esempio. Abbiamo: - * The original list of products - * The search text the user has entered - * The value of the checkbox - * The filtered list of products + * La lista originale dei prodotti + * Il testo di ricerca inserito dall'utente + * Il valore della checkbox + * La lista filtrata dei prodotti -Let's go through each one and figure out which one is state. Simply ask three questions about each piece of data: +Vediamoli uno alla volta al fine di individuare quali rappresentano stato. Poniti tre semplici domande per ognuno: - 1. Is it passed in from a parent via props? If so, it probably isn't state. - 2. Does it remain unchanged over time? If so, it probably isn't state. - 3. Can you compute it based on any other state or props in your component? If so, it isn't state. + 1. Viene ricevuto da un genitore via props? In tal caso, probabilmente non si tratta di stato. + 2. Rimane invariato nel tempo? Se si, probabilmente non si tratta di stato. + 3. Puoi derivarlo in base ad altre parti di state o props nel tuo componente? Se è così, non è stato. -The original list of products is passed in as props, so that's not state. The search text and the checkbox seem to be state since they change over time and can't be computed from anything. And finally, the filtered list of products isn't state because it can be computed by combining the original list of products with the search text and value of the checkbox. +La lista originale dei prodotti viene ricevuta come props, non si tratta quindi di stato. Il testo di ricerca e la checkbox sembrano far parte dello stato dato che cambiano nel tempo e non possono essere derivati da nulla. Infine, la lista filtrata dei prodotti non fa parte dello stato visto che piò essere derivata dalla lista originale dei prodotti, dal testo di ricerca e dal valore della checkbox. -So finally, our state is: +Infine, quindi, il nostro stato è: - * The search text the user has entered - * The value of the checkbox + * Il testo di ricerca inserito dall'utente + * Il valore della checkbox -## Step 4: Identify Where Your State Should Live {#step-4-identify-where-your-state-should-live} +## Passo 4: Identifica Dove Posizionare Il tuo Stato {#step-4-identify-where-your-state-should-live} -<p data-height="600" data-theme-id="0" data-slug-hash="qPrNQZ" data-default-tab="js" data-user="lacker" data-embed-version="2" class="codepen">See the Pen <a href="https://codepen.io/gaearon/pen/qPrNQZ">Thinking In React: Step 4</a> on <a href="https://codepen.io">CodePen</a>.</p> +[Prova su CodeSandbox](embedded-codesandbox://thinking-in-react/2?view=split&editorsize=70) -OK, so we've identified what the minimal set of app state is. Next, we need to identify which component mutates, or *owns*, this state. +OK, abbiamo individuato la minima rappresentazione di stato dell'applicazione. Adesso, dobbiamo trovare quale componente muta, o *possiede*, questo stato. -Remember: React is all about one-way data flow down the component hierarchy. It may not be immediately clear which component should own what state. **This is often the most challenging part for newcomers to understand,** so follow these steps to figure it out: +Ricorda: React è del tutto basato sul concetto di flusso dati unidirezionale dall'alto verso il basso nella gerarchia dei componenti. Può non risultare immediatamente chiaro quale componente deve mantenere quale parte di stato. **Questa è la parte più complicata da capire per chi è agli inizi,** segui questi passi come linea guida: -For each piece of state in your application: +Per ogni parte di stato nella tua applicazione: - * Identify every component that renders something based on that state. - * Find a common owner component (a single component above all the components that need the state in the hierarchy). - * Either the common owner or another component higher up in the hierarchy should own the state. - * If you can't find a component where it makes sense to own the state, create a new component simply for holding the state and add it somewhere in the hierarchy above the common owner component. + * Identifica ogni componente che renderizza qualcosa in base a quello stato. + * Identifica un componente proprietario comune (un singolo componente al di sopra di tutti i componenti che richiedono quello stato nella gerarchia). + * Lo stato dovrà risiedere nel proprietario comune oppure in un altro componente più in alto nella gerarchia. + * Se non riesci ad individuare facilmente il componente che sensatamente dovrebbe mantenere lo stato, crea un nuovo componente semplicemente per fare ciò e posizionalo da qualche parte nella gerarchia al di sopra del componente proprietario comune. -Let's run through this strategy for our application: +Applichiamo questa strategia nella nostra applicazione: - * `ProductTable` needs to filter the product list based on state and `SearchBar` needs to display the search text and checked state. - * The common owner component is `FilterableProductTable`. - * It conceptually makes sense for the filter text and checked value to live in `FilterableProductTable` + * `TabellaProdotti` ha bisogno di filtrare la lista dei prodotti in base allo stato e `BarraRicerca` deve visualizzare il testo di ricerca e lo stato della checkbox. + * Il componente proprietario comune è `TabellaProdottiRicercabile`. + * Concettualmente possiamo dire che ha senso mantenere il testo di ricerca e lo stato della checkbox all'interno di `TabellaProdottiRicercabile` -Cool, so we've decided that our state lives in `FilterableProductTable`. First, add an instance property `this.state = {filterText: '', inStockOnly: false}` to `FilterableProductTable`'s `constructor` to reflect the initial state of your application. Then, pass `filterText` and `inStockOnly` to `ProductTable` and `SearchBar` as a prop. Finally, use these props to filter the rows in `ProductTable` and set the values of the form fields in `SearchBar`. +Bene, abbiamo deciso che il nostro stato vive in `TabellaProdottiRicercabile`. Prima di tutto, aggiungi una proprietà d'istanza `this.state = {testoRicerca: '', soloDisponibili: false}` nel `constructor` di `TabellaProdottiRicercabile` al fine di riflettere lo stato iniziale della tua applicazione. Poi, passa `testoRicerca` e `soloDisponibili` a `TabellaProdotti` e `BarraRicerca` come prop. Infine, usa queste props per filtrare le righe in `TabellaProdotti` e impostare i valori nel form in `BarraRicerca`. -You can start seeing how your application will behave: set `filterText` to `"ball"` and refresh your app. You'll see that the data table is updated correctly. +Puoi cominciare a vedere come si comporta l'applicazione: imposta `testoRicerca` a `"Palla"` e aggiornala. Vedrai che la tabella dati è stata aggiornata correttamente. -## Step 5: Add Inverse Data Flow {#step-5-add-inverse-data-flow} +## Step 5: Invertire il Flusso Dati {#step-5-add-inverse-data-flow} -<p data-height="600" data-theme-id="0" data-slug-hash="LzWZvb" data-default-tab="js,result" data-user="rohan10" data-embed-version="2" data-pen-title="Thinking In React: Step 5" class="codepen">See the Pen <a href="https://codepen.io/gaearon/pen/LzWZvb">Thinking In React: Step 5</a> on <a href="https://codepen.io">CodePen</a>.</p> +[Prova su CodeSandbox](embedded-codesandbox://thinking-in-react/3?view=split&editorsize=70) -So far, we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in `FilterableProductTable`. +Fino ad ora, abbiamo implementato una applicazione che renderizza correttamente con props e state che fluiscono in basso nella gerarchia. Adesso è il momento di supportare il flusso inverso: dobbiamo fare in modo che i componenti form più in basso nella gerarchia, possano aggiornare lo stato in `TabellaProdottiRicercabile`. -React makes this data flow explicit to make it easy to understand how your program works, but it does require a little more typing than traditional two-way data binding. +React rende questo flusso dati esplicito in modo da facilitare la comprensione del funzionamento del programma, tuttavia richiede la scrittura di un po' più codice rispetto ad altre soluzioni con flusso dati bidirezionale (*two-way data binding*). -If you try to type or check the box in the current version of the example, you'll see that React ignores your input. This is intentional, as we've set the `value` prop of the `input` to always be equal to the `state` passed in from `FilterableProductTable`. +Se provi a scrivere qualcosa o a selezionare la casella nella versione vista nel passo precedente, noterai che React ignora completamente il tuo input. Si tratta di un fatto intenzionale, abbiamo infatti impostato la prop `value` dell'`input` per essere sempre uguale allo `state` che riceve da da `TabellaProdottiRicercabile`. -Let's think about what we want to happen. We want to make sure that whenever the user changes the form, we update the state to reflect the user input. Since components should only update their own state, `FilterableProductTable` will pass callbacks to `SearchBar` that will fire whenever the state should be updated. We can use the `onChange` event on the inputs to be notified of it. The callbacks passed by `FilterableProductTable` will call `setState()`, and the app will be updated. +Proviamo a pensare a cosa vogliamo far si che avvenga. Vogliamo fare in modo che a seconda di come l'utente alteri il form, lo stato verrà alterato di conseguenza. Dato che i componenti possono alterare solamente il proprio stato, `TabellaProdottiRicercabile` passerà [callbacks](https://it.wikipedia.org/wiki/Callback) a `BarraRicerca` che verranno invocate ogni qual volta lo stato deve essere aggiornato. Possiamo utilizzare l'evento `onChange` degli input per ricevere tale notifica. Le callbacks passate da `TabellaProdottiRicercabile` chiameranno `setState()` facendo si che la applicazione venga aggiornata. -Though this sounds complex, it's really just a few lines of code. And it's really explicit how your data is flowing throughout the app. +Anche se può sembrare complesso, si tratta in realtà di poche righe di codice. Non dimentichiamoci inoltre del beneficio di essere veramente espliciti riguardo a come i nostri dati fluiscono all'interno dell'applicazione. -## And That's It {#and-thats-it} +## È Tutto {#and-thats-it} -Hopefully, this gives you an idea of how to think about building components and applications with React. While it may be a little more typing than you're used to, remember that code is read far more than it's written, and it's extremely easy to read this modular, explicit code. As you start to build large libraries of components, you'll appreciate this explicitness and modularity, and with code reuse, your lines of code will start to shrink. :) +Speriamo che adesso tu abbia un'idea su come pensare all'implementazione di componenti ed applicazioni in React. Anche se può sembrare che tu abbia bisogno di scrivere più codice di quanto tu sia abituato/a, ricorda che tale codice viene molto più letto che scritto, ed è estremamente facile da comprendere grazie alla modularità e al fatto che è molto esplicito negli intenti. Non appena comincerai a costruire grandi librerie di componenti, apprezzerai queste caratteristiche ancor di più, inoltre, grazie al riutilizzo del codice, alla fine ti ritroverai a scrivere meno righe di codice. :) From b290391e58fa33075d5e4366d890697b5a144e11 Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:10:32 +0000 Subject: [PATCH 3/7] thining-in-react: mocks --- .../blog/thinking-in-react-components.png | Bin 19048 -> 9933 bytes .../images/blog/thinking-in-react-mock.png | Bin 17459 -> 9356 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/content/images/blog/thinking-in-react-components.png b/content/images/blog/thinking-in-react-components.png index c71a86bcbc2e932245391f665c195539b71bf564..7cbae3762cdf5402bd5bb2c6a6feb259bba82e8e 100644 GIT binary patch literal 9933 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 literal 19048 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 A!~g&Q diff --git a/content/images/blog/thinking-in-react-mock.png b/content/images/blog/thinking-in-react-mock.png index 78bd00a4aadf442126af722ca43e58ed48ac3067..f138a9e7449c36d4e0215eadf174e731e0f8f37d 100644 GIT binary patch literal 9356 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 literal 17459 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 Z?7#i!MqL_YkE8$q002ovPDHLkV1mQj-njq( From 75d5c1e14d33aaade4ac780fde41a17b556812b5 Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:14:06 +0000 Subject: [PATCH 4/7] thinking-in-react: examples Tried to replicate externally hosted CodePens --- examples/thinking-in-react/1/index.css | 3 + examples/thinking-in-react/1/index.html | 3 + examples/thinking-in-react/1/index.js | 136 +++ examples/thinking-in-react/1/package.json | 7 + examples/thinking-in-react/2/index.css | 3 + examples/thinking-in-react/2/index.html | 3 + examples/thinking-in-react/2/index.js | 171 ++++ examples/thinking-in-react/2/package.json | 7 + examples/thinking-in-react/3/index.css | 3 + examples/thinking-in-react/3/index.html | 3 + examples/thinking-in-react/3/index.js | 211 ++++ examples/thinking-in-react/3/package.json | 7 + gatsby-config.js | 13 + package.json | 1 + yarn.lock | 1115 ++++++++++++++++++++- 15 files changed, 1656 insertions(+), 30 deletions(-) create mode 100644 examples/thinking-in-react/1/index.css create mode 100644 examples/thinking-in-react/1/index.html create mode 100644 examples/thinking-in-react/1/index.js create mode 100644 examples/thinking-in-react/1/package.json create mode 100644 examples/thinking-in-react/2/index.css create mode 100644 examples/thinking-in-react/2/index.html create mode 100644 examples/thinking-in-react/2/index.js create mode 100644 examples/thinking-in-react/2/package.json create mode 100644 examples/thinking-in-react/3/index.css create mode 100644 examples/thinking-in-react/3/index.html create mode 100644 examples/thinking-in-react/3/index.js create mode 100644 examples/thinking-in-react/3/package.json diff --git a/examples/thinking-in-react/1/index.css b/examples/thinking-in-react/1/index.css new file mode 100644 index 000000000..ce71bb9c9 --- /dev/null +++ b/examples/thinking-in-react/1/index.css @@ -0,0 +1,3 @@ +body { + padding: 5px +} \ No newline at end of file diff --git a/examples/thinking-in-react/1/index.html b/examples/thinking-in-react/1/index.html new file mode 100644 index 000000000..ffc89b5ac --- /dev/null +++ b/examples/thinking-in-react/1/index.html @@ -0,0 +1,3 @@ +<div id="container"> + <!-- This element's contents will be replaced with your component. --> +</div> \ No newline at end of file diff --git a/examples/thinking-in-react/1/index.js b/examples/thinking-in-react/1/index.js new file mode 100644 index 000000000..974a1ed9b --- /dev/null +++ b/examples/thinking-in-react/1/index.js @@ -0,0 +1,136 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +class RigaCategoriaProdotti extends React.Component { + render() { + const categoria = this.props.categoria; + return ( + <tr> + <th colSpan="2">{categoria}</th> + </tr> + ); + } +} + +class RigaProdotto extends React.Component { + render() { + const prodotto = this.props.prodotto; + const nome = prodotto.disponibile ? ( + prodotto.nome + ) : ( + <span style={{color: 'red'}}>{prodotto.nome}</span> + ); + + return ( + <tr> + <td>{nome}</td> + <td>{prodotto.prezzo}</td> + </tr> + ); + } +} + +class TabellaProdotti extends React.Component { + render() { + const righe = []; + let ultimaCategoria = null; + + this.props.prodotti.forEach(prodotto => { + if (prodotto.categoria !== ultimaCategoria) { + righe.push( + <RigaCategoriaProdotti + categoria={prodotto.categoria} + key={prodotto.categoria} + /> + ); + } + righe.push( + <RigaProdotto + prodotto={prodotto} + key={prodotto.nome} + /> + ); + ultimaCategoria = prodotto.categoria; + }); + + return ( + <table> + <thead> + <tr> + <th>Nome</th> + <th>Prezzo</th> + </tr> + </thead> + <tbody>{righe}</tbody> + </table> + ); + } +} + +class BarraRicerca extends React.Component { + render() { + return ( + <form> + <input type="text" placeholder="Cerca..." /> + <p> + <input type="checkbox" /> Mostra solo disponibili + </p> + </form> + ); + } +} + +class TabellaProdottiRicercabile extends React.Component { + render() { + return ( + <div> + <BarraRicerca /> + <TabellaProdotti prodotti={this.props.prodotti} /> + </div> + ); + } +} + +const PRODOTTI = [ + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$49.99', + disponibile: true, + nome: 'Palla da calcio', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$9.99', + disponibile: true, + nome: 'Palla da tennis', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$29.99', + disponibile: false, + nome: 'Palla da canestro', + }, + { + categoria: 'Elettronica', + prezzo: '$99.99', + disponibile: true, + nome: 'iPod Touch', + }, + { + categoria: 'Elettronica', + prezzo: '$399.99', + disponibile: false, + nome: 'iPhone 5', + }, + { + categoria: 'Elettronica', + prezzo: '$199.99', + disponibile: true, + nome: 'Nexus 7', + }, +]; + +ReactDOM.render( + <TabellaProdottiRicercabile prodotti={PRODOTTI} />, + document.getElementById('container') +); diff --git a/examples/thinking-in-react/1/package.json b/examples/thinking-in-react/1/package.json new file mode 100644 index 000000000..92c56c38e --- /dev/null +++ b/examples/thinking-in-react/1/package.json @@ -0,0 +1,7 @@ +{ + "name": "thinking-in-react_1", + "dependencies": { + "react": "16.8.3", + "react-dom": "16.8.3" + } +} \ No newline at end of file diff --git a/examples/thinking-in-react/2/index.css b/examples/thinking-in-react/2/index.css new file mode 100644 index 000000000..ce71bb9c9 --- /dev/null +++ b/examples/thinking-in-react/2/index.css @@ -0,0 +1,3 @@ +body { + padding: 5px +} \ No newline at end of file diff --git a/examples/thinking-in-react/2/index.html b/examples/thinking-in-react/2/index.html new file mode 100644 index 000000000..ffc89b5ac --- /dev/null +++ b/examples/thinking-in-react/2/index.html @@ -0,0 +1,3 @@ +<div id="container"> + <!-- This element's contents will be replaced with your component. --> +</div> \ No newline at end of file diff --git a/examples/thinking-in-react/2/index.js b/examples/thinking-in-react/2/index.js new file mode 100644 index 000000000..acb359fd0 --- /dev/null +++ b/examples/thinking-in-react/2/index.js @@ -0,0 +1,171 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +class RigaCategoriaProdotti extends React.Component { + render() { + const categoria = this.props.categoria; + return ( + <tr> + <th colSpan="2">{categoria}</th> + </tr> + ); + } +} + +class RigaProdotto extends React.Component { + render() { + const prodotto = this.props.prodotto; + const nome = prodotto.disponibile ? ( + prodotto.nome + ) : ( + <span style={{color: 'red'}}>{prodotto.nome}</span> + ); + + return ( + <tr> + <td>{nome}</td> + <td>{prodotto.prezzo}</td> + </tr> + ); + } +} + +class TabellaProdotti extends React.Component { + render() { + const testoRicerca = this.props.testoRicerca; + const soloDisponibili = this.props.soloDisponibili; + + const righe = []; + let ultimaCategoria = null; + + this.props.prodotti.forEach(prodotto => { + if (prodotto.nome.indexOf(testoRicerca) === -1) { + return; + } + if (soloDisponibili && !prodotto.disponibile) { + return; + } + if (prodotto.categoria !== ultimaCategoria) { + righe.push( + <RigaCategoriaProdotti + categoria={prodotto.categoria} + key={prodotto.categoria} + /> + ); + } + righe.push( + <RigaProdotto + prodotto={prodotto} + key={prodotto.nome} + /> + ); + ultimaCategoria = prodotto.categoria; + }); + + return ( + <table> + <thead> + <tr> + <th>Nome</th> + <th>Prezzo</th> + </tr> + </thead> + <tbody>{righe}</tbody> + </table> + ); + } +} + +class BarraRicerca extends React.Component { + render() { + const testoRicerca = this.props.testoRicerca; + const soloDisponibili = this.props.soloDisponibili; + + return ( + <form> + <input + type="text" + placeholder="Cerca..." + value={testoRicerca} + /> + <p> + <input + type="checkbox" + checked={soloDisponibili} + />{' '} + Mostra solo disponibili + </p> + </form> + ); + } +} + +class TabellaProdottiRicercabile extends React.Component { + constructor(props) { + super(props); + this.state = { + testoRicerca: '', + soloDisponibili: false, + }; + } + + render() { + return ( + <div> + <BarraRicerca + testoRicerca={this.state.testoRicerca} + soloDisponibili={this.state.soloDisponibili} + /> + <TabellaProdotti + prodotti={this.props.prodotti} + testoRicerca={this.state.testoRicerca} + soloDisponibili={this.state.soloDisponibili} + /> + </div> + ); + } +} + +const PRODOTTI = [ + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$49.99', + disponibile: true, + nome: 'Palla da calcio', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$9.99', + disponibile: true, + nome: 'Palla da tennis', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$29.99', + disponibile: false, + nome: 'Palla da canestro', + }, + { + categoria: 'Elettronica', + prezzo: '$99.99', + disponibile: true, + nome: 'iPod Touch', + }, + { + categoria: 'Elettronica', + prezzo: '$399.99', + disponibile: false, + nome: 'iPhone 5', + }, + { + categoria: 'Elettronica', + prezzo: '$199.99', + disponibile: true, + nome: 'Nexus 7', + }, +]; + +ReactDOM.render( + <TabellaProdottiRicercabile prodotti={PRODOTTI} />, + document.getElementById('container') +); diff --git a/examples/thinking-in-react/2/package.json b/examples/thinking-in-react/2/package.json new file mode 100644 index 000000000..92c56c38e --- /dev/null +++ b/examples/thinking-in-react/2/package.json @@ -0,0 +1,7 @@ +{ + "name": "thinking-in-react_1", + "dependencies": { + "react": "16.8.3", + "react-dom": "16.8.3" + } +} \ No newline at end of file diff --git a/examples/thinking-in-react/3/index.css b/examples/thinking-in-react/3/index.css new file mode 100644 index 000000000..ce71bb9c9 --- /dev/null +++ b/examples/thinking-in-react/3/index.css @@ -0,0 +1,3 @@ +body { + padding: 5px +} \ No newline at end of file diff --git a/examples/thinking-in-react/3/index.html b/examples/thinking-in-react/3/index.html new file mode 100644 index 000000000..ffc89b5ac --- /dev/null +++ b/examples/thinking-in-react/3/index.html @@ -0,0 +1,3 @@ +<div id="container"> + <!-- This element's contents will be replaced with your component. --> +</div> \ No newline at end of file diff --git a/examples/thinking-in-react/3/index.js b/examples/thinking-in-react/3/index.js new file mode 100644 index 000000000..24ed1ebd6 --- /dev/null +++ b/examples/thinking-in-react/3/index.js @@ -0,0 +1,211 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +class RigaCategoriaProdotti extends React.Component { + render() { + const categoria = this.props.categoria; + return ( + <tr> + <th colSpan="2">{categoria}</th> + </tr> + ); + } +} + +class RigaProdotto extends React.Component { + render() { + const prodotto = this.props.prodotto; + const nome = prodotto.disponibile ? ( + prodotto.nome + ) : ( + <span style={{color: 'red'}}>{prodotto.nome}</span> + ); + + return ( + <tr> + <td>{nome}</td> + <td>{prodotto.prezzo}</td> + </tr> + ); + } +} + +class TabellaProdotti extends React.Component { + render() { + const testoRicerca = this.props.testoRicerca; + const soloDisponibili = this.props.soloDisponibili; + + const righe = []; + let ultimaCategoria = null; + + this.props.prodotti.forEach(prodotto => { + if (prodotto.nome.indexOf(testoRicerca) === -1) { + return; + } + if (soloDisponibili && !prodotto.disponibile) { + return; + } + if (prodotto.categoria !== ultimaCategoria) { + righe.push( + <RigaCategoriaProdotti + categoria={prodotto.categoria} + key={prodotto.categoria} + /> + ); + } + righe.push( + <RigaProdotto + prodotto={prodotto} + key={prodotto.nome} + /> + ); + ultimaCategoria = prodotto.categoria; + }); + + return ( + <table> + <thead> + <tr> + <th>Nome</th> + <th>Prezzo</th> + </tr> + </thead> + <tbody>{righe}</tbody> + </table> + ); + } +} + +class BarraRicerca extends React.Component { + constructor(props) { + super(props); + this.handleTestoRicercaChange = this.handleTestoRicercaChange.bind( + this + ); + this.handleSoloDisponibiliChange = this.handleSoloDisponibiliChange.bind( + this + ); + } + + handleTestoRicercaChange(e) { + this.props.onFilterTextChange(e.target.value); + } + + handleSoloDisponibiliChange(e) { + this.props.onInStockChange(e.target.checked); + } + render() { + const testoRicerca = this.props.testoRicerca; + const soloDisponibili = this.props.soloDisponibili; + + return ( + <form> + <input + type="text" + placeholder="Cerca..." + value={testoRicerca} + onChange={this.handleTestoRicercaChange} + /> + <p> + <input + type="checkbox" + checked={soloDisponibili} + onChange={this.handleSoloDisponibiliChange} + />{' '} + Mostra solo disponibili + </p> + </form> + ); + } +} + +class TabellaProdottiRicercabile extends React.Component { + constructor(props) { + super(props); + this.state = { + testoRicerca: '', + soloDisponibili: false, + }; + + this.handleTestoRicercaChange = this.handleTestoRicercaChange.bind( + this + ); + this.handleSoloDisponibiliChange = this.handleSoloDisponibiliChange.bind( + this + ); + } + + handleTestoRicercaChange(testoRicerca) { + this.setState({ + testoRicerca: testoRicerca, + }); + } + + handleSoloDisponibiliChange(soloDisponibili) { + this.setState({ + soloDisponibili: soloDisponibili, + }); + } + + render() { + return ( + <div> + <BarraRicerca + testoRicerca={this.state.testoRicerca} + soloDisponibili={this.state.soloDisponibili} + onFilterTextChange={this.handleTestoRicercaChange} + onInStockChange={this.handleSoloDisponibiliChange} + /> + <TabellaProdotti + prodotti={this.props.prodotti} + testoRicerca={this.state.testoRicerca} + soloDisponibili={this.state.soloDisponibili} + /> + </div> + ); + } +} + +const PRODOTTI = [ + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$49.99', + disponibile: true, + nome: 'Palla da calcio', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$9.99', + disponibile: true, + nome: 'Palla da tennis', + }, + { + categoria: 'Attrezzatura Sportiva', + prezzo: '$29.99', + disponibile: false, + nome: 'Palla da canestro', + }, + { + categoria: 'Elettronica', + prezzo: '$99.99', + disponibile: true, + nome: 'iPod Touch', + }, + { + categoria: 'Elettronica', + prezzo: '$399.99', + disponibile: false, + nome: 'iPhone 5', + }, + { + categoria: 'Elettronica', + prezzo: '$199.99', + disponibile: true, + nome: 'Nexus 7', + }, +]; + +ReactDOM.render( + <TabellaProdottiRicercabile prodotti={PRODOTTI} />, + document.getElementById('container') +); diff --git a/examples/thinking-in-react/3/package.json b/examples/thinking-in-react/3/package.json new file mode 100644 index 000000000..92c56c38e --- /dev/null +++ b/examples/thinking-in-react/3/package.json @@ -0,0 +1,7 @@ +{ + "name": "thinking-in-react_1", + "dependencies": { + "react": "16.8.3", + "react-dom": "16.8.3" + } +} \ No newline at end of file diff --git a/gatsby-config.js b/gatsby-config.js index 7721d4816..a7b6427cb 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -70,6 +70,19 @@ module.exports = { target: '_blank', }, }, + { + resolve: 'gatsby-remark-embedded-codesandbox', + options: { + directory: `${__dirname}/examples/`, + protocol: 'embedded-codesandbox://', + embedOptions: { + view: 'preview', + hidenavigation: 1, + fontsize: 13, + }, + getIframe: url => `<iframe src="${url}" style="width: 100%; overflow:hidden; display:block;max-width: none;" height="600" class="embedded-codesandbox" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin"></iframe>`, + }, + }, { resolve: 'gatsby-remark-embed-snippet', options: { diff --git a/package.json b/package.json index f1628e72e..d2d955a26 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "gatsby-remark-code-repls": "^2.0.0", "gatsby-remark-copy-linked-files": "^2.0.0", "gatsby-remark-embed-snippet": "^3.0.0", + "gatsby-remark-embedded-codesandbox": "^1.2.0", "gatsby-remark-images": "^2.0.0", "gatsby-remark-prismjs": "^3.0.2", "gatsby-remark-responsive-iframe": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index a3859f100..83cba86a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,7 +9,7 @@ dependencies: "@babel/highlight" "7.0.0-beta.44" -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== @@ -1057,6 +1057,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1077,6 +1082,14 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn-globals@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.0.tgz#e3b6f8da3c1552a95ae627571f7dd6923bb54103" + integrity sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: version "3.0.1" resolved "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -1091,16 +1104,26 @@ acorn-object-spread@^1.0.0: dependencies: acorn "^3.1.0" +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0: version "3.3.0" resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2: +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" @@ -1195,7 +1218,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -1244,6 +1267,13 @@ apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: fast-json-stable-stringify "^2.0.0" fclone "^1.0.11" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= + dependencies: + default-require-extensions "^1.0.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1314,6 +1344,11 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -1432,6 +1467,11 @@ ast-types-flow@0.0.7, ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each-series@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" @@ -1459,6 +1499,13 @@ async@^2.1.2: dependencies: lodash "^4.17.10" +async@^2.1.4, async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1517,6 +1564,31 @@ babel-core@7.0.0-bridge.0: resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== +babel-core@^6.0.0, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + babel-eslint@^8.0.1, babel-eslint@^8.2.2: version "8.2.6" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" @@ -1529,7 +1601,7 @@ babel-eslint@^8.0.1, babel-eslint@^8.2.2: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-generator@^6.26.0: +babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== @@ -1619,6 +1691,22 @@ babel-helper-replace-supers@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" + integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== + dependencies: + babel-plugin-istanbul "^4.1.6" + babel-preset-jest "^23.2.0" + babel-loader@8.0.0-beta.4: version "8.0.0-beta.4" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.4.tgz#c3fab00696c385c70c04dbe486391f0eb996f345" @@ -1655,6 +1743,21 @@ babel-plugin-dynamic-import-node@^1.2.0: dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" +babel-plugin-istanbul@^4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" + integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== + dependencies: + babel-plugin-syntax-object-rest-spread "^6.13.0" + find-up "^2.1.0" + istanbul-lib-instrument "^1.10.1" + test-exclude "^4.2.1" + +babel-plugin-jest-hoist@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" + integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= + babel-plugin-macros@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz#21b1a2e82e2130403c5ff785cba6548e9b644b28" @@ -1688,7 +1791,7 @@ babel-plugin-syntax-jsx@^6.8.0: resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= @@ -1935,6 +2038,27 @@ babel-preset-fbjs@^2.1.4: babel-plugin-transform-react-display-name "^6.8.0" babel-plugin-transform-react-jsx "^6.8.0" +babel-preset-jest@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" + integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= + dependencies: + babel-plugin-jest-hoist "^23.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1943,7 +2067,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= @@ -1954,7 +2078,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -1969,7 +2093,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -2272,6 +2396,18 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -2546,6 +2682,11 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2584,6 +2725,13 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000890.tgz#86a18ffcc65d79ec6a437e985761b8bf1c4efeaf" integrity sha512-4NI3s4Y6ROm+SgZN5sLUG4k7nVWQnedis3c/RWkynV5G6cHSY7+a8fwFyn2yoBDE3E6VswhTNNwR3PvzGqlTkg== +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" @@ -3098,7 +3246,7 @@ convert-hrtime@^2.0.0: resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-2.0.0.tgz#19bfb2c9162f9e11c2f04c2c79de2b7e8095c627" integrity sha1-Gb+yyRYvnhHC8Ewsed4rfoCVxic= -convert-source-map@^1.1.0, convert-source-map@^1.1.1: +convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.4.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -3476,6 +3624,18 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" + integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== + dependencies: + cssom "0.3.x" + csstype@^2.2.0: version "2.5.7" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.7.tgz#bf9235d5872141eccfb2d16d82993c6b149179ff" @@ -3514,6 +3674,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -3720,6 +3889,13 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + dependencies: + strip-bom "^2.0.0" + define-properties@^1.1.1, define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -3836,6 +4012,11 @@ detect-libc@^1.0.2, detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-node@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" @@ -3879,6 +4060,11 @@ devcert-san@^0.3.3: tmp "^0.0.31" tslib "^1.6.0" +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + diffie-hellman@^5.0.0: version "5.0.3" resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -3979,6 +4165,13 @@ domelementtype@~1.1.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" @@ -4303,6 +4496,18 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-fbjs@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/eslint-config-fbjs/-/eslint-config-fbjs-2.0.1.tgz#395896fd740e0e28dc1c2072e3bc982e88247df5" @@ -4537,6 +4742,11 @@ esprima@^2.6.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -4556,7 +4766,7 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -4615,6 +4825,13 @@ exec-series@^1.0.0: async-each-series "^1.1.0" object-assign "^4.1.0" +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -4671,6 +4888,11 @@ exif-parser@^0.1.9: resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI= +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -4710,6 +4932,18 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" + integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== + dependencies: + ansi-styles "^3.2.0" + jest-diff "^23.6.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + express-graphql@^0.6.12: version "0.6.12" resolved "http://registry.npmjs.org/express-graphql/-/express-graphql-0.6.12.tgz#dfcb2058ca72ed5190b140830ad8cdbf76a9128a" @@ -5022,6 +5256,14 @@ filenamify@^2.0.0: strip-outer "^1.0.0" trim-repeated "^1.0.0" +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + filesize@3.5.11: version "3.5.11" resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" @@ -5297,6 +5539,14 @@ fsevents@^1.0.0, fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^1.2.3: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5499,6 +5749,16 @@ gatsby-remark-embed-snippet@^3.0.0: parse-numeric-range "^0.0.2" unist-util-map "^1.0.3" +gatsby-remark-embedded-codesandbox@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gatsby-remark-embedded-codesandbox/-/gatsby-remark-embedded-codesandbox-1.2.0.tgz#8acbb7bbeea3ced8209a0a6133adf65662c5ab27" + integrity sha512-/fOAegvx3u5xoLOa64EoenMJVHkSqeHcFoZxNRxWot/Z8fiGfvmCnDRvQjvxYhUL84m7nb+037HDzACV0Fr+EQ== + dependencies: + jest "^23.1.0" + lz-string "^1.4.4" + query-string "^6.0.0" + unist-util-map "^1.0.3" + gatsby-remark-images@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/gatsby-remark-images/-/gatsby-remark-images-2.0.4.tgz#29894b85b4181527fa34514fb73218c8e7f89129" @@ -6133,6 +6393,11 @@ gray-matter@^4.0.0: section-matter "^1.0.0" strip-bom-string "^1.0.0" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + gud@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" @@ -6207,6 +6472,17 @@ handle-thing@^1.2.5: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= +handlebars@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -6239,6 +6515,11 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6451,6 +6732,14 @@ hoist-non-react-statics@^2.5.0: resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" @@ -6488,6 +6777,13 @@ html-comment-regex@^1.1.0: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -6596,7 +6892,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6701,6 +6997,14 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -7059,6 +7363,11 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -7379,6 +7688,76 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-api@^1.3.1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" + integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA== + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.1" + istanbul-lib-hook "^1.2.2" + istanbul-lib-instrument "^1.10.2" + istanbul-lib-report "^1.1.5" + istanbul-lib-source-maps "^1.2.6" + istanbul-reports "^1.5.1" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.2.0, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== + +istanbul-lib-hook@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw== + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + +istanbul-lib-report@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw== + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.4, istanbul-lib-source-maps@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg== + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw== + dependencies: + handlebars "^4.0.3" + isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -7397,11 +7776,313 @@ iterall@^1.1.3, iterall@^1.2.1: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" + integrity sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA== + dependencies: + throat "^4.0.0" + +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" + integrity sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.3.1" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-source-maps "^1.2.4" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" + jest-environment-jsdom "^23.4.0" + jest-get-type "^22.1.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + jest-watcher "^23.4.0" + jest-worker "^23.2.0" + micromatch "^2.3.11" + node-notifier "^5.2.1" + prompts "^0.1.9" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^11.0.0" + +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" + integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== + dependencies: + babel-core "^6.0.0" + babel-jest "^23.6.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^23.4.0" + jest-environment-node "^23.4.0" + jest-get-type "^22.1.0" + jest-jasmine2 "^23.6.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" + +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" + integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== +jest-docblock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-23.2.0.tgz#f085e1f18548d99fdd69b20207e6fd55d91383a7" + integrity sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c= + dependencies: + detect-newline "^2.1.0" + +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" + integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== + dependencies: + chalk "^2.0.1" + pretty-format "^23.6.0" + +jest-environment-jsdom@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" + integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + jsdom "^11.5.1" + +jest-environment-node@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" + integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= + dependencies: + jest-mock "^23.2.0" + jest-util "^23.4.0" + +jest-get-type@^22.1.0: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== + +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" + integrity sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-docblock "^23.2.0" + jest-serializer "^23.0.1" + jest-worker "^23.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" + integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== + dependencies: + babel-traverse "^6.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^23.6.0" + is-generator-fn "^1.0.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + pretty-format "^23.6.0" + +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" + integrity sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg== + dependencies: + pretty-format "^23.6.0" + +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" + integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^23.6.0" + +jest-message-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" + integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^23.2.0: + version "23.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" + integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= + +jest-regex-util@^23.3.0: + version "23.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" + integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= + +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" + integrity sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA== + dependencies: + jest-regex-util "^23.3.0" + jest-snapshot "^23.6.0" + +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" + integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== + dependencies: + browser-resolve "^1.11.3" + chalk "^2.0.1" + realpath-native "^1.0.0" + +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" + integrity sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA== + dependencies: + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-docblock "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" + jest-message-util "^23.4.0" + jest-runtime "^23.6.0" + jest-util "^23.4.0" + jest-worker "^23.2.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" + integrity sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw== + dependencies: + babel-core "^6.0.0" + babel-plugin-istanbul "^4.1.6" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.11" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" + jest-message-util "^23.4.0" + jest-regex-util "^23.3.0" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" + jest-util "^23.4.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^11.0.0" + +jest-serializer@^23.0.1: + version "23.0.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" + integrity sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU= + +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" + integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== + dependencies: + babel-types "^6.0.0" + chalk "^2.0.1" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" + jest-message-util "^23.4.0" + jest-resolve "^23.6.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^23.6.0" + semver "^5.5.0" + +jest-util@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" + integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^23.4.0" + mkdirp "^0.5.1" + slash "^1.0.0" + source-map "^0.6.0" + +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + +jest-watcher@^23.4.0: + version "23.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" + integrity sha1-0uKM50+NrWxq/JIrksq+9u0FyRw= + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + string-length "^2.0.0" + jest-worker@^23.2.0: version "23.2.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" @@ -7409,6 +8090,14 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" +jest@^23.1.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" + integrity sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw== + dependencies: + import-local "^1.0.0" + jest-cli "^23.6.0" + jimp@^0.2.24: version "0.2.28" resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" @@ -7468,6 +8157,14 @@ js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.5.2, js-yaml@^3.9. argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.7.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -7481,6 +8178,38 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -7543,7 +8272,7 @@ json3@^3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= @@ -7618,6 +8347,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +kleur@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" + integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== + last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" @@ -7659,7 +8393,12 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -leven@^2.0.0: +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.0.0, leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= @@ -7933,6 +8672,11 @@ lodash.restparam@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + lodash.template@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" @@ -7966,7 +8710,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.11.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4.11.1, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -8069,6 +8813,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + map-age-cleaner@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" @@ -8272,12 +9023,17 @@ merge2@^1.2.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" integrity sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg== +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -8430,11 +9186,16 @@ minimist@0.0.8: resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" @@ -8700,6 +9461,17 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" @@ -8861,6 +9633,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c" + integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg== + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -9005,6 +9782,14 @@ opn@^5.1.0, opn@^5.3.0: dependencies: is-wsl "^1.1.0" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + optimize-css-assets-webpack-plugin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" @@ -9013,7 +9798,7 @@ optimize-css-assets-webpack-plugin@^5.0.1: cssnano "^4.1.0" last-call-webpack-plugin "^3.0.0" -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= @@ -9073,7 +9858,7 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -9316,6 +10101,11 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parse5@^3.0.1, parse5@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -9369,7 +10159,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -9520,6 +10310,11 @@ pluralize@^7.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + pngjs@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" @@ -9955,6 +10750,14 @@ pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + prismjs@^1.15.0, prismjs@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" @@ -9962,7 +10765,7 @@ prismjs@^1.15.0, prismjs@^1.6.0: optionalDependencies: clipboard "^2.0.0" -private@^0.1.6: +private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== @@ -10016,6 +10819,14 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +prompts@^0.1.9: + version "0.1.14" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" + integrity sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w== + dependencies: + kleur "^2.0.1" + sisteransi "^0.1.1" + prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" @@ -10057,6 +10868,11 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== +psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -10107,7 +10923,7 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@2.x.x, punycode@^2.1.0: +punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -10127,6 +10943,14 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.3.0.tgz#41ae8a61e1213c80b182d5db6cf129e05af89fc5" + integrity sha512-jkpCkoHiAA2BYZvni5GieU3x860QDfkh2+M6bPnrYUywqOWbGwPq5VzntTS06ixX4GVHEiq2ZhlmGy/e9LQ3zA== + dependencies: + decode-uri-component "^0.2.0" + strict-uri-encode "^2.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -10397,6 +11221,13 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" +realpath-native@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + recursive-readdir-synchronous@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/recursive-readdir-synchronous/-/recursive-readdir-synchronous-0.0.3.tgz#d5e5a096ad56cf9666241c22a30b4f338bb7ed88" @@ -10703,6 +11534,22 @@ request-promise-core@1.1.1: dependencies: lodash "^4.13.1" +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request-promise@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" @@ -10713,7 +11560,7 @@ request-promise@^4.2.2: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@^2.65.0, request@^2.83.0, request@^2.85.0: +request@^2.65.0, request@^2.83.0, request@^2.85.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -10802,6 +11649,11 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -10900,6 +11752,11 @@ rss@^1.2.2: mime-types "2.1.13" xml "1.0.1" +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -10943,6 +11800,22 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^2.0.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" + integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + sanitize-html@^1.18.2: version "1.19.1" resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.19.1.tgz#e8b33c69578054d6ee4f57ea152d6497f3f6fb7d" @@ -11201,6 +12074,11 @@ shell-quote@1.6.1, shell-quote@^1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + sift@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/sift/-/sift-5.1.0.tgz#1bbf2dfb0eb71e56c4cc7fb567fbd1351b65015e" @@ -11242,6 +12120,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sisteransi@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-0.1.1.tgz#5431447d5f7d1675aac667ccd0b865a4994cb3ce" + integrity sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -11397,6 +12280,21 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-support@^0.5.6: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" @@ -11557,6 +12455,11 @@ stack-trace@^0.0.10: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + stackframe@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" @@ -11590,7 +12493,7 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -stealthy-require@^1.1.0: +stealthy-require@^1.1.0, stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= @@ -11654,6 +12557,19 @@ stream-to@~0.2.0: resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0= +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-similarity@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-1.2.2.tgz#99b2c20a3c9bbb3903964eae1d89856db3d8db9b" @@ -11740,6 +12656,11 @@ strip-bom-string@^1.0.0: resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -11747,11 +12668,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-dirs@^1.0.0: version "1.1.1" resolved "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" @@ -11824,6 +12740,13 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -11869,6 +12792,11 @@ symbol-observable@^1.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + table@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -11973,11 +12901,27 @@ terser@^3.8.1: source-map "~0.6.1" source-map-support "~0.5.6" +test-exclude@^4.2.1: + version "4.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + text-table@0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2-filter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" @@ -12063,6 +13007,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-absolute-glob@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" @@ -12140,6 +13089,21 @@ tough-cookie@>=2.3.3, tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + trim-lines@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.1.tgz#da738ff58fa74817588455e30b11b85289f2a396" @@ -12242,6 +13206,14 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + uglifyjs-webpack-plugin@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" @@ -12765,6 +13737,20 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + ware@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" @@ -12779,6 +13765,14 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -12800,6 +13794,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.2.tgz#c8dc267ab639505276bae19e129dbd6ae72b22b4" integrity sha512-II+n2ms4mPxK+RnIxRPOw3zwF2jRscdJIUE9BfkKHm4FYEg9+biIoTMnaZF5MpemE3T+VhMLrhbyD4ilkPCSbg== +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-assets-manifest@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.0.tgz#5c540606e061a39e314042059c854a38bc696911" @@ -12938,6 +13937,13 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + whatwg-fetch@2.0.4: version "2.0.4" resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" @@ -12948,6 +13954,29 @@ whatwg-fetch@>=0.10.0: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" @@ -12963,7 +13992,7 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.2.14, which@^1.2.9: +which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12984,6 +14013,11 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -13025,6 +14059,15 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -13032,6 +14075,13 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + ws@~3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -13066,6 +14116,11 @@ xhr@^2.0.1: parse-headers "^2.0.0" xtend "^4.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml-parse-from-string@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" @@ -13175,7 +14230,7 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^11.1.0: +yargs@^11.0.0, yargs@^11.1.0: version "11.1.0" resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A== From 06046ad56ca9e84cfa0e96d358e3281efbd6d6f1 Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:17:20 +0000 Subject: [PATCH 5/7] =?UTF-8?q?thinking-in-react:=20prettier=20fix=20?= =?UTF-8?q?=F0=9F=A4=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gatsby-config.js | 3 ++- .../gatsby-transformer-versions-yaml/gatsby-node.js | 10 ++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gatsby-config.js b/gatsby-config.js index a7b6427cb..ab43a35a4 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -80,7 +80,8 @@ module.exports = { hidenavigation: 1, fontsize: 13, }, - getIframe: url => `<iframe src="${url}" style="width: 100%; overflow:hidden; display:block;max-width: none;" height="600" class="embedded-codesandbox" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin"></iframe>`, + getIframe: url => + `<iframe src="${url}" style="width: 100%; overflow:hidden; display:block;max-width: none;" height="600" class="embedded-codesandbox" sandbox="allow-modals allow-forms allow-popups allow-scripts allow-same-origin"></iframe>`, }, }, { diff --git a/plugins/gatsby-transformer-versions-yaml/gatsby-node.js b/plugins/gatsby-transformer-versions-yaml/gatsby-node.js index e73b566f3..a5396891f 100644 --- a/plugins/gatsby-transformer-versions-yaml/gatsby-node.js +++ b/plugins/gatsby-transformer-versions-yaml/gatsby-node.js @@ -20,10 +20,12 @@ exports.onPostBuild = async ({store}) => { // versions.yml structure is [{path: string, url: string, ...}, ...] createRedirects( - versions.filter(version => version.path && version.url).map(version => ({ - fromPath: version.path, - toPath: version.url, - })), + versions + .filter(version => version.path && version.url) + .map(version => ({ + fromPath: version.path, + toPath: version.url, + })), redirectsFilePath, ); }; From f93decb0d3e7087b47aa36ac9272f79bcca0f34a Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Wed, 6 Mar 2019 07:43:37 +0000 Subject: [PATCH 6/7] thinking-in-react: prettier... weirdness "--write" changed this file but it looks like that CircleCI doesn't like it... reverting --- .../gatsby-transformer-versions-yaml/gatsby-node.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/gatsby-transformer-versions-yaml/gatsby-node.js b/plugins/gatsby-transformer-versions-yaml/gatsby-node.js index a5396891f..e73b566f3 100644 --- a/plugins/gatsby-transformer-versions-yaml/gatsby-node.js +++ b/plugins/gatsby-transformer-versions-yaml/gatsby-node.js @@ -20,12 +20,10 @@ exports.onPostBuild = async ({store}) => { // versions.yml structure is [{path: string, url: string, ...}, ...] createRedirects( - versions - .filter(version => version.path && version.url) - .map(version => ({ - fromPath: version.path, - toPath: version.url, - })), + versions.filter(version => version.path && version.url).map(version => ({ + fromPath: version.path, + toPath: version.url, + })), redirectsFilePath, ); }; From 7e925a14fb303f8ac5aad11b352b7d94c96af886 Mon Sep 17 00:00:00 2001 From: Alessandro De Blasis <alex@deblasis.net> Date: Mon, 18 Mar 2019 14:25:52 +0000 Subject: [PATCH 7/7] Update index.html --- examples/thinking-in-react/1/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/thinking-in-react/1/index.html b/examples/thinking-in-react/1/index.html index ffc89b5ac..863cb004b 100644 --- a/examples/thinking-in-react/1/index.html +++ b/examples/thinking-in-react/1/index.html @@ -1,3 +1,3 @@ <div id="container"> - <!-- This element's contents will be replaced with your component. --> -</div> \ No newline at end of file + <!-- I contenuti di questo elemento verranno rimpiazzati dal tuo componente. --> +</div>