diff --git a/.eslintrc.init.json b/.eslintrc.init.json new file mode 100644 index 0000000..e7215b3 --- /dev/null +++ b/.eslintrc.init.json @@ -0,0 +1,17 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": "eslint:recommended", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + } +} \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..48632b6 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,17 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "extends": "eslint:recommended", + "globals": { + "cy": "readonly", + "Cypress": "readonly" + }, + "rules": { + } +} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..83b1f37 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,12 @@ +# Extensions +*.html +*.feature + +# Node +node_modules + +# Report outputs +results + +# Cypress example and initial structure +cypress/integration/examples \ No newline at end of file diff --git a/README.md b/README.md index 6634196..df57d03 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cypress.io with Patterns - Using Cypress to handle automation tests implementing Page Objects and Screenplay patterns. +Using Cypress to handle automation tests implementing Page Objects and Screenplay patterns. ## BDD Features with Gherkin @@ -8,22 +8,90 @@ The goal was to develop automation tests to the simple list app available at htt To achieve that, Gherkin features lead the way of thinking the core features of that system. Given/When/Then strategy was used here: -* [_adicionar.feature_](./features/adicionar.feature) -* [_remover.feature_](./features/remover.feature) +- [_adicionar.feature_](./features/adicionar.feature) +- [_remover.feature_](./features/remover.feature) ## Page objects pattern Development with this pattern was done under the branch [feature/page-objects](https://github.com/thiagojacinto/cypress-with-patterns/tree/feature/page-objects). -> Objeto _Home_: +> Object _Home_: + +- [support/](./cypress/support) + - [pageObjects/](./cypress/support/pageObjects) + - [Home/](./cypress/support/pageObjects/Home) + - [elements.components.js](./cypress/support/pageObjects/Home/elements.components.js) + - [index.js](./cypress/support/pageObjects/Home/index.js) + +> Tests: + +- [integration/](./cypress/integration) + - [page-objects/](./cypress/integration/page-objects) + - [adicionar.spec.js](./cypress/integration/page-objects/adicionar.spec.js) + - [remover.spec.js](./cypress/integration/page-objects/remover.spec.js) + +## Screenplay pattern + +Implementation of this pattern was developed after the page object approuch. Another strategy was using fixture to handle import data from external file (ex: json) and randomize inputs. + +> Fixture: + +* [fixtures/](./cypress/fixtures) + * [repositorios.json](./cypress/fixtures/repositorios.json) + +> _Screenplay pattern_ base files: + +Five original blocks were simplified to 3: [Actor](./cypress/support/screenplay/agente/Agente.js), [Task](./cypress/support/screenplay/tarefa/Tarefa.js) and [Questions](./cypress/support/screenplay/dado-quando-entao/DadoQuandoEntao.js), here translated to _Agente, Tarefa_ e _DadoQuandoEntao_, respectively. + * [support/](./cypress/support) - * [pageObjects/](./cypress/support/pageObjects) - * [Home/](./cypress/support/pageObjects/Home) - * [elements.components.js](./cypress/support/pageObjects/Home/elements.components.js) - * [index.js](./cypress/support/pageObjects/Home/index.js) + * [screenplay/](./cypress/support/screenplay) + * [agente/](./cypress/support/screenplay/agente) + * [Agente.js](./cypress/support/screenplay/agente/Agente.js) + * [Usuario.js](./cypress/support/screenplay/agente/Usuario.js) + * [index.js](./cypress/support/screenplay/agente/index.js) + * [dado-quando-entao/](./cypress/support/screenplay/dado-quando-entao) + * [DadoQuandoEntao.js](./cypress/support/screenplay/dado-quando-entao/DadoQuandoEntao.js) + * [index.js](./cypress/support/screenplay/dado-quando-entao/index.js) + * [tarefa/](./cypress/support/screenplay/tarefa) + * [Tarefa.js](./cypress/support/screenplay/tarefa/Tarefa.js) + * [index.js](./cypress/support/screenplay/tarefa/index.js) + * [utils/](./cypress/support/screenplay/utils) + * [index.js](./cypress/support/screenplay/utils/index.js) + * [naoImplementado.error.js](./cypress/support/screenplay/utils/naoImplementado.error.js) + * [ScreenplayItem.js](./cypress/support/screenplay/ScreenplayItem.js) + * [index.js](./cypress/support/screenplay/index.js) + +> Tests: -> Testes: * [integration/](./cypress/integration) - * [page-objects/](./cypress/integration/page-objects) - * [adicionar.spec.js](./cypress/integration/page-objects/adicionar.spec.js) - * [remover.spec.js](./cypress/integration/page-objects/remover.spec.js) \ No newline at end of file + * [screenplay/](./cypress/integration/screenplay) + * [Tarefas/](./cypress/integration/screenplay/Tarefas) + * [AcessarHome.tarefa.js](./cypress/integration/screenplay/Tarefas/AcessarHome.tarefa.js) + * [AdicionarValorVazio.tarefa.js](./cypress/integration/screenplay/Tarefas/AdicionarValorVazio.tarefa.js) + * [EsperarListaContendoDoisItens.tarefa.js](./cypress/integration/screenplay/Tarefas/EsperarListaContendoDoisItens.tarefa.js) + * [EsperarListaContendoUmItem.tarefa.js](./cypress/integration/screenplay/Tarefas/EsperarListaContendoUmItem.tarefa.js) + * [ExibirLista.tarefa.js](./cypress/integration/screenplay/Tarefas/ExibirLista.tarefa.js) + * [ExibirListaContendoTres.tarefa.js](./cypress/integration/screenplay/Tarefas/ExibirListaContendoTres.tarefa.js) + * [InserirNovoRepositorio.tarefa.js](./cypress/integration/screenplay/Tarefas/InserirNovoRepositorio.tarefa.js) + * [LimparLista.tarefa.js](./cypress/integration/screenplay/Tarefas/LimparLista.tarefa.js) + * [RemoverItem.tarefa.js](./cypress/integration/screenplay/Tarefas/RemoverItem.tarefa.js) + * [VisualizarListaComItens.tarefa.js](./cypress/integration/screenplay/Tarefas/VisualizarListaComItems.tarefa.js) + * [VisualizarListaVazia.tarefa.js](./cypress/integration/screenplay/Tarefas/VisualizarListaVazia.tarefa.js) + * [index.js](./cypress/integration/screenplay/Tarefas/index.js) + * [adicionar/](./cypress/integration/screenplay/adicionar) + * [adicionar.screenplay.spec.js](./cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js) + * [componentes/](./cypress/integration/screenplay/componentes) + * [home.componentes.js](./cypress/integration/screenplay/componentes/home.componentes.js) + * [remover/](./cypress/integration/screenplay/remover) + * [remover.screenplay.spec.js](./cypress/integration/screenplay/remover/remover.screenplay.spec.js) + +## Lint and precommit hook + +This project uses ESLint, Prettier and lint-staged to handle linting operations and precommit hook. + +Before hands-on, do not forget to run: + +``` +npm install +npx mrm lint-staged +``` diff --git a/cypress.json b/cypress.json index 22f4700..487313b 100644 --- a/cypress.json +++ b/cypress.json @@ -2,7 +2,7 @@ "video": false, "nodeVersion": "system", "baseUrl": "https://repo-listing.web.app", - "testFiles": "page-objects/**.spec.js", + "testFiles": ["screenplay/**/**.spec.js", "page-objects/**/**.spec.js"], "reporter": "mochawesome", "reporterOptions": { diff --git a/cypress/fixtures/repositorios.json b/cypress/fixtures/repositorios.json new file mode 100644 index 0000000..c5e144e --- /dev/null +++ b/cypress/fixtures/repositorios.json @@ -0,0 +1,9 @@ +{ + "lista": [ + "thiagojacinto/es6-review", + "cypress-io/cypress-example-recipes", + "rust-lang/rust", + "hapijs/hapi", + "cli/cli" + ] +} \ No newline at end of file diff --git a/cypress/integration/screenplay/Tarefas/AcessarHome.tarefa.js b/cypress/integration/screenplay/Tarefas/AcessarHome.tarefa.js new file mode 100644 index 0000000..d6a6f8c --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/AcessarHome.tarefa.js @@ -0,0 +1,16 @@ +import { Tarefa, Agente } from "../../../support/screenplay"; //eslint-disable-line +/** + * @class {Tarefa} que representa navegar para homescreen. + */ +export class AcessarHome extends Tarefa { + /** + * Navega para a homescreen. + * @param {Agente} agente + * @returns {Agente} agente + */ + executaComo(agente) { + cy.visit(""); // cypress.json setting baseUrl + cy.viewport("samsung-note9"); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/AdicionarValorVazio.tarefa.js b/cypress/integration/screenplay/Tarefas/AdicionarValorVazio.tarefa.js new file mode 100644 index 0000000..be93188 --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/AdicionarValorVazio.tarefa.js @@ -0,0 +1,21 @@ +import { Tarefa } from "../../../support/screenplay"; +import { ELEMENTS } from "../componentes/home.componentes"; + +/** + * @class AdicionarValorVazio + * @classdesc {Tarefa} que representa inserir um valor vazio no texto e inserir a lista. + */ +export class AdicionarValorVazio extends Tarefa { + /** + * Sem inserir nenhum valor para o campo de texto, adiciona valor vazio a lista. + * @param {Agente} agente + */ + executaComo(agente) { + cy.get(ELEMENTS.submitButton) + .focus() + .click() + .wait(100); + cy.get(ELEMENTS.unorderedList, { timeout: 3000 }); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/EsperarListaContendoDoisItens.tarefa.js b/cypress/integration/screenplay/Tarefas/EsperarListaContendoDoisItens.tarefa.js new file mode 100644 index 0000000..4d10277 --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/EsperarListaContendoDoisItens.tarefa.js @@ -0,0 +1,11 @@ +import { ExibirLista } from "./ExibirLista.tarefa"; +/** + * @class ExibirListaContendoTresItems + * @classdesc extende o comportamento da class ExibirLista e verifica se a lista apresenta 2 items. + */ +export class EsperarListaContendoDoisItens extends ExibirLista { + constructor() { + super(); + this.contendo(2); + } +} diff --git a/cypress/integration/screenplay/Tarefas/EsperarListaContendoUmItem.tarefa.js b/cypress/integration/screenplay/Tarefas/EsperarListaContendoUmItem.tarefa.js new file mode 100644 index 0000000..c8b07fc --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/EsperarListaContendoUmItem.tarefa.js @@ -0,0 +1,11 @@ +import { ExibirLista } from "./ExibirLista.tarefa"; +/** + * @class ExibirListaContendoTresItems + * @classdesc extende o comportamento da class ExibirLista e verifica se a lista apresenta 1 item. + */ +export class EsperarListaContendoUmItem extends ExibirLista { + constructor() { + super(); + this.contendo(1); + } +} diff --git a/cypress/integration/screenplay/Tarefas/ExibirLista.tarefa.js b/cypress/integration/screenplay/Tarefas/ExibirLista.tarefa.js new file mode 100644 index 0000000..d8b3043 --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/ExibirLista.tarefa.js @@ -0,0 +1,28 @@ +import { Tarefa, Agente } from "../../../support/screenplay"; //eslint-disable-line +import { ELEMENTS } from "../componentes/home.componentes"; +/** + * @class {Tarefa} que retorna os repositórios expostos na lista. + */ +export class ExibirLista extends Tarefa { + /** + * Insere o número esperado a ser exibido na lista + * @param {number} quantidade de repositórios a serem exibidos + * @default 1 + */ + contendo(numero = 1) { + this.numero = numero; + } + + /** + * Ver. + * @param {Agente} agente + * @returns {Agente} agente + */ + executaComo(agente) { + cy.get(ELEMENTS.listItems, { timeout: 3000 }).should( + "have.length", + this.numero || 1 + ); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/ExibirListaContendoTres.tarefa.js b/cypress/integration/screenplay/Tarefas/ExibirListaContendoTres.tarefa.js new file mode 100644 index 0000000..72bd9ca --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/ExibirListaContendoTres.tarefa.js @@ -0,0 +1,11 @@ +import { ExibirLista } from "./ExibirLista.tarefa"; +/** + * @class ExibirListaContendoTresItems + * @classdesc extende o comportamento da class ExibirLista e verifica se a lista apresenta 3 items. + */ +export class ExibirListaContendoTres extends ExibirLista { + constructor() { + super(); + this.numero = 3; + } +} diff --git a/cypress/integration/screenplay/Tarefas/InserirNovoRepositorio.tarefa.js b/cypress/integration/screenplay/Tarefas/InserirNovoRepositorio.tarefa.js new file mode 100644 index 0000000..5a1cdf1 --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/InserirNovoRepositorio.tarefa.js @@ -0,0 +1,45 @@ +import { Tarefa, Agente } from "../../../support/screenplay/tarefa"; //eslint-disable-line +import { ELEMENTS } from "../componentes/home.componentes"; +/** + * @class {Tarefa} que representa inserir novo repositório a lista. + */ +export class InserirNovoRepositorio extends Tarefa { + /** + * Insere o username do usuário do GitHub + * @param {string} username do usuario no GitHub + * @default "cypress-io" + */ + doUsuario(usuario = "cypress-io") { + this.usuario = usuario; + return this; + } + /** + * Insere o repositório do usuário disponível publicamente no GitHub + * @param {string} repositorio mesmo nome público do repositório disponível no GitHub + * @default "cypress-example-recipes" + */ + comNome(repositorio = "cypress-example-recipes") { + this.repositorio = repositorio; + return this; + } + + /** + * Adiciona novo repositório. + * @param {Agente} agente + * @returns {Agente} agente + */ + executaComo(agente) { + cy.fixture("repositorios.json").then(data => { + let random = Math.floor(Math.random() * data.lista.length); + // let [usuario, repositorio] = data.lista[random].split("/"); + // cy.get(ELEMENTS.input).type(`${usuario}/${repositorio}`); + cy.get(ELEMENTS.input).type(data.lista[random]); + }); + cy.get(ELEMENTS.submitButton) + .focus() + .click() + .wait(200); + cy.get(ELEMENTS.listItems, { timeout: 3000 }); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/LimparLista.tarefa.js b/cypress/integration/screenplay/Tarefas/LimparLista.tarefa.js new file mode 100644 index 0000000..66955fc --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/LimparLista.tarefa.js @@ -0,0 +1,19 @@ +import { Tarefa } from "../../../support/screenplay"; +import { ELEMENTS } from "../componentes/home.componentes"; + +/** + * @class LimparLista + * @classdesc Limpa a lista removendo todos os items. + */ +export class LimparLista extends Tarefa { + /** + * Remove todos os itens listados. + * @param {Agente} agente + */ + executaComo(agente) { + cy.get(ELEMENTS.clearButton) + .focus() + .click(); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/RemoverItem.tarefa.js b/cypress/integration/screenplay/Tarefas/RemoverItem.tarefa.js new file mode 100644 index 0000000..4010cef --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/RemoverItem.tarefa.js @@ -0,0 +1,23 @@ +import { Tarefa } from "../../../support/screenplay"; +import { ELEMENTS } from "../componentes/home.componentes"; + +/** + * @class RemoverItem + * @classdesc Remove um item da lista de tarefas. + */ +export class RemoverItem extends Tarefa { + /** + * Procura o primeiro botão "Remove" da lista e clica. + * @param {Agente} agente + */ + executaComo(agente) { + cy.get(ELEMENTS.listItems, { timeout: 3000 }).within(() => { + cy.get(ELEMENTS.listItemRemoveButton) + .first() + .focus() + .click(); + }); + + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/VisualizarListaComItems.tarefa.js b/cypress/integration/screenplay/Tarefas/VisualizarListaComItems.tarefa.js new file mode 100644 index 0000000..9714976 --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/VisualizarListaComItems.tarefa.js @@ -0,0 +1,26 @@ +import { Tarefa } from "../../../support/screenplay"; +import { InserirNovoRepositorio } from "./InserirNovoRepositorio.tarefa"; + +/** + * @class VisualizarListaComItems + * @classdesc Gera uma lista com items adicionados. + */ +export class VisualizarListaComItems extends Tarefa { + /** + * + * @param {Number} quantidade + */ + com(quantidade = 1) { + this.quantidade = quantidade; + } + + executaComo(agente) { + let i = 0; + while (i < (this.quantidade || 3)) { + const adicionar = new InserirNovoRepositorio(); + adicionar.executaComo(agente); + i++; + } + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/VisualizarListaVazia.tarefa.js b/cypress/integration/screenplay/Tarefas/VisualizarListaVazia.tarefa.js new file mode 100644 index 0000000..1778a8f --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/VisualizarListaVazia.tarefa.js @@ -0,0 +1,19 @@ +import { Tarefa, Agente } from "../../../support/screenplay"; //eslint-disable-line +import { ELEMENTS } from "../componentes/home.componentes"; + +/** + * @class VisualizarListaVazia + * @classdesc Visualiza uma lista sem nenhuma modificação, sem itens. + */ +export class VisualizarListaVazia extends Tarefa { + /** + * Lista vazia e sem modificação. + * @param {Agente} agente + */ + executaComo(agente) { + cy.get(ELEMENTS.unorderedList, { timeout: 3000 }) + .children() + .should("have.length", 0); + return agente; + } +} diff --git a/cypress/integration/screenplay/Tarefas/index.js b/cypress/integration/screenplay/Tarefas/index.js new file mode 100644 index 0000000..d016f8d --- /dev/null +++ b/cypress/integration/screenplay/Tarefas/index.js @@ -0,0 +1,11 @@ +export * from "./AcessarHome.tarefa"; +export * from "./InserirNovoRepositorio.tarefa"; +export * from "./ExibirLista.tarefa"; +export * from "./ExibirListaContendoTres.tarefa"; +export * from "./AdicionarValorVazio.tarefa"; +export * from "./VisualizarListaVazia.tarefa"; +export * from "./VisualizarListaComItems.tarefa"; +export * from "./EsperarListaContendoDoisItens.tarefa"; +export * from "./EsperarListaContendoUmItem.tarefa"; +export * from "./RemoverItem.tarefa"; +export * from "./LimparLista.tarefa"; diff --git a/cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js b/cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js new file mode 100644 index 0000000..acd6b2d --- /dev/null +++ b/cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js @@ -0,0 +1,36 @@ +/* eslint-disable no-undef */ +/// +import { e, dado, quando, entao, Usuario } from "../../../support/screenplay"; +import { + AcessarHome, + ExibirLista, + ExibirListaContendoTres, + InserirNovoRepositorio, + AdicionarValorVazio, + VisualizarListaVazia +} from "../Tarefas"; + +describe("Adicionar", () => { + const usuario = new Usuario("Thiago"); + + beforeEach(() => { + dado(usuario).tenta(AcessarHome); + }); + + it("Adicionar repositório a lista", () => { + quando(usuario).tenta(InserirNovoRepositorio); + entao(usuario).deve(ExibirLista); + }); + + it("Adicionar mais de um repositório a lista", () => { + quando(usuario).tenta(InserirNovoRepositorio); + e(usuario).tenta(InserirNovoRepositorio); + e(usuario).tenta(InserirNovoRepositorio); + entao(usuario).deve(ExibirListaContendoTres); + }); + + it("Tentar adicionar sem informar nome", () => { + quando(usuario).tenta(AdicionarValorVazio); + entao(usuario).deve(VisualizarListaVazia); + }); +}); diff --git a/cypress/integration/screenplay/componentes/home.componentes.js b/cypress/integration/screenplay/componentes/home.componentes.js new file mode 100644 index 0000000..322fad6 --- /dev/null +++ b/cypress/integration/screenplay/componentes/home.componentes.js @@ -0,0 +1,8 @@ +export const ELEMENTS = { + input: "input#repository__input", + submitButton: "button#btn__add", + clearButton: "button#btn__clear_all", + unorderedList: "ul#repo__list", + listItems: "ul#repo__list li", + listItemRemoveButton: `[name="btn__remove"]` +}; diff --git a/cypress/integration/screenplay/remover/remover.screenplay.spec.js b/cypress/integration/screenplay/remover/remover.screenplay.spec.js new file mode 100644 index 0000000..12f0bfe --- /dev/null +++ b/cypress/integration/screenplay/remover/remover.screenplay.spec.js @@ -0,0 +1,52 @@ +/* eslint-disable no-undef */ +/// + +const { + Usuario, + dado, + e, + quando, + entao +} = require("../../../support/screenplay"); +const { + AcessarHome, + VisualizarListaComItems, + EsperarListaContendoDoisItens, + RemoverItem, + EsperarListaContendoUmItem, + VisualizarListaVazia, + LimparLista +} = require("../Tarefas"); + +describe("Remover", () => { + const usuario = new Usuario("Thiago"); + + describe("Lista com items", () => { + beforeEach(() => { + dado(usuario).tenta(AcessarHome); + e(usuario).pode(VisualizarListaComItems); + }); + + it("Remover um dos repositórios da lista", () => { + quando(usuario).tenta(RemoverItem); + entao(usuario).deve(EsperarListaContendoDoisItens); + }); + + it("Remover mais de um dos repositórios da lista", () => { + quando(usuario).tenta(RemoverItem); + e(usuario).tenta(RemoverItem); + entao(usuario).deve(EsperarListaContendoUmItem); + }); + + it("Limpar a lista", () => { + quando(usuario).tenta(LimparLista); + entao(usuario).deve(VisualizarListaVazia); + }); + }); + + it("Tentar limpar uma lista vazia", () => { + dado(usuario).deve(AcessarHome); + quando(usuario).tenta(LimparLista); + entao(usuario).deve(VisualizarListaVazia); + }); +}); diff --git a/cypress/support/screenplay/ScreenplayItem.js b/cypress/support/screenplay/ScreenplayItem.js new file mode 100644 index 0000000..f7fc390 --- /dev/null +++ b/cypress/support/screenplay/ScreenplayItem.js @@ -0,0 +1,16 @@ +import { NaoImplementadoErro } from "./utils"; + +/** + * @class ScreenplayItem + * @classdesc representa a unidade básica de um item que pertença ao padrão Screenplay + */ +export class ScreenplayItem { + /** + * Lança exceção caso não haja implementação do código. + * @param {*} nomeMetodo + * @throws {Exception} NaoImplementadoErro + */ + lancaExcecaoNaoImplementadoErro(nomeMetodo) { + throw new NaoImplementadoErro(nomeMetodo, this.contructor.name); + } +} diff --git a/cypress/support/screenplay/agente/Agente.js b/cypress/support/screenplay/agente/Agente.js new file mode 100644 index 0000000..db3dbd2 --- /dev/null +++ b/cypress/support/screenplay/agente/Agente.js @@ -0,0 +1,13 @@ +import { ScreenplayItem } from "../ScreenplayItem"; +/** + * @class Agente que representa o bloco base ACTOR do padrão Screenplay + */ +export default class Agente extends ScreenplayItem { + /** + * Tentativa do ator em realizar alguma tarefa + * @param {*} tarefa - representa uma ou mais interação. + */ + tenta(tarefa) { + this.lancaExcecaoNaoImplementadoErro(`"tenta" realizar ${tarefa}`); + } +} diff --git a/cypress/support/screenplay/agente/Usuario.js b/cypress/support/screenplay/agente/Usuario.js new file mode 100644 index 0000000..e32c045 --- /dev/null +++ b/cypress/support/screenplay/agente/Usuario.js @@ -0,0 +1,18 @@ +import Agente from "./Agente"; +/** + * @class Usuario. + * @classdesc Usuario da página, extendendo as caracteristicas de um Agente + */ +export class Usuario extends Agente { + /** + * Define o nome do usuário. + * @param {string} nome + */ + chamado(nome = "Usuario") { + this.nome = nome; + } + + tenta(tarefas) { + tarefas; + } +} diff --git a/cypress/support/screenplay/agente/index.js b/cypress/support/screenplay/agente/index.js new file mode 100644 index 0000000..abf2c5c --- /dev/null +++ b/cypress/support/screenplay/agente/index.js @@ -0,0 +1,2 @@ +export * from "./Usuario.js"; +export * from "./Agente.js"; diff --git a/cypress/support/screenplay/dado-quando-entao/DadoQuandoEntao.js b/cypress/support/screenplay/dado-quando-entao/DadoQuandoEntao.js new file mode 100644 index 0000000..c228334 --- /dev/null +++ b/cypress/support/screenplay/dado-quando-entao/DadoQuandoEntao.js @@ -0,0 +1,73 @@ +import Agente from "../agente"; //eslint-disable-line +import Tarefa from "../tarefa"; //eslint-disable-line +import { ScreenplayItem } from "../ScreenplayItem"; + +/** + * @class DadoQuandoEntao + * @classdesc implementa os passos Dado, Quando e Então do Gherkin em conjunto com o padrão Screenplay. + */ +export class DadoQuandoEntao extends ScreenplayItem { + /** + * @constructor + * @param {Agente} agente + */ + constructor(agente) { + super(); + this.agente = agente; + } + /** + * Forma auxiliar que representa uma tentativa da realização de uma Tarefa por parte de um Agente. + * @param {...Tarefa} tarefas + */ + tenta(...tarefas) { + return this.composicaoDeTarefas(tarefas); + } + + /** + * Forma auxiliar que representa uma habilidade da realização de uma Tarefa por parte de um Agente. + * @param {...Tarefa} tarefas + */ + pode(...tarefas) { + return this.composicaoDeTarefas(tarefas); + } + + /** + * Forma auxiliar que representa uma asserção sobre a realização de uma Tarefa por parte de um Agente. + * @param {...Tarefa} tarefas + */ + deve(...tarefas) { + return this.composicaoDeTarefas(tarefas); + } + + /** + * Método de composição de tarefas, executando-as em uma cadeia de Promises + * @param {...Tarefa} tarefas + */ + composicaoDeTarefas(...tarefas) { + const arrayTarefas = tarefas.flat(); + + for (const Tarefa of arrayTarefas) { + new Tarefa().executaComo(this.agente); + } + } +} +/** + * Implementação de uma cadeia de tarefas a partir do passo "DADO" + * @param {Agente} agente + */ +export const dado = agente => new DadoQuandoEntao(agente); +/** + * Implementação de uma cadeia de tarefas a partir do passo "QUANDO" + * @param {Agente} agente + */ +export const quando = agente => new DadoQuandoEntao(agente); +/** + * Implementação de uma cadeia de tarefas a partir do passo "ENTÃO" + * @param {Agente} agente + */ +export const entao = agente => new DadoQuandoEntao(agente); +/** + * Implementação de uma cadeia de tarefas a partir do passo "E"/"AND" + * @param {Agente} agente + */ +export const e = agente => new DadoQuandoEntao(agente); diff --git a/cypress/support/screenplay/dado-quando-entao/index.js b/cypress/support/screenplay/dado-quando-entao/index.js new file mode 100644 index 0000000..77c226a --- /dev/null +++ b/cypress/support/screenplay/dado-quando-entao/index.js @@ -0,0 +1 @@ +export * from "./DadoQuandoEntao"; diff --git a/cypress/support/screenplay/index.js b/cypress/support/screenplay/index.js new file mode 100644 index 0000000..f50637b --- /dev/null +++ b/cypress/support/screenplay/index.js @@ -0,0 +1,4 @@ +export * from "./tarefa"; +export * from "./agente"; +export * from "./utils"; +export * from "./dado-quando-entao"; diff --git a/cypress/support/screenplay/tarefa/Tarefa.js b/cypress/support/screenplay/tarefa/Tarefa.js new file mode 100644 index 0000000..c688c98 --- /dev/null +++ b/cypress/support/screenplay/tarefa/Tarefa.js @@ -0,0 +1,17 @@ +import Agente from "../agente/Agente"; //eslint-disable-line +import { ScreenplayItem } from "../ScreenplayItem"; + +/** + * @class Tarefa é um conjunto de interações que representam passos de uma lógica de negócios que um Agente pode tentar realizar. + */ +export default class Tarefa extends ScreenplayItem { + /** + * Método de toda tarefa que é executada. + * @param {Agente} agente + * @returns {Agente} agente + */ + async executaComo(agente) { + this.lancaExcecaoNaoImplementadoErro(`"executaComo" um ${agente}`); + return agente; + } +} diff --git a/cypress/support/screenplay/tarefa/index.js b/cypress/support/screenplay/tarefa/index.js new file mode 100644 index 0000000..647a62f --- /dev/null +++ b/cypress/support/screenplay/tarefa/index.js @@ -0,0 +1 @@ +export { default as Tarefa } from "./Tarefa"; diff --git a/cypress/support/screenplay/utils/index.js b/cypress/support/screenplay/utils/index.js new file mode 100644 index 0000000..f7a69fd --- /dev/null +++ b/cypress/support/screenplay/utils/index.js @@ -0,0 +1 @@ +export * from "./naoImplementado.error"; diff --git a/cypress/support/screenplay/utils/naoImplementado.error.js b/cypress/support/screenplay/utils/naoImplementado.error.js new file mode 100644 index 0000000..43eaa36 --- /dev/null +++ b/cypress/support/screenplay/utils/naoImplementado.error.js @@ -0,0 +1,13 @@ +/** + * Class que representa o erro de não haver implementado determinado método. + */ +export class NaoImplementadoErro extends Error { + /** + * @constructor + * @param {string} nomeMetodo + * @param {string} nomeClasse + */ + constructor(nomeMetodo, nomeClasse) { + super(`"${nomeClasse}" NAO implementou o metodo "${nomeMetodo}"`); + } +} diff --git a/package-lock.json b/package-lock.json index b2191be..0883670 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,93 @@ { "name": "cypress-with-patterns", - "version": "0.0.1", + "version": "1.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true + }, "@cypress/listr-verbose-renderer": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", @@ -101,6 +185,12 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/sinonjs__fake-timers": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz", @@ -113,6 +203,36 @@ "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, "ajv": { "version": "6.12.5", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", @@ -207,6 +327,12 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", @@ -313,6 +439,12 @@ "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -325,6 +457,15 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -347,6 +488,12 @@ } } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -375,6 +522,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, "cli-cursor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -427,6 +580,12 @@ } } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -562,6 +721,12 @@ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -586,6 +751,19 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -679,6 +857,18 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -700,6 +890,15 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -731,6 +930,30 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.17.6", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", @@ -802,67 +1025,334 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "eventemitter2": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", - "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==", - "dev": true - }, - "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "mimic-fn": "^2.1.0" + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "pify": "^2.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==", + "dev": true + }, + "execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -910,6 +1400,12 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -929,6 +1425,15 @@ "object-assign": "^4.1.0" } }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -948,6 +1453,15 @@ "path-exists": "^4.0.0" } }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -957,6 +1471,34 @@ "is-buffer": "~2.0.3" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1011,12 +1553,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1076,6 +1630,15 @@ "ini": "^1.3.5" } }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -1157,6 +1720,55 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, + "husky": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz", + "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^7.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -1185,12 +1797,108 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, "is-arguments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1270,6 +1978,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, "is-observable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", @@ -1306,6 +2020,12 @@ "has-symbols": "^1.0.1" } }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, "is-set": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", @@ -1389,12 +2109,69 @@ "esprima": "^4.0.0" } }, + "js2xmlparser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.1.tgz", + "integrity": "sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.3" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdoc": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz", + "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.9.4", + "bluebird": "^3.7.2", + "catharsis": "^0.8.11", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.1", + "klaw": "^3.0.0", + "markdown-it": "^10.0.0", + "markdown-it-anchor": "^5.2.7", + "marked": "^0.8.2", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.10.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -1407,6 +2184,12 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -1435,12 +2218,114 @@ "verror": "1.10.0" } }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", "dev": true }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lint-staged": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.0.tgz", + "integrity": "sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "commander": "^6.0.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "enquirer": "^2.3.6", + "execa": "^4.0.3", + "listr2": "^2.6.0", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "commander": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", + "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "listr": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", @@ -1620,7 +2505,180 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^3.0.0" + } + } + } + }, + "listr2": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz", + "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cli-truncate": "^2.1.0", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.2", + "through": "^2.3.8" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -1735,12 +2793,53 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true + }, + "marked": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", + "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", @@ -2149,6 +3248,24 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2221,12 +3338,38 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, "ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", @@ -2263,6 +3406,27 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2281,6 +3445,12 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -2305,6 +3475,75 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, "pretty-bytes": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.4.1.tgz", @@ -2317,6 +3556,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise.allsettled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", @@ -2428,6 +3673,12 @@ "picomatch": "^2.2.1" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -2449,6 +3700,21 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", @@ -2468,6 +3734,12 @@ "glob": "^7.1.3" } }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -2489,6 +3761,24 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -2525,6 +3815,12 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", @@ -2554,6 +3850,12 @@ "tweetnacl": "~0.14.0" } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -2619,6 +3921,17 @@ } } }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -2655,6 +3968,99 @@ "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, "tcomb": { "version": "3.2.29", "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", @@ -2670,12 +4076,24 @@ "tcomb": "^3.0.0" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -2725,12 +4143,39 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "underscore": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", + "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", + "dev": true + }, "universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -2782,6 +4227,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, "validator": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", @@ -2814,6 +4265,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -2856,6 +4313,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "workerpool": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", @@ -2911,12 +4374,33 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "xmlcreate": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz", + "integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ==", + "dev": true + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/package.json b/package.json index 04b2681..8191d78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cypress-with-patterns", - "version": "1.0.0", + "version": "2.0.0", "description": "Playing with Cypress and implementing patterns Page Objects and Screenplay", "main": "index.js", "scripts": { @@ -12,6 +12,13 @@ "reports:remove-stdout": "rm -rf results/reports-mochawesome", "cy:report": "npm run cy:run && npm run reports:merge && npm run reports:generate && npm run reports:remove-stdout" }, + "lint-staged": { + "cypress/**/*.js": [ + "eslint --ext .js", + "prettier --write", + "git add" + ] + }, "repository": { "type": "git", "url": "git+https://github.com/thiagojacinto/cypress-with-patterns.git" @@ -31,9 +38,19 @@ "homepage": "https://github.com/thiagojacinto/cypress-with-patterns#readme", "devDependencies": { "cypress": "^5.3.0", + "eslint": "^6.8.0", + "husky": "^4.3.0", + "jsdoc": "^3.6.6", + "lint-staged": "^10.4.0", "mocha": "^8.1.3", "mochawesome": "^6.1.1", "mochawesome-merge": "^4.2.0", - "mochawesome-report-generator": "^5.1.0" + "mochawesome-report-generator": "^5.1.0", + "prettier": "^1.19.1" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } } } diff --git a/results/reports-output/output.html b/results/reports-output/output.html index 8cfdba1..55592ab 100644 --- a/results/reports-output/output.html +++ b/results/reports-output/output.html @@ -1,2 +1,2 @@ -Mochawesome Report
\ No newline at end of file +Mochawesome Report
\ No newline at end of file diff --git a/results/reports-output/output.json b/results/reports-output/output.json index e450ebc..47054d3 100644 --- a/results/reports-output/output.json +++ b/results/reports-output/output.json @@ -1,15 +1,15 @@ { "stats": { - "suites": 2, - "tests": 7, - "passes": 7, + "suites": 4, + "tests": 14, + "passes": 13, "pending": 0, - "failures": 0, - "start": "2020-10-01T16:56:01.749Z", - "end": "2020-10-01T16:56:17.946Z", - "duration": 14176, - "testsRegistered": 7, - "passPercent": 100, + "failures": 1, + "start": "2020-10-05T18:41:24.631Z", + "end": "2020-10-05T18:43:23.921Z", + "duration": 30970, + "testsRegistered": 14, + "passPercent": 92.85714285714286, "pendingPercent": 0, "other": 0, "hasOther": false, @@ -18,16 +18,16 @@ }, "results": [ { - "uuid": "444b25fa-2d4a-4e44-ad73-370d52a72a71", + "uuid": "220d06ef-5f59-4636-8239-a28f33cd6445", "title": "", - "fullFile": "cypress/integration/page-objects/adicionar.spec.js", - "file": "cypress/integration/page-objects/adicionar.spec.js", + "fullFile": "cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js", + "file": "cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js", "beforeHooks": [], "afterHooks": [], "tests": [], "suites": [ { - "uuid": "ad32e1d9-2e34-4d0c-ab50-81f9125a796f", + "uuid": "55f7f845-a06c-4bf0-993b-ec61bd829023", "title": "Adicionar", "fullFile": "", "file": "", @@ -38,67 +38,67 @@ "title": "Adicionar repositório a lista", "fullTitle": "Adicionar Adicionar repositório a lista", "timedOut": null, - "duration": 3418, + "duration": 2954, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].inserir(\"thiagojacinto/es6-review\");\n_Home[\"default\"].clicarAdicionar();\n_Home[\"default\"].selecionarLista().children().should(\"contain.text\", \"es6-review\");\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 1);", + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.ExibirLista);", "err": {}, - "uuid": "8882e482-30b1-4fd8-9852-526c6df9abf7", - "parentUUID": "ad32e1d9-2e34-4d0c-ab50-81f9125a796f", + "uuid": "a3f0177b-a047-45ee-a616-ad87ea803b2a", + "parentUUID": "55f7f845-a06c-4bf0-993b-ec61bd829023", "isHook": false, "skipped": false }, { - "title": "Adicionar mais de um repositório", - "fullTitle": "Adicionar Adicionar mais de um repositório", + "title": "Adicionar mais de um repositório a lista", + "fullTitle": "Adicionar Adicionar mais de um repositório a lista", "timedOut": null, - "duration": 2469, + "duration": 2376, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].inserir(\"thiagojacinto/es6-review\");\n_Home[\"default\"].clicarAdicionar();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 1);\n_Home[\"default\"].inserir(\"cypress-io/cypress-example-recipes\");\n_Home[\"default\"].clicarAdicionar();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 2);\n_Home[\"default\"].inserir(\"rust-lang/rust\");\n_Home[\"default\"].clicarAdicionar();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 3);", + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.e)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.e)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.ExibirListaContendoTres);", "err": {}, - "uuid": "a0ac8367-0317-4b03-a559-8ad10676df47", - "parentUUID": "ad32e1d9-2e34-4d0c-ab50-81f9125a796f", + "uuid": "886e6554-b64e-4fe3-b1d6-b7bdd909247c", + "parentUUID": "55f7f845-a06c-4bf0-993b-ec61bd829023", "isHook": false, "skipped": false }, { - "title": "Tentar adicionar sem inserir nome", - "fullTitle": "Adicionar Tentar adicionar sem inserir nome", + "title": "Tentar adicionar sem informar nome", + "fullTitle": "Adicionar Tentar adicionar sem informar nome", "timedOut": null, - "duration": 275, + "duration": 402, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].clicarAdicionar();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 0);", + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.AdicionarValorVazio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.VisualizarListaVazia);", "err": {}, - "uuid": "7c4be5a1-3c70-43d8-aad3-98955a5c2155", - "parentUUID": "ad32e1d9-2e34-4d0c-ab50-81f9125a796f", + "uuid": "006117df-acdf-494b-9e87-ce666dadac63", + "parentUUID": "55f7f845-a06c-4bf0-993b-ec61bd829023", "isHook": false, "skipped": false } ], "suites": [], "passes": [ - "8882e482-30b1-4fd8-9852-526c6df9abf7", - "a0ac8367-0317-4b03-a559-8ad10676df47", - "7c4be5a1-3c70-43d8-aad3-98955a5c2155" + "a3f0177b-a047-45ee-a616-ad87ea803b2a", + "886e6554-b64e-4fe3-b1d6-b7bdd909247c", + "006117df-acdf-494b-9e87-ce666dadac63" ], "failures": [], "pending": [], "skipped": [], - "duration": 6162, + "duration": 5732, "root": false, "rootEmpty": false, "_timeout": 2000 @@ -114,16 +114,16 @@ "_timeout": 2000 }, { - "uuid": "31b6a66a-6647-4adb-8f4e-c02737fe08a2", + "uuid": "2e606136-dd16-4d35-a334-3474b6d4f3a9", "title": "", - "fullFile": "cypress/integration/page-objects/remover.spec.js", - "file": "cypress/integration/page-objects/remover.spec.js", + "fullFile": "cypress/integration/screenplay/remover/remover.screenplay.spec.js", + "file": "cypress/integration/screenplay/remover/remover.screenplay.spec.js", "beforeHooks": [], "afterHooks": [], "tests": [], "suites": [ { - "uuid": "5b13a61e-e3bc-4544-8633-88d48c04cc18", + "uuid": "4304209b-1fb1-4caf-bb3a-215d9dff9d16", "title": "Remover", "fullFile": "", "file": "", @@ -134,25 +134,25 @@ "title": "Tentar limpar uma lista vazia", "fullTitle": "Remover Tentar limpar uma lista vazia", "timedOut": null, - "duration": 600, + "duration": 487, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].acessar();\n_Home[\"default\"].limparLista();\n_Home[\"default\"].selecionarItemsDaLista().should(\"not.exist\");", + "code": "dado(usuario).deve(AcessarHome);\nquando(usuario).tenta(LimparLista);\nentao(usuario).deve(VisualizarListaVazia);", "err": {}, - "uuid": "eada4f29-4f2b-4649-8e91-34c5977adb4c", - "parentUUID": "5b13a61e-e3bc-4544-8633-88d48c04cc18", + "uuid": "6aeafeab-5847-4fcd-8f63-759822550477", + "parentUUID": "4304209b-1fb1-4caf-bb3a-215d9dff9d16", "isHook": false, "skipped": false } ], "suites": [ { - "uuid": "7f99cc9f-422e-4ad0-ad8c-ce565159a35c", - "title": "Lista com itens na home", + "uuid": "3eea607e-6d0e-4302-9a67-61f9fdb27dfd", + "title": "Lista com items", "fullFile": "", "file": "", "beforeHooks": [], @@ -160,81 +160,318 @@ "tests": [ { "title": "Remover um dos repositórios da lista", - "fullTitle": "Remover Lista com itens na home Remover um dos repositórios da lista", + "fullTitle": "Remover Lista com items Remover um dos repositórios da lista", "timedOut": null, - "duration": 2469, + "duration": 6441, + "state": "failed", + "speed": null, + "pass": false, + "fail": true, + "pending": false, + "context": null, + "code": "quando(usuario).tenta(RemoverItem);\nentao(usuario).deve(EsperarListaContendoDoisItens);", + "err": { + "message": "AssertionError: Timed out retrying: Not enough elements found. Found '1', expected '2'.", + "estack": "AssertionError: Timed out retrying: Not enough elements found. Found '1', expected '2'.\n at EsperarListaContendoDoisItens.executaComo (https://repo-listing.web.app/__cypress/tests?p=cypress/integration/screenplay/remover/remover.screenplay.spec.js:1555:10)\n at DadoQuandoEntao.composicaoDeTarefas (https://repo-listing.web.app/__cypress/tests?p=cypress/integration/screenplay/remover/remover.screenplay.spec.js:2602:25)\n at DadoQuandoEntao.deve (https://repo-listing.web.app/__cypress/tests?p=cypress/integration/screenplay/remover/remover.screenplay.spec.js:2580:19)\n at Context.eval (https://repo-listing.web.app/__cypress/tests?p=cypress/integration/screenplay/remover/remover.screenplay.spec.js:2227:22)", + "diff": "- 1\n+ 2\n" + }, + "uuid": "d0722bfd-301a-4d1a-b60a-81eab6cd3b89", + "parentUUID": "3eea607e-6d0e-4302-9a67-61f9fdb27dfd", + "isHook": false, + "skipped": false + }, + { + "title": "Remover mais de um dos repositórios da lista", + "fullTitle": "Remover Lista com items Remover mais de um dos repositórios da lista", + "timedOut": null, + "duration": 2618, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "quando(usuario).tenta(RemoverItem);\ne(usuario).tenta(RemoverItem);\nentao(usuario).deve(EsperarListaContendoUmItem);", + "err": {}, + "uuid": "63c97f09-ba12-4906-8997-2dd09f3f75fd", + "parentUUID": "3eea607e-6d0e-4302-9a67-61f9fdb27dfd", + "isHook": false, + "skipped": false + }, + { + "title": "Limpar a lista", + "fullTitle": "Remover Lista com items Limpar a lista", + "timedOut": null, + "duration": 2680, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "quando(usuario).tenta(LimparLista);\nentao(usuario).deve(VisualizarListaVazia);", + "err": {}, + "uuid": "94428f0d-a0dc-4aed-bc9b-d83e2ee9237b", + "parentUUID": "3eea607e-6d0e-4302-9a67-61f9fdb27dfd", + "isHook": false, + "skipped": false + } + ], + "suites": [], + "passes": [ + "63c97f09-ba12-4906-8997-2dd09f3f75fd", + "94428f0d-a0dc-4aed-bc9b-d83e2ee9237b" + ], + "failures": [ + "d0722bfd-301a-4d1a-b60a-81eab6cd3b89" + ], + "pending": [], + "skipped": [], + "duration": 11739, + "root": false, + "rootEmpty": false, + "_timeout": 2000 + } + ], + "passes": [ + "6aeafeab-5847-4fcd-8f63-759822550477" + ], + "failures": [], + "pending": [], + "skipped": [], + "duration": 487, + "root": false, + "rootEmpty": false, + "_timeout": 2000 + } + ], + "passes": [], + "failures": [], + "pending": [], + "skipped": [], + "duration": 0, + "root": true, + "rootEmpty": true, + "_timeout": 2000 + }, + { + "uuid": "b62bc4e1-37fc-4a5c-a3ce-a3c22ba65a64", + "title": "", + "fullFile": "cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js", + "file": "cypress/integration/screenplay/adicionar/adicionar.screenplay.spec.js", + "beforeHooks": [], + "afterHooks": [], + "tests": [], + "suites": [ + { + "uuid": "f6486b03-9e9d-4860-bf74-191418a4201c", + "title": "Adicionar", + "fullFile": "", + "file": "", + "beforeHooks": [], + "afterHooks": [], + "tests": [ + { + "title": "Adicionar repositório a lista", + "fullTitle": "Adicionar Adicionar repositório a lista", + "timedOut": null, + "duration": 2337, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.ExibirLista);", + "err": {}, + "uuid": "d1141abc-f8a3-4ebb-854c-bfd6545f94b9", + "parentUUID": "f6486b03-9e9d-4860-bf74-191418a4201c", + "isHook": false, + "skipped": false + }, + { + "title": "Adicionar mais de um repositório a lista", + "fullTitle": "Adicionar Adicionar mais de um repositório a lista", + "timedOut": null, + "duration": 2178, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.e)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.e)(usuario).tenta(_Tarefas.InserirNovoRepositorio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.ExibirListaContendoTres);", + "err": {}, + "uuid": "7bee2e5c-62c6-4ddb-98bf-123957332fc3", + "parentUUID": "f6486b03-9e9d-4860-bf74-191418a4201c", + "isHook": false, + "skipped": false + }, + { + "title": "Tentar adicionar sem informar nome", + "fullTitle": "Adicionar Tentar adicionar sem informar nome", + "timedOut": null, + "duration": 366, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "(0, _screenplay.quando)(usuario).tenta(_Tarefas.AdicionarValorVazio);\n(0, _screenplay.entao)(usuario).deve(_Tarefas.VisualizarListaVazia);", + "err": {}, + "uuid": "c07b1877-5bd6-4aa9-9be3-a0c036d8e412", + "parentUUID": "f6486b03-9e9d-4860-bf74-191418a4201c", + "isHook": false, + "skipped": false + } + ], + "suites": [], + "passes": [ + "d1141abc-f8a3-4ebb-854c-bfd6545f94b9", + "7bee2e5c-62c6-4ddb-98bf-123957332fc3", + "c07b1877-5bd6-4aa9-9be3-a0c036d8e412" + ], + "failures": [], + "pending": [], + "skipped": [], + "duration": 4881, + "root": false, + "rootEmpty": false, + "_timeout": 2000 + } + ], + "passes": [], + "failures": [], + "pending": [], + "skipped": [], + "duration": 0, + "root": true, + "rootEmpty": true, + "_timeout": 2000 + }, + { + "uuid": "7a1eb614-63de-4a07-864d-3c2b6c123cbc", + "title": "", + "fullFile": "cypress/integration/screenplay/remover/remover.screenplay.spec.js", + "file": "cypress/integration/screenplay/remover/remover.screenplay.spec.js", + "beforeHooks": [], + "afterHooks": [], + "tests": [], + "suites": [ + { + "uuid": "13967a03-6bb0-43f6-b552-e17f9084aab6", + "title": "Remover", + "fullFile": "", + "file": "", + "beforeHooks": [], + "afterHooks": [], + "tests": [ + { + "title": "Tentar limpar uma lista vazia", + "fullTitle": "Remover Tentar limpar uma lista vazia", + "timedOut": null, + "duration": 489, + "state": "passed", + "speed": "slow", + "pass": true, + "fail": false, + "pending": false, + "context": null, + "code": "dado(usuario).deve(AcessarHome);\nquando(usuario).tenta(LimparLista);\nentao(usuario).deve(VisualizarListaVazia);", + "err": {}, + "uuid": "3fbfa5d5-5aa0-4124-b1c8-c0bdd90b88de", + "parentUUID": "13967a03-6bb0-43f6-b552-e17f9084aab6", + "isHook": false, + "skipped": false + } + ], + "suites": [ + { + "uuid": "c7b6ff6a-9239-4652-b787-d8337f931581", + "title": "Lista com items", + "fullFile": "", + "file": "", + "beforeHooks": [], + "afterHooks": [], + "tests": [ + { + "title": "Remover um dos repositórios da lista", + "fullTitle": "Remover Lista com items Remover um dos repositórios da lista", + "timedOut": null, + "duration": 2528, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].removerPrimeiroItem();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 2);", + "code": "quando(usuario).tenta(RemoverItem);\nentao(usuario).deve(EsperarListaContendoDoisItens);", "err": {}, - "uuid": "601540ce-311c-4f1e-aeed-c068f10b0716", - "parentUUID": "7f99cc9f-422e-4ad0-ad8c-ce565159a35c", + "uuid": "72cb17e2-9c1e-4ce0-a056-5b59bb42cc22", + "parentUUID": "c7b6ff6a-9239-4652-b787-d8337f931581", "isHook": false, "skipped": false }, { "title": "Remover mais de um dos repositórios da lista", - "fullTitle": "Remover Lista com itens na home Remover mais de um dos repositórios da lista", + "fullTitle": "Remover Lista com items Remover mais de um dos repositórios da lista", "timedOut": null, - "duration": 2614, + "duration": 2418, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].removerPrimeiroItem();\n_Home[\"default\"].removerPrimeiroItem();\n_Home[\"default\"].selecionarItemsDaLista().should(\"have.length\", 1);", + "code": "quando(usuario).tenta(RemoverItem);\ne(usuario).tenta(RemoverItem);\nentao(usuario).deve(EsperarListaContendoUmItem);", "err": {}, - "uuid": "6d306291-cac6-45cc-be67-a73fa145edd2", - "parentUUID": "7f99cc9f-422e-4ad0-ad8c-ce565159a35c", + "uuid": "df690715-35c0-4c7e-893e-ed9df4fc982c", + "parentUUID": "c7b6ff6a-9239-4652-b787-d8337f931581", "isHook": false, "skipped": false }, { "title": "Limpar a lista", - "fullTitle": "Remover Lista com itens na home Limpar a lista", + "fullTitle": "Remover Lista com items Limpar a lista", "timedOut": null, - "duration": 2331, + "duration": 2696, "state": "passed", "speed": "slow", "pass": true, "fail": false, "pending": false, "context": null, - "code": "_Home[\"default\"].limparLista();\n_Home[\"default\"].selecionarItemsDaLista().should(\"not.exist\");", + "code": "quando(usuario).tenta(LimparLista);\nentao(usuario).deve(VisualizarListaVazia);", "err": {}, - "uuid": "298e3b23-274e-4169-b77f-78443a5782be", - "parentUUID": "7f99cc9f-422e-4ad0-ad8c-ce565159a35c", + "uuid": "36df5f98-d272-4db2-a582-6e4b685eb060", + "parentUUID": "c7b6ff6a-9239-4652-b787-d8337f931581", "isHook": false, "skipped": false } ], "suites": [], "passes": [ - "601540ce-311c-4f1e-aeed-c068f10b0716", - "6d306291-cac6-45cc-be67-a73fa145edd2", - "298e3b23-274e-4169-b77f-78443a5782be" + "72cb17e2-9c1e-4ce0-a056-5b59bb42cc22", + "df690715-35c0-4c7e-893e-ed9df4fc982c", + "36df5f98-d272-4db2-a582-6e4b685eb060" ], "failures": [], "pending": [], "skipped": [], - "duration": 7414, + "duration": 7642, "root": false, "rootEmpty": false, "_timeout": 2000 } ], "passes": [ - "eada4f29-4f2b-4649-8e91-34c5977adb4c" + "3fbfa5d5-5aa0-4124-b1c8-c0bdd90b88de" ], "failures": [], "pending": [], "skipped": [], - "duration": 600, + "duration": 489, "root": false, "rootEmpty": false, "_timeout": 2000