├── .gitignore
├── README.md
├── backend
├── .gitignore
├── knexfile.js
├── package-lock.json
├── package.json
├── src
│ ├── controllers
│ │ ├── IncidentController.js
│ │ ├── OngController.js
│ │ ├── ProfileController.js
│ │ └── SessionController.js
│ ├── database
│ │ ├── connection.js
│ │ ├── db.sqlite
│ │ └── migrations
│ │ │ ├── 20200327202114_create_ongs.js
│ │ │ └── 20200327202618_create_incidents.js
│ ├── index.js
│ └── routes.js
└── yarn.lock
├── cypress.json
├── cypress
├── integration
│ └── ongs.spec.js
├── plugins
│ └── index.js
└── support
│ ├── commands.js
│ └── index.js
├── frontend
├── .gitignore
├── cypress.json
├── cypress
│ ├── fixtures
│ │ ├── data.json
│ │ ├── example.json
│ │ ├── ongId.json
│ │ └── ongRegistered.json
│ ├── integration
│ │ └── ongs.spec.js
│ ├── plugins
│ │ └── index.js
│ ├── screenplay.md
│ └── support
│ │ ├── commands.js
│ │ ├── index.js
│ │ ├── pages
│ │ ├── Logon.page.js
│ │ ├── NewIncident.page.js
│ │ ├── Profile.page.js
│ │ └── Register.page.js
│ │ ├── questions
│ │ └── TheOng.js
│ │ ├── tasks
│ │ ├── DoLogIn.js
│ │ ├── DoRegister.js
│ │ └── Start.js
│ │ └── utils.js
├── package.json
├── public
│ ├── favicon.ico
│ └── index.html
├── src
│ ├── App.js
│ ├── Header.js
│ ├── assets
│ │ ├── heroes.png
│ │ └── logo.svg
│ ├── global.css
│ ├── index.js
│ ├── pages
│ │ ├── Logon
│ │ │ ├── index.js
│ │ │ └── styles.css
│ │ ├── NewIncident
│ │ │ ├── index.js
│ │ │ └── styles.css
│ │ ├── Profile
│ │ │ ├── index.js
│ │ │ └── styles.css
│ │ └── Register
│ │ │ ├── index.js
│ │ │ └── styles.css
│ ├── routes.js
│ └── services
│ │ └── api.js
└── yarn.lock
├── package-lock.json
├── package.json
└── youtube-cypress.png
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/**/*
2 | npm-debug.*
3 |
4 | # macOS
5 | .DS_Store
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
Cypress: do zero ao reporte
2 | Um projeto para aprender sobre o Cypress no Youtube
3 |
4 | ------------
5 |
6 | [](http://hits.dwyl.com/samlucax/youtube-cypress)
7 |
8 | 
9 |
10 | ## TL;TR;
11 | > **Chegou agora e quer ir direto para o código da primeira aula? [Clique aqui](https://github.com/samlucax/youtube-cypress/tree/video1), e depois faça clone do repositório. Bons estudos.**
12 |
13 | ------------
14 |
15 | ## Um curso quase gratuito - custa só uma ⭐️ aqui no repositório
16 |
17 | O *Cypress: do zero ao reporte* é uma série de vídeos para quem deseja aprender sobre Cypress na prática. Seguindo uma sequência lógica de conteúdos, o projeto vai desde o mais básico que é a criação do projeto, mostrando problemas comuns e propostas de solução, melhorias de arquitetura com padrões de projeto e finalizando com a geração de relatórios para exibir o resultado dos testes. Toda a teoria e eventuais explicações são dadas a medida em que os problemas são resolvidos, sempre em pequenas porções. Todo o conteúdo é muito prático.
18 |
19 | Se você quer aprender sobre Cypress, colocar mais um projeto no Portfólio e elevar seus conhecimentos de forma gratuita, #bora.
20 |
21 | ## Vídeo aulas
22 |
23 | O conteúdo dos vídeos é organizado por branches, conforme a lista abaixo:
24 |
25 | > ⚡️ **Acesse os vídeos aqui**: [youtube-cypress](https://www.youtube.com/playlist?list=PLnUo-Rbc3jjyx5BVnG8MB7vNd5ecu2yP1 "youtube-cypress")
26 |
27 |
28 | - [Vídeo 1 - Cypress - passo a passo para criar o primeiro projeto e testes](https://github.com/samlucax/youtube-cypress/tree/video1 "Vídeo 1")
29 | - [Vídeo 2 - Cypress - adicionando mais testes, background login e data-cy](https://github.com/samlucax/youtube-cypress/tree/video2 "Vídeo 2")
30 | - [Vídeo 3 - Cypress - utilizando o Page Objects](https://github.com/samlucax/youtube-cypress/tree/video3 "Vídeo 3")
31 | - [Vídeo 4 - Cypress - adicionando relatório de testes com o Allure Reports Plugin](https://github.com/samlucax/youtube-cypress/tree/video4 "Vídeo 4")
32 |
33 |
34 | ## Resumo dos conteúdos abordados:
35 |
36 | - como criar um projeto node
37 | - como adicionar o Cypress ao projeto
38 | - como criar a estrutura de pastas padrão do Cypress
39 | - como executar os testes utilizando o Cypress Runner
40 | - como acessar uma página
41 | - como mapear elementos utilizando Cypress
42 | - como utilizar comandos comuns de digitar, clicar, etc.
43 | - como realizar asserções nos nossos testes
44 | - como criar comandos customizados para auxiliar no desenvolvimento
45 | - como fazer requisições para a api
46 | - como executar testes de forma independente
47 | - como configurar a aplicação testada para executar localmente
48 | - como criar um script para subir o Cypress de forma mais organizada
49 | - como manipular recursos do browser, como o localStorage
50 | - reforçar o padrão de testes independentes
51 | - como criar seletores dedicados para testes
52 | - qual problema o page objects se propõe a resolver
53 | - como criar uma estrutura simples para usar este padrão
54 | - como separar testes, ações e elementos da página
55 |
56 | ------------
57 |
58 | # Passo a passo para configurar o projeto
59 |
60 | #### Baixe o projeto no Github, de preferência na branch do Vídeo 1:
61 | - Branch do vídeo 1: `https://github.com/samlucax/youtube-cypress/tree/video1`
62 |
63 | #### Instale e suba nossa *cobaia* localmente
64 | 1.Acessar o diretório backend, instalar as dependências e iniciar a api:
65 | - `cd backend`
66 | - depois `npm install`
67 | - depois `npm start`
68 |
69 | 2.Acessar o diretório frontend, instalar as dependências e iniciar o site:
70 | - `cd frontend`
71 | - depois `npm install`
72 | - depois `npm start`
73 |
74 | #### Instale e abra o Cypress
75 | 3.Acessar o diretório root do projeto (que tem a pasta Cypress), instalar as dependências e abrir o Cypress Runner:
76 | - `npm install`
77 | - `./node_modules/.bin/cypress open`
78 |
79 | ## Deixe uma ⭐️ e espalhe esse conhecimento para o mundo
80 |
81 | Esse treinamento foi feito com muito empenho, carinho e principalmente, pensando em ajudar quem deseja iniciar em automação de testes.
82 | Se este conteúdo ajudou você ou você acredita que pode ajudar alguém #compartilhe esse projeto 🖤
83 |
84 | Ah, e deixe uma ⭐️ no repositório para nos apoiar ⚡️#boraagilizar
85 |
86 | ------------
87 |
88 | Ps.:
89 | Se quiser, apague o projeto do Cypress e tente fazer do zero acompanhando o vídeo. Bons estudos!
90 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/**/*
2 | npm-debug.*
3 |
4 | # macOS
5 | .DS_Store
6 |
--------------------------------------------------------------------------------
/backend/knexfile.js:
--------------------------------------------------------------------------------
1 | // Update with your config settings.
2 |
3 | module.exports = {
4 |
5 | development: {
6 | client: 'sqlite3',
7 | connection: {
8 | filename: './src/database/db.sqlite'
9 | },
10 | migrations: {
11 | directory: './src/database/migrations'
12 | },
13 | useNullAsDefault: true,
14 | },
15 |
16 | staging: {
17 | client: 'postgresql',
18 | connection: {
19 | database: 'my_db',
20 | user: 'username',
21 | password: 'password'
22 | },
23 | pool: {
24 | min: 2,
25 | max: 10
26 | },
27 | migrations: {
28 | tableName: 'knex_migrations'
29 | }
30 | },
31 |
32 | production: {
33 | client: 'postgresql',
34 | connection: {
35 | database: 'my_db',
36 | user: 'username',
37 | password: 'password'
38 | },
39 | pool: {
40 | min: 2,
41 | max: 10
42 | },
43 | migrations: {
44 | tableName: 'knex_migrations'
45 | }
46 | }
47 |
48 | };
49 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon src/index.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "cors": "^2.8.5",
14 | "express": "^4.17.1",
15 | "knex": "^0.20.13",
16 | "sqlite3": "^4.1.1"
17 | },
18 | "devDependencies": {
19 | "nodemon": "^2.0.2"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/backend/src/controllers/IncidentController.js:
--------------------------------------------------------------------------------
1 | const connection = require('../database/connection');
2 |
3 | module.exports = {
4 | async index(request, response) {
5 | const { page = 1 } = request.query;
6 |
7 | const [count] = await connection('incidents').count();
8 |
9 | console.log(count);
10 |
11 | const incidents = await connection('incidents')
12 | .join('ongs', 'ongs.id', '=', 'incidents.ong_id')
13 | .limit(5)
14 | .offset((page - 1) * 5)
15 | .select([
16 | 'incidents.*',
17 | 'ongs.name',
18 | 'ongs.email',
19 | 'ongs.whatsapp',
20 | 'ongs.city',
21 | 'ongs.uf']);
22 |
23 | response.header('X-Total-Count', count['count(*)']);
24 |
25 | return response.json(incidents);
26 | },
27 |
28 | async create(request, response) {
29 | const { title, description, value } = request.body;
30 |
31 | const ong_id = request.headers.authorization;
32 |
33 | const [id] = await connection('incidents').insert({
34 | title,
35 | description,
36 | value,
37 | ong_id,
38 | });
39 |
40 | return response.json({ id });
41 | },
42 |
43 | async delete(request, response) {
44 | const { id } = request.params;
45 | const ong_id = request.headers.authorization;
46 |
47 | const incident = await connection('incidents')
48 | .where('id', id)
49 | .select('ong_id')
50 | .first();
51 |
52 | if(incident.ong_id != ong_id) {
53 | return response.status(401).json({ error: 'Operation not permited' });
54 | }
55 |
56 | await connection('incidents').where('id', id).delete();
57 |
58 | return response.status(204).send();
59 | }
60 |
61 | };
--------------------------------------------------------------------------------
/backend/src/controllers/OngController.js:
--------------------------------------------------------------------------------
1 | const crypto = require('crypto');
2 | const connection = require('../database/connection');
3 |
4 | module.exports = {
5 | async index(request, response) {
6 | const ongs = await connection('ongs').select('*');
7 |
8 | return response.json(ongs);
9 | },
10 |
11 | async create(request, response) {
12 | const { name, email, whatsapp, city, uf } = request.body;
13 |
14 | const id = crypto.randomBytes(4).toString('HEX');
15 |
16 | //conexao com o banco de dados
17 | await connection('ongs').insert({
18 | id,
19 | name,
20 | email,
21 | whatsapp,
22 | city,
23 | uf,
24 | })
25 |
26 | return response.json({ id });
27 | }
28 | };
--------------------------------------------------------------------------------
/backend/src/controllers/ProfileController.js:
--------------------------------------------------------------------------------
1 | const connection = require('../database/connection');
2 |
3 | module.exports = {
4 | async index(request, response) {
5 | const ong_id = request.headers.authorization;
6 |
7 | const incidents = await connection('incidents')
8 | .where('ong_id', ong_id)
9 | .select('*');
10 |
11 | return response.json(incidents);
12 | }
13 | }
--------------------------------------------------------------------------------
/backend/src/controllers/SessionController.js:
--------------------------------------------------------------------------------
1 | const connection = require('../database/connection');
2 |
3 | module.exports = {
4 | async create(request, response) {
5 | const { id } = request.body;
6 |
7 | const ong = await connection('ongs')
8 | .where('id', id)
9 | .select('name')
10 | .first();
11 |
12 | if(!ong) {
13 | return response.status(400).json({ error: 'No ONG found with this ID' });
14 | }
15 |
16 | return response.json(ong);
17 | }
18 | }
--------------------------------------------------------------------------------
/backend/src/database/connection.js:
--------------------------------------------------------------------------------
1 | const knex = require('knex');
2 | const configuration = require('../../knexfile');
3 |
4 | const connection = knex(configuration.development);
5 |
6 | module.exports = connection;
--------------------------------------------------------------------------------
/backend/src/database/db.sqlite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/backend/src/database/db.sqlite
--------------------------------------------------------------------------------
/backend/src/database/migrations/20200327202114_create_ongs.js:
--------------------------------------------------------------------------------
1 |
2 | exports.up = function(knex) {
3 | return knex.schema.createTable('ongs', function (table) {
4 | table.string('id').primary();
5 | table.string('name').notNullable();
6 | table.string('email').notNullable();
7 | table.string('whatsapp').notNullable();
8 | table.string('city').notNullable();
9 | table.string('uf', 2).notNullable();
10 | })
11 | };
12 |
13 | exports.down = function(knex) {
14 | return knex.schema.dropTable('ongs');
15 | };
16 |
--------------------------------------------------------------------------------
/backend/src/database/migrations/20200327202618_create_incidents.js:
--------------------------------------------------------------------------------
1 |
2 | exports.up = function(knex) {
3 | return knex.schema.createTable('incidents', function(table) {
4 | // incrementa
5 | table.increments();
6 |
7 | //campos do banco
8 | table.string('title').notNullable();
9 | table.string('description').notNullable();
10 | table.decimal('value').notNullable();
11 |
12 | //foreign key
13 | table.string('ong_id').notNullable();
14 |
15 | //relacionamento
16 | table.foreign('ong_id').references('id').inTable('ongs');
17 | });
18 | };
19 |
20 | exports.down = function(knex) {
21 | return knex.schema.dropTable('incidents');
22 | };
23 |
--------------------------------------------------------------------------------
/backend/src/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cors = require('cors');
3 | const routes = require('./routes');
4 | const app = express();
5 |
6 | // cors é o modulo de seguranca
7 | app.use(cors());
8 |
9 | //importante ser antes de todas as requisicoes, por isso esta no topo
10 | app.use(express.json());
11 | //importante ser depois da linha acima
12 | app.use(routes);
13 |
14 | app.listen(3333);
15 |
16 |
17 | /**
18 | * BTW: estou no min 40 - Migrations knex
19 | */
20 |
--------------------------------------------------------------------------------
/backend/src/routes.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const routes = express.Router();
3 |
4 | const OngController = require('./controllers/OngController');
5 | const IncidentController = require('./controllers/IncidentController');
6 | const ProfileController = require('./controllers/ProfileController');
7 | const SessionController = require('./controllers/SessionController');
8 |
9 |
10 | /**
11 | * Rota é o conjunto completo que será acessado
12 | * Recurso é a parte contextual, normalmente relacionado a banco de dados, objeto, etc
13 | */
14 |
15 | /**
16 | * Métodos HTTP (principais):
17 | *
18 | * GET: Buscar/Listar uma informação no backend
19 | * POST: Criar uma informação no backend
20 | * PUT: Alterar uma informação no backend
21 | * DELETE: Deletar uma informação no backend
22 | */
23 |
24 | /**
25 | * Tipos de parâmetros:
26 | *
27 | * Query Params: Parâmetros nomeados enviados na rota após "?" (Filtros, paginação)
28 | * Route Params: Parâmetros utilizados para identificar recursos
29 | * Request Body: Corpo da requisição, utilizado para criar ou alterar recursos
30 | */
31 |
32 | /**
33 | * SQL: MySQL, SQLite, PostgreSQL, Oracle, Microsoft SQL Server
34 | * NoSQL: MongoDB, CouchDB, etc.
35 | */
36 |
37 | /**
38 | * Driver: SELECT * FROM users
39 | * Query Builder: table('users').select('*').where()
40 | */
41 |
42 | routes.post('/sessions', SessionController.create);
43 |
44 | routes.get('/ongs', OngController.index);
45 | routes.post('/ongs', OngController.create);
46 |
47 | routes.get('/profile', ProfileController.index);
48 |
49 | routes.get('/incidents', IncidentController.index);
50 | routes.post('/incidents',IncidentController.create);
51 | routes.delete('/incidents/:id', IncidentController.delete);
52 |
53 |
54 | module.exports = routes;
--------------------------------------------------------------------------------
/cypress.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/cypress/integration/ongs.spec.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | describe('Ongs', () => {
4 | it('devem poder realizar um cadastro', () => {
5 | cy.visit('http://localhost:3000/register');
6 | // cy.get - busca um elemento
7 | // .type - insere um texto
8 | cy.get('[data-cy=name]').type('Dogs queridos');
9 | cy.get('[data-cy=email]').type('dogs@mail.com');
10 | cy.get('[data-cy=whatsapp]').type('51999999999');
11 | cy.get('[data-cy=city]').type('Porto Alegre');
12 | cy.get('[data-cy=uf]').type('RS');
13 |
14 | // routing
15 | // start server com cy.server()
16 | // criar uma rota com cy.route()
17 | // atribuir rota a um alias
18 | // esperar com cy.wait e fazer uma validação
19 |
20 | cy.route('POST', '**/ongs').as('postOng');
21 |
22 | cy.get('[data-cy=submit]').click();
23 |
24 | cy.wait('@postOng').then((xhr) => {
25 | expect(xhr.status).be.eq(200);
26 | expect(xhr.response.body).has.property('id');
27 | expect(xhr.response.body.id).is.not.null;
28 | });
29 |
30 | });
31 |
32 | it('deve poder realizar um login no sistema', () => {
33 | cy.visit('http://localhost:3000/');
34 | cy.get('input').type(Cypress.env('createdOngId'));
35 | cy.get('.button').click();
36 | });
37 | });
--------------------------------------------------------------------------------
/cypress/plugins/index.js:
--------------------------------------------------------------------------------
1 | ///
2 | // ***********************************************************
3 | // This example plugins/index.js can be used to load plugins
4 | //
5 | // You can change the location of this file or turn off loading
6 | // the plugins file with the 'pluginsFile' configuration option.
7 | //
8 | // You can read more here:
9 | // https://on.cypress.io/plugins-guide
10 | // ***********************************************************
11 |
12 | // This function is called when a project is opened or re-opened (e.g. due to
13 | // the project's config changing)
14 |
15 | /**
16 | * @type {Cypress.PluginConfig}
17 | */
18 | module.exports = (on, config) => {
19 | // `on` is used to hook into various events Cypress emits
20 | // `config` is the resolved Cypress config
21 | }
22 |
--------------------------------------------------------------------------------
/cypress/support/commands.js:
--------------------------------------------------------------------------------
1 | // ***********************************************
2 | // This example commands.js shows you how to
3 | // create various custom commands and overwrite
4 | // existing commands.
5 | //
6 | // For more comprehensive examples of custom
7 | // commands please read more here:
8 | // https://on.cypress.io/custom-commands
9 | // ***********************************************
10 | //
11 | //
12 | // -- This is a parent command --
13 | // Cypress.Commands.add("login", (email, password) => { ... })
14 | //
15 | //
16 | // -- This is a child command --
17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
18 | //
19 | //
20 | // -- This is a dual command --
21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
22 | //
23 | //
24 | // -- This will overwrite an existing command --
25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
26 |
27 | Cypress.Commands.add("createOng", () => {
28 | cy.request({
29 | method: 'POST',
30 | url: 'http://localhost:3333/ongs',
31 | body: {
32 | name: "Gatos queridos",
33 | email: "gatos@mail.com",
34 | whatsapp: "519999999999",
35 | city: "Porto Alegre",
36 | uf: "RS"
37 | }
38 | }).then(response => {
39 | expect(response.body.id).is.not.null;
40 | cy.log(response.body.id);
41 |
42 | Cypress.env('createdOngId', response.body.id);
43 | });
44 | })
--------------------------------------------------------------------------------
/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | // ***********************************************************
2 | // This example support/index.js is processed and
3 | // loaded automatically before your test files.
4 | //
5 | // This is a great place to put global configuration and
6 | // behavior that modifies Cypress.
7 | //
8 | // You can change the location of this file or turn off
9 | // automatically serving support files with the
10 | // 'supportFile' configuration option.
11 | //
12 | // You can read more here:
13 | // https://on.cypress.io/configuration
14 | // ***********************************************************
15 |
16 | // Import commands.js using ES2015 syntax:
17 | import './commands'
18 |
19 | // Alternatively you can use CommonJS syntax:
20 | // require('./commands')
21 |
22 | before(() => {
23 | // cy.server - para route e request
24 | cy.server();
25 | cy.createOng();
26 | });
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/frontend/cypress.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/frontend/cypress/fixtures/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "b30e8e1c"
3 | }
--------------------------------------------------------------------------------
/frontend/cypress/fixtures/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Using fixtures to represent data",
3 | "email": "hello@cypress.io",
4 | "body": "Fixtures are a great way to mock data for responses to routes"
5 | }
--------------------------------------------------------------------------------
/frontend/cypress/fixtures/ongId.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "62c41360"
3 | }
--------------------------------------------------------------------------------
/frontend/cypress/fixtures/ongRegistered.json:
--------------------------------------------------------------------------------
1 | {
2 | "id": "c3f0b6ef"
3 | }
--------------------------------------------------------------------------------
/frontend/cypress/integration/ongs.spec.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import * as Start from '../support/tasks/Start'
4 | import * as DoRegister from '../support/tasks/DoRegister'
5 | import * as DoLogIn from '../support/tasks/DoLogIn'
6 | import * as TheOng from '../support/questions/TheOng'
7 |
8 | describe('Ongs', () => {
9 | it('Devem poder realizar um cadastro', () => {
10 | Start.atRegisterPage();
11 | DoRegister.asOngNamed("Dogs Queridos");
12 | TheOng.receivedAnAccessIdWhenDone();
13 | });
14 |
15 | it('Deve poder realizar login no sistema', () => {
16 | Start.withARegisteredOng();
17 | Start.atLogonPage();
18 | DoLogIn.withTheRegisteredOng();
19 | });
20 |
21 | it.only('Devem poder visualizar casos cadastrados', () => {
22 | Start.atProfilePageLogged();
23 | });
24 |
25 | it('Devem poder cadastrar novos casos', () => {
26 |
27 | });
28 | });
--------------------------------------------------------------------------------
/frontend/cypress/plugins/index.js:
--------------------------------------------------------------------------------
1 | ///
2 | // ***********************************************************
3 | // This example plugins/index.js can be used to load plugins
4 | //
5 | // You can change the location of this file or turn off loading
6 | // the plugins file with the 'pluginsFile' configuration option.
7 | //
8 | // You can read more here:
9 | // https://on.cypress.io/plugins-guide
10 | // ***********************************************************
11 |
12 | // This function is called when a project is opened or re-opened (e.g. due to
13 | // the project's config changing)
14 |
15 | /**
16 | * @type {Cypress.PluginConfig}
17 | */
18 | module.exports = (on, config) => {
19 | // `on` is used to hook into various events Cypress emits
20 | // `config` is the resolved Cypress config
21 | }
22 |
--------------------------------------------------------------------------------
/frontend/cypress/screenplay.md:
--------------------------------------------------------------------------------
1 | ScreenPlay - Análise pré-implementação
2 |
3 | Atores
4 | - Ong
5 |
6 | Habilidades / Ações
7 | - preencher o formulário de autenticação
8 | - clicar no botão de entrar
9 | - clicar no botão de realizar novo cadastro
10 | - preencher o formulário de registro
11 | - clicar no botão de registrar-se
12 | - clicar no botão de cadastrar novo caso
13 | - preencher o formulário de cadastro de casos
14 | - clicar no botão para apagar um caso
15 | - clicar no botão de logout
16 |
17 | Tarefas
18 | - Autenticar com sua id
19 | - Registrar-se
20 | - Cadastrar novo caso
21 | - Apagar um caso
22 | - Visualizar os casos na tela
23 |
24 | Questões
25 | - recebi um id para autenticação?
26 | - estou na homepage?
27 | - o caso cadastrado foi listado?
28 | - o caso apagado aparece na listagem?
29 |
30 |
31 | ---
32 |
33 |
34 | https://docs.cypress.io/api/commands/visit.html#Options
35 |
36 | cy.visit('http://localhost:3000/#dashboard', {
37 | onBeforeLoad: (contentWindow) => {
38 | // contentWindow is the remote page's window object
39 | }
40 | })
41 |
42 | usar fixture como request body
43 | https://github.com/cypress-io/cypress/issues/3387
44 |
45 | cypress para component unit testing - react
46 | https://github.com/bahmutov/cypress-react-unit-test
--------------------------------------------------------------------------------
/frontend/cypress/support/commands.js:
--------------------------------------------------------------------------------
1 | // ***********************************************
2 | // This example commands.js shows you how to
3 | // create various custom commands and overwrite
4 | // existing commands.
5 | //
6 | // For more comprehensive examples of custom
7 | // commands please read more here:
8 | // https://on.cypress.io/custom-commands
9 | // ***********************************************
10 | //
11 | //
12 | // -- This is a parent command --
13 | // Cypress.Commands.add("login", (email, password) => { ... })
14 | //
15 | //
16 | // -- This is a child command --
17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
18 | //
19 | //
20 | // -- This is a dual command --
21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
22 | //
23 | //
24 | // -- This will overwrite an existing command --
25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
26 |
27 | const BACKEND_HOST = "http://localhost:3333";
28 |
29 | // comando para criar uma ong antes dos testes
30 | Cypress.Commands.add("createOng", () => {
31 | // let ongId = 'piça';
32 |
33 | cy.request({
34 | method: 'POST',
35 | url: `${BACKEND_HOST}/ongs`,
36 | headers: { Accept: 'application/json' },
37 | body: {
38 | name: 'Dogs Queridos',
39 | email: 'dogs@mail.com',
40 | whatsapp: '51999999999',
41 | city: 'Porto Alegre',
42 | uf: 'RS'
43 | }
44 | }).then(response => {
45 | // return "c2a5929d";
46 | Cypress.env('createdOngId', response.body.id);
47 | // ongId = response.body.id;
48 | });
49 |
50 | // return ongId;
51 | })
52 |
--------------------------------------------------------------------------------
/frontend/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | // ***********************************************************
2 | // This example support/index.js is processed and
3 | // loaded automatically before your test files.
4 | //
5 | // This is a great place to put global configuration and
6 | // behavior that modifies Cypress.
7 | //
8 | // You can change the location of this file or turn off
9 | // automatically serving support files with the
10 | // 'supportFile' configuration option.
11 | //
12 | // You can read more here:
13 | // https://on.cypress.io/configuration
14 | // ***********************************************************
15 |
16 | // Import commands.js using ES2015 syntax:
17 | import './commands'
18 |
19 | // Alternatively you can use CommonJS syntax:
20 | // require('./commands')
21 |
22 |
23 | // Init do cy.server utilizado para routing
24 | before(() => {
25 | cy.server();
26 | cy.createOng();
27 | });
--------------------------------------------------------------------------------
/frontend/cypress/support/pages/Logon.page.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | INPUT_USER: 'input',
3 | BUTTON_LOGIN: '.button'
4 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/pages/NewIncident.page.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/frontend/cypress/support/pages/NewIncident.page.js
--------------------------------------------------------------------------------
/frontend/cypress/support/pages/Profile.page.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/frontend/cypress/support/pages/Profile.page.js
--------------------------------------------------------------------------------
/frontend/cypress/support/pages/Register.page.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | INPUT_NAME: "[data-cy=name]",
3 | INPUT_EMAIL: "[data-cy=email]",
4 | INPUT_WHATSAPP: "[data-cy=whatsapp]",
5 | INPUT_CITY: "[data-cy=city]",
6 | INPUT_UF: "[data-cy=uf]",
7 | BUTTON_SUBMIT: "[data-cy=submit]",
8 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/questions/TheOng.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | export function receivedAnAccessIdWhenDone() {
4 | cy.wait('@postOng').then((xhr) => {
5 | expect(xhr.status).be.eq(200);
6 | expect(xhr.response.body).has.property('id');
7 | expect(xhr.response.body.id).is.not.null;
8 | });
9 | // cy.readFile('cypress/fixtures/data.json').as('data');
10 | // cy.get('@data').then((data) => {
11 | // cy.log(`Data: ${data.id}`);
12 | // })
13 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/tasks/DoLogIn.js:
--------------------------------------------------------------------------------
1 | import * as logonEl from '../pages/Logon.page'
2 |
3 | export function withTheRegisteredOng() {
4 | cy.readFile('cypress/fixtures/ongId.json').as('data');
5 | cy.get('@data').then((data) => {
6 | cy.get(logonEl.INPUT_USER).type(data.id);
7 | })
8 |
9 | cy.get(logonEl.BUTTON_LOGIN).click();
10 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/tasks/DoRegister.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import * as registerPage from '../pages/Register.page'
4 |
5 | export function asOngNamed(name){
6 | cy.get(registerPage.INPUT_NAME).type(name)
7 | cy.get(registerPage.INPUT_EMAIL).type("dogs@mail.com")
8 | cy.get(registerPage.INPUT_WHATSAPP).type("5551999999999")
9 | cy.get(registerPage.INPUT_CITY).type("Porto Alegre")
10 | cy.get(registerPage.INPUT_UF).type("RS")
11 |
12 | cy.route('POST', '**/ongs').as('postOng');
13 |
14 | cy.get(registerPage.BUTTON_SUBMIT).click();
15 |
16 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/tasks/Start.js:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | const HOST = "http://localhost:3000";
4 | const BACKEND_HOST = "http://localhost:3333";
5 | // const fs = require('fs')
6 |
7 | import * as utils from '../utils';
8 |
9 | export function atRegisterPage(){
10 | cy.visit(`${HOST}/register`);
11 | }
12 |
13 | export function atLogonPage(){
14 | cy.visit(`${HOST}/`);
15 | }
16 |
17 | export function atProfilePageLogged() {
18 | cy.clearLocalStorage();
19 | // const ongId = utils.registerOngAndSaveDataAsFixture('ongRegistered');
20 | const createdOngId = Cypress.env('createdOngId');
21 | cy.log(createdOngId);
22 | // const ongInfo = require('../../fixtures/ongRegistered')
23 |
24 | cy.pause();
25 |
26 | cy.visit(`${HOST}/profile`, {
27 | onBeforeLoad: (win) => {
28 | win.localStorage.setItem('ongId', createdOngId);
29 | win.localStorage.setItem('ongName', createdOngId);
30 | }
31 | });
32 | }
33 |
34 | export function withARegisteredOng(){
35 |
36 | cy.request({
37 | method: 'POST',
38 | url: `${BACKEND_HOST}/ongs`,
39 | headers: { Accept: 'application/json' },
40 | body: {
41 | name: 'Dogs Queridos',
42 | email: 'dogs@mail.com',
43 | whatsapp: '51999999999',
44 | city: 'Porto Alegre',
45 | uf: 'RS'
46 | }
47 | }).then((res) => {
48 | cy.log(res.body.id);
49 | cy.writeFile('cypress/fixtures/ongId.json',
50 | {
51 | id: res.body.id,
52 | name: res.body.name
53 | });
54 | });
55 | }
--------------------------------------------------------------------------------
/frontend/cypress/support/utils.js:
--------------------------------------------------------------------------------
1 | // const pay = require('../fixtures/requests/post-ong.json');
2 |
3 | // export function payload(fixture) {
4 | // let payload = getPayloadFixture(fixture);
5 | // return JSON.stringify(payload);
6 | // }
7 |
8 | // function getPayloadFixture(fixture){
9 | // switch (fixture) {
10 | // case 'post-ong':
11 | // return pay;
12 | // }
13 | // }
14 | const BACKEND_HOST = "http://localhost:3333";
15 |
16 | export function registerOngAndSaveDataAsFixture(fixture){
17 | let ongId;
18 |
19 | cy.request({
20 | method: 'POST',
21 | url: `${BACKEND_HOST}/ongs`,
22 | headers: { Accept: 'application/json' },
23 | body: {
24 | name: 'Dogs Queridos',
25 | email: 'dogs@mail.com',
26 | whatsapp: '51999999999',
27 | city: 'Porto Alegre',
28 | uf: 'RS'
29 | }
30 | }).then((res) => {
31 | cy.log(res.body.id);
32 | // cy.writeFile(`cypress/fixtures/${fixture}.json`,
33 | // {
34 | // id: res.body.id
35 | // });
36 | ongId = res.body.id
37 | });
38 |
39 | // cy.log('passou aqui' + ongId);
40 | return ongId;
41 | }
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^4.2.4",
7 | "@testing-library/react": "^9.3.2",
8 | "@testing-library/user-event": "^7.1.2",
9 | "axios": "^0.19.2",
10 | "react": "^16.13.1",
11 | "react-dom": "^16.13.1",
12 | "react-icons": "^3.9.0",
13 | "react-router-dom": "^5.1.2",
14 | "react-scripts": "3.4.1"
15 | },
16 | "scripts": {
17 | "start": "react-scripts start",
18 | "build": "react-scripts build",
19 | "test": "react-scripts test",
20 | "eject": "react-scripts eject"
21 | },
22 | "eslintConfig": {
23 | "extends": "react-app"
24 | },
25 | "browserslist": {
26 | "production": [
27 | ">0.2%",
28 | "not dead",
29 | "not op_mini all"
30 | ],
31 | "development": [
32 | "last 1 chrome version",
33 | "last 1 firefox version",
34 | "last 1 safari version"
35 | ]
36 | },
37 | "devDependencies": {
38 | "cypress": "4.1"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | Be The Hero
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | import './global.css'
4 | // JSX - javascript and xml
5 | // import Logon from './pages/Logon';
6 | import Routes from './routes';
7 |
8 | function App() {
9 | return (
10 |
11 | );
12 | }
13 |
14 | export default App;
15 |
--------------------------------------------------------------------------------
/frontend/src/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | function Header({ children }) {
4 | return (
5 |
8 | );
9 | }
10 |
11 | export default Header;
--------------------------------------------------------------------------------
/frontend/src/assets/heroes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/frontend/src/assets/heroes.png
--------------------------------------------------------------------------------
/frontend/src/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/frontend/src/global.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Roboto:400,500,700&display=swap');
2 |
3 | * {
4 | margin: 0;
5 | padding: 0;
6 | outline: 0;
7 | box-sizing: border-box;
8 | }
9 |
10 | body {
11 | font: 400 14px Roboto, sans-serif;
12 | background: #f0f0f5;
13 | -webkit-font-smoothing: antialiased;
14 | }
15 |
16 | input, button, textarea {
17 | font: 400 18px Roboto, sans-serif;
18 | }
19 |
20 | button {
21 | cursor: pointer;
22 | }
23 |
24 | form input {
25 | width: 100%;
26 | height: 60px;
27 | color: #333;
28 | border: 1px solid #dcdce6;
29 | border-radius: 8px;
30 | padding: 0 24px;
31 | }
32 |
33 | form textarea {
34 | width: 100%;
35 | resize: vertical;
36 | min-height: 140px;
37 | color: #333;
38 | border: 1px solid #dcdce6;
39 | border-radius: 8px;
40 | padding: 16px 24px;
41 | line-height: 24px;
42 | }
43 |
44 | .button {
45 | width: 100%;
46 | height: 60px;
47 | background: #e02041;
48 | border: 0;
49 | border-radius: 8px;
50 | color: #FFF;
51 | font-weight: 700;
52 | margin-top: 16px;
53 | display: inline-block;
54 | text-align: center;
55 | text-decoration: none;
56 | font-size: 18px;
57 | line-height: 60px;
58 | transition: filter 0.2s;
59 | }
60 |
61 | .button:hover {
62 | filter: brightness(90%);
63 | }
64 |
65 | .back-link {
66 | display: flex;
67 | align-items: center;
68 | margin-top: 40px;
69 | color: #41414d;
70 | font-size: 18px;
71 | text-decoration: none;
72 | font-weight: 500;
73 | transition: opacity 0.2s;
74 | }
75 |
76 | .back-link svg {
77 | margin-right: 8px;
78 | }
79 |
80 | .back-link:hover {
81 | opacity: 0.8;
82 | }
83 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | ReactDOM.render(, document.getElementById('root'));
6 |
--------------------------------------------------------------------------------
/frontend/src/pages/Logon/index.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Link, useHistory } from 'react-router-dom';
3 | import { FiLogIn } from 'react-icons/fi';
4 |
5 | import api from '../../services/api';
6 |
7 | import './styles.css'
8 |
9 | import heroesImg from '../../assets/heroes.png';
10 | import logoImg from '../../assets/logo.svg';
11 |
12 | export default function Logon() {
13 | const [id, setId] = useState('');
14 |
15 | const history = useHistory()
16 |
17 | async function handleLogin(e){
18 | e.preventDefault();
19 |
20 | try {
21 | const response = await api.post('sessions', { id });
22 |
23 | localStorage.setItem('ongId', id);
24 | localStorage.setItem('ongName', response.data.name);
25 |
26 | history.push('profile');
27 |
28 | } catch (err) {
29 | alert('Falha no login, tente novamente. ');
30 | }
31 |
32 | }
33 |
34 | return (
35 |
36 |
37 |
38 |
39 |
56 |
57 |
58 |
59 |

60 |
61 | );
62 | }
--------------------------------------------------------------------------------
/frontend/src/pages/Logon/styles.css:
--------------------------------------------------------------------------------
1 | .logon-container {
2 | width: 100%;
3 | max-width: 1120px;
4 | height: 100vh;
5 | margin: 0 auto;
6 |
7 | display: flex;
8 | align-items: center;
9 | justify-content: space-between;
10 | }
11 |
12 | .logon-container section.form {
13 | width: 100%;
14 | max-width: 350px;
15 | margin-right: 30px;
16 | }
17 |
18 | .logon-container section.form form {
19 | margin-top: 100px;
20 | }
21 |
22 | .logon-container section.form form h1 {
23 | font-size: 32px;
24 | margin-bottom: 32px;
25 | }
26 |
27 |
--------------------------------------------------------------------------------
/frontend/src/pages/NewIncident/index.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Link, useHistory } from 'react-router-dom';
3 | import { FiArrowLeft } from 'react-icons/fi'
4 |
5 | import api from '../../services/api';
6 |
7 | import './styles.css'
8 |
9 | import logoImg from '../../assets/logo.svg';
10 |
11 | export default function NewIncident() {
12 | const[title, setTitle] = useState('');
13 | const[description, setDescription] = useState('');
14 | const[value, setValue] = useState('');
15 |
16 | const ongId = localStorage.getItem('ongId');
17 |
18 | const history = useHistory();
19 |
20 |
21 |
22 | async function handleNewIncident(e){
23 | e.preventDefault();
24 |
25 | const data = {
26 | title,
27 | description,
28 | value
29 | };
30 |
31 | try {
32 | await api.post('incidents', data, {
33 | headers: {
34 | Authorization: ongId
35 | }
36 | })
37 |
38 | history.push('/profile');
39 |
40 | } catch (err) {
41 | alert('Erro ao cadastrar caso, tente novamente');
42 | }
43 | }
44 |
45 | return (
46 |
47 |
48 |
49 |
50 |
51 | Cadastrar novo caso
52 | Descreva o caso detalhadamente para encontrar um herói para resolver isso.
53 |
54 |
55 |
56 | Voltar para home
57 |
58 |
59 |
60 |
61 |
80 |
81 |
82 | );
83 | }
--------------------------------------------------------------------------------
/frontend/src/pages/NewIncident/styles.css:
--------------------------------------------------------------------------------
1 | .new-incident-container {
2 | width: 100%;
3 | max-width: 1120px;
4 | height: 100vh;
5 | margin: 0 auto;
6 |
7 | display: flex;
8 | align-items: center;
9 | justify-content: center;
10 | }
11 |
12 | .new-incident-container .content {
13 | width: 100%;
14 | padding: 96px;
15 | background: #f0f0f5;
16 | box-shadow: 0 0 100px rgba(0, 0, 0, 0.1);
17 | border-radius: 8px;
18 |
19 | display: flex;
20 | justify-content: space-between;
21 | align-items: center;
22 | }
23 |
24 | .new-incident-container .content section {
25 | width: 100%;
26 | max-width: 380px;
27 | }
28 |
29 | .new-incident-container .content section h1 {
30 | margin: 64px 0 32px;
31 | font-size: 32px;
32 | }
33 |
34 | .new-incident-container .content section p {
35 | font-size: 18px;
36 | color: #737380;
37 | line-height: 32px;
38 | }
39 |
40 | .new-incident-container .content form {
41 | width: 100%;
42 | max-width: 450px;
43 | }
44 |
45 | .new-incident-container .content form input,
46 | .new-incident-container .content form textarea {
47 | margin-top: 8px;
48 | }
49 |
--------------------------------------------------------------------------------
/frontend/src/pages/Profile/index.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | import { Link, useHistory } from 'react-router-dom';
3 | import { FiPower, FiTrash2 } from 'react-icons/fi';
4 |
5 | import api from '../../services/api';
6 |
7 | import './styles.css'
8 |
9 | import logoImg from '../../assets/logo.svg';
10 |
11 | export default function Profile() {
12 | const [incidents, setIncidents] = useState([]);
13 |
14 | const ongId = localStorage.getItem('ongId');
15 | const ongName = localStorage.getItem('ongName');
16 | const history = useHistory();
17 |
18 | useEffect(() => {
19 | api.get('profile', {
20 | headers: {
21 | Authorization: ongId
22 | }
23 | }).then(response => {
24 | setIncidents(response.data);
25 | })
26 | }, [ongId]);
27 |
28 | async function handleDeleteIncident(id) {
29 | try {
30 | await api.delete(`incidents/${id}`, {
31 | headers: {
32 | Authorization: ongId
33 | }
34 | });
35 |
36 | setIncidents(incidents.filter(incident => incident.id !== id));
37 | } catch (err) {
38 | alert('Erro ao deletar caso, tente novamente.');
39 | }
40 | }
41 |
42 | function handleLogout() {
43 | localStorage.clear();
44 | history.push('/')
45 | }
46 |
47 | return (
48 |
49 |
50 |
51 | Bem vinda, { ongName }
52 |
53 | Cadastrar novo caso
54 |
57 |
58 |
59 |
Casos cadastrados
60 |
61 |
79 |
80 |
81 | );
82 | }
--------------------------------------------------------------------------------
/frontend/src/pages/Profile/styles.css:
--------------------------------------------------------------------------------
1 | .profile-container {
2 | width: 100%;
3 | max-width: 1180px;
4 | padding: 0 30px;
5 | margin: 32px auto;
6 | }
7 |
8 | .profile-container header {
9 | display: flex;
10 | align-items: center;
11 | }
12 |
13 | .profile-container header span {
14 | font-size: 20px;
15 | margin-left: 24px;
16 | }
17 |
18 | .profile-container header img {
19 | height: 64px;
20 | }
21 |
22 | .profile-container header a {
23 | width: 260px;
24 | margin-left: auto;
25 | margin-top: 0;
26 | }
27 |
28 | .profile-container header button {
29 | height: 60px;
30 | width: 60px;
31 | border-radius: 4px;
32 | border: 1px solid #dcdce6;
33 | background: transparent;
34 | margin-left: 16px;
35 | transition: border-color 0.2s;
36 | }
37 |
38 | .profile-container header button:hover {
39 | border-color: #999;
40 | }
41 |
42 | .profile-container h1 {
43 | margin-top: 80px;
44 | margin-bottom: 24px;
45 | }
46 |
47 | .profile-container ul {
48 | display: grid;
49 | grid-template-columns: repeat(2, 1fr);
50 | grid-gap: 24px;
51 | list-style: none;
52 | }
53 |
54 | .profile-container ul li {
55 | background: #FFF;
56 | padding: 24px;
57 | border-radius: 8px;
58 | position: relative;
59 | }
60 |
61 | .profile-container ul li button {
62 | position: absolute;
63 | right: 24px;
64 | top: 24px;
65 | border: 0;
66 | }
67 |
68 | .profile-container ul li button:hover {
69 | opacity: 0.8;
70 | }
71 |
72 | .profile-container ul li strong {
73 | display: block;
74 | margin-bottom: 16px;
75 | color: #41414d;
76 | }
77 |
78 | .profile-container ul li p + strong {
79 | margin-top: 32px;
80 | }
81 |
82 | .profile-container ul li p {
83 | color: #737380;
84 | line-height: 21px;
85 | font-size: 16px;
86 | }
87 |
88 |
--------------------------------------------------------------------------------
/frontend/src/pages/Register/index.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { Link, useHistory } from 'react-router-dom';
3 | import { FiArrowLeft } from 'react-icons/fi';
4 |
5 | import api from '../../services/api';
6 |
7 | import './styles.css'
8 |
9 | import logoImg from '../../assets/logo.svg';
10 |
11 | export default function Register() {
12 | const [name, setName] = useState('');
13 | const [email, setEmail] = useState('');
14 | const [whatsapp, setWhatsapp] = useState('');
15 | const [city, setCity] = useState('');
16 | const [uf, setUf] = useState('');
17 |
18 | const history = useHistory()
19 |
20 | async function handleRegister(e) {
21 | e.preventDefault();
22 |
23 | const data = {
24 | name,
25 | email,
26 | whatsapp,
27 | city,
28 | uf
29 | };
30 |
31 | try {
32 | const response = await api.post('/ongs', data);
33 | alert(`Seu ID de acesso: ${response.data.id}`);
34 |
35 | history.push('/');
36 |
37 | } catch (err) {
38 | alert('Erro no cadastro, tente novamente.');
39 | }
40 | }
41 |
42 | return (
43 |
105 |
106 | );
107 | }
--------------------------------------------------------------------------------
/frontend/src/pages/Register/styles.css:
--------------------------------------------------------------------------------
1 | .register-container {
2 | width: 100%;
3 | max-width: 1120px;
4 | height: 100vh;
5 | margin: 0 auto;
6 |
7 | display: flex;
8 | align-items: center;
9 | justify-content: center;
10 | }
11 |
12 | .register-container .content {
13 | width: 100%;
14 | padding: 96px;
15 | background: #f0f0f5;
16 | box-shadow: 0 0 100px rgba(0, 0, 0, 0.1);
17 | border-radius: 8px;
18 |
19 | display: flex;
20 | justify-content: space-between;
21 | align-items: center;
22 | }
23 |
24 | .register-container .content section {
25 | width: 100%;
26 | max-width: 380px;
27 | }
28 |
29 | .register-container .content section h1 {
30 | margin: 64px 0 32px;
31 | font-size: 32px;
32 | }
33 |
34 | .register-container .content section p {
35 | font-size: 18px;
36 | color: #737380;
37 | line-height: 32px;
38 | }
39 |
40 | .register-container .content form {
41 | width: 100%;
42 | max-width: 450px;
43 | }
44 |
45 | .register-container .content form input {
46 | margin-top: 8px;
47 | }
48 |
49 | .register-container .content form .input-group {
50 | display: flex;
51 | }
52 |
53 | .register-container .content form .input-group input + input {
54 | margin-left: 8px;
55 | }
56 |
--------------------------------------------------------------------------------
/frontend/src/routes.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { BrowserRouter, Route, Switch } from 'react-router-dom';
3 |
4 | import Logon from './pages/Logon';
5 | import Register from './pages/Register';
6 | import Profile from './pages/Profile';
7 | import NewIncident from './pages/NewIncident';
8 |
9 | export default function Routes() {
10 | return (
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | );
21 | }
--------------------------------------------------------------------------------
/frontend/src/services/api.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | const api = axios.create({
4 | baseURL: 'http://localhost:3333',
5 | })
6 |
7 | export default api;
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "youtube-cypress",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@cypress/listr-verbose-renderer": {
8 | "version": "0.4.1",
9 | "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz",
10 | "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=",
11 | "dev": true,
12 | "requires": {
13 | "chalk": "^1.1.3",
14 | "cli-cursor": "^1.0.2",
15 | "date-fns": "^1.27.2",
16 | "figures": "^1.7.0"
17 | },
18 | "dependencies": {
19 | "chalk": {
20 | "version": "1.1.3",
21 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
22 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
23 | "dev": true,
24 | "requires": {
25 | "ansi-styles": "^2.2.1",
26 | "escape-string-regexp": "^1.0.2",
27 | "has-ansi": "^2.0.0",
28 | "strip-ansi": "^3.0.0",
29 | "supports-color": "^2.0.0"
30 | }
31 | },
32 | "supports-color": {
33 | "version": "2.0.0",
34 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
35 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
36 | "dev": true
37 | }
38 | }
39 | },
40 | "@cypress/xvfb": {
41 | "version": "1.2.4",
42 | "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
43 | "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
44 | "dev": true,
45 | "requires": {
46 | "debug": "^3.1.0",
47 | "lodash.once": "^4.1.1"
48 | },
49 | "dependencies": {
50 | "debug": {
51 | "version": "3.2.6",
52 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
53 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
54 | "dev": true,
55 | "requires": {
56 | "ms": "^2.1.1"
57 | }
58 | }
59 | }
60 | },
61 | "@samverschueren/stream-to-observable": {
62 | "version": "0.3.0",
63 | "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
64 | "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==",
65 | "dev": true,
66 | "requires": {
67 | "any-observable": "^0.3.0"
68 | }
69 | },
70 | "@types/sizzle": {
71 | "version": "2.3.2",
72 | "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz",
73 | "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==",
74 | "dev": true
75 | },
76 | "ajv": {
77 | "version": "6.12.0",
78 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
79 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
80 | "dev": true,
81 | "requires": {
82 | "fast-deep-equal": "^3.1.1",
83 | "fast-json-stable-stringify": "^2.0.0",
84 | "json-schema-traverse": "^0.4.1",
85 | "uri-js": "^4.2.2"
86 | }
87 | },
88 | "ansi-escapes": {
89 | "version": "3.2.0",
90 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
91 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
92 | "dev": true
93 | },
94 | "ansi-regex": {
95 | "version": "2.1.1",
96 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
97 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
98 | "dev": true
99 | },
100 | "ansi-styles": {
101 | "version": "2.2.1",
102 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
103 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
104 | "dev": true
105 | },
106 | "any-observable": {
107 | "version": "0.3.0",
108 | "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
109 | "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==",
110 | "dev": true
111 | },
112 | "arch": {
113 | "version": "2.1.1",
114 | "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
115 | "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
116 | "dev": true
117 | },
118 | "asn1": {
119 | "version": "0.2.4",
120 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
121 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
122 | "dev": true,
123 | "requires": {
124 | "safer-buffer": "~2.1.0"
125 | }
126 | },
127 | "assert-plus": {
128 | "version": "1.0.0",
129 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
130 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
131 | "dev": true
132 | },
133 | "async": {
134 | "version": "3.2.0",
135 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
136 | "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
137 | "dev": true
138 | },
139 | "asynckit": {
140 | "version": "0.4.0",
141 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
142 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
143 | "dev": true
144 | },
145 | "aws-sign2": {
146 | "version": "0.7.0",
147 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
148 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
149 | "dev": true
150 | },
151 | "aws4": {
152 | "version": "1.9.1",
153 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
154 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
155 | "dev": true
156 | },
157 | "balanced-match": {
158 | "version": "1.0.0",
159 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
160 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
161 | "dev": true
162 | },
163 | "bcrypt-pbkdf": {
164 | "version": "1.0.2",
165 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
166 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
167 | "dev": true,
168 | "requires": {
169 | "tweetnacl": "^0.14.3"
170 | }
171 | },
172 | "bluebird": {
173 | "version": "3.7.2",
174 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
175 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
176 | "dev": true
177 | },
178 | "brace-expansion": {
179 | "version": "1.1.11",
180 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
181 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
182 | "dev": true,
183 | "requires": {
184 | "balanced-match": "^1.0.0",
185 | "concat-map": "0.0.1"
186 | }
187 | },
188 | "buffer-crc32": {
189 | "version": "0.2.13",
190 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
191 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
192 | "dev": true
193 | },
194 | "buffer-from": {
195 | "version": "1.1.1",
196 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
197 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
198 | "dev": true
199 | },
200 | "cachedir": {
201 | "version": "2.3.0",
202 | "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
203 | "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
204 | "dev": true
205 | },
206 | "caseless": {
207 | "version": "0.12.0",
208 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
209 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
210 | "dev": true
211 | },
212 | "chalk": {
213 | "version": "2.4.2",
214 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
215 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
216 | "dev": true,
217 | "requires": {
218 | "ansi-styles": "^3.2.1",
219 | "escape-string-regexp": "^1.0.5",
220 | "supports-color": "^5.3.0"
221 | },
222 | "dependencies": {
223 | "ansi-styles": {
224 | "version": "3.2.1",
225 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
226 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
227 | "dev": true,
228 | "requires": {
229 | "color-convert": "^1.9.0"
230 | }
231 | },
232 | "supports-color": {
233 | "version": "5.5.0",
234 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
235 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
236 | "dev": true,
237 | "requires": {
238 | "has-flag": "^3.0.0"
239 | }
240 | }
241 | }
242 | },
243 | "check-more-types": {
244 | "version": "2.24.0",
245 | "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
246 | "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=",
247 | "dev": true
248 | },
249 | "ci-info": {
250 | "version": "2.0.0",
251 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
252 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
253 | "dev": true
254 | },
255 | "cli-cursor": {
256 | "version": "1.0.2",
257 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
258 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
259 | "dev": true,
260 | "requires": {
261 | "restore-cursor": "^1.0.1"
262 | }
263 | },
264 | "cli-truncate": {
265 | "version": "0.2.1",
266 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
267 | "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
268 | "dev": true,
269 | "requires": {
270 | "slice-ansi": "0.0.4",
271 | "string-width": "^1.0.1"
272 | }
273 | },
274 | "code-point-at": {
275 | "version": "1.1.0",
276 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
277 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
278 | "dev": true
279 | },
280 | "color-convert": {
281 | "version": "1.9.3",
282 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
283 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
284 | "dev": true,
285 | "requires": {
286 | "color-name": "1.1.3"
287 | }
288 | },
289 | "color-name": {
290 | "version": "1.1.3",
291 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
292 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
293 | "dev": true
294 | },
295 | "combined-stream": {
296 | "version": "1.0.8",
297 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
298 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
299 | "dev": true,
300 | "requires": {
301 | "delayed-stream": "~1.0.0"
302 | }
303 | },
304 | "commander": {
305 | "version": "4.1.0",
306 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz",
307 | "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==",
308 | "dev": true
309 | },
310 | "common-tags": {
311 | "version": "1.8.0",
312 | "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
313 | "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
314 | "dev": true
315 | },
316 | "concat-map": {
317 | "version": "0.0.1",
318 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
319 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
320 | "dev": true
321 | },
322 | "concat-stream": {
323 | "version": "1.6.2",
324 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
325 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
326 | "dev": true,
327 | "requires": {
328 | "buffer-from": "^1.0.0",
329 | "inherits": "^2.0.3",
330 | "readable-stream": "^2.2.2",
331 | "typedarray": "^0.0.6"
332 | }
333 | },
334 | "core-util-is": {
335 | "version": "1.0.2",
336 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
337 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
338 | "dev": true
339 | },
340 | "cross-spawn": {
341 | "version": "6.0.5",
342 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
343 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
344 | "dev": true,
345 | "requires": {
346 | "nice-try": "^1.0.4",
347 | "path-key": "^2.0.1",
348 | "semver": "^5.5.0",
349 | "shebang-command": "^1.2.0",
350 | "which": "^1.2.9"
351 | }
352 | },
353 | "cypress": {
354 | "version": "4.1.0",
355 | "resolved": "https://registry.npmjs.org/cypress/-/cypress-4.1.0.tgz",
356 | "integrity": "sha512-FFV8pS9iuriSX4M9rna6awJUhiqozZD1D5z5BprCUJoho1ctbcgpkEUIUnqxli2OwjQqVz07egO+iqoGL+tw7g==",
357 | "dev": true,
358 | "requires": {
359 | "@cypress/listr-verbose-renderer": "0.4.1",
360 | "@cypress/xvfb": "1.2.4",
361 | "@types/sizzle": "2.3.2",
362 | "arch": "2.1.1",
363 | "bluebird": "3.7.2",
364 | "cachedir": "2.3.0",
365 | "chalk": "2.4.2",
366 | "check-more-types": "2.24.0",
367 | "commander": "4.1.0",
368 | "common-tags": "1.8.0",
369 | "debug": "4.1.1",
370 | "eventemitter2": "4.1.2",
371 | "execa": "1.0.0",
372 | "executable": "4.1.1",
373 | "extract-zip": "1.6.7",
374 | "fs-extra": "8.1.0",
375 | "getos": "3.1.4",
376 | "is-ci": "2.0.0",
377 | "is-installed-globally": "0.1.0",
378 | "lazy-ass": "1.6.0",
379 | "listr": "0.14.3",
380 | "lodash": "4.17.15",
381 | "log-symbols": "3.0.0",
382 | "minimist": "1.2.0",
383 | "moment": "2.24.0",
384 | "ospath": "1.2.2",
385 | "pretty-bytes": "5.3.0",
386 | "ramda": "0.26.1",
387 | "request": "2.88.0",
388 | "request-progress": "3.0.0",
389 | "supports-color": "7.1.0",
390 | "tmp": "0.1.0",
391 | "untildify": "4.0.0",
392 | "url": "0.11.0",
393 | "yauzl": "2.10.0"
394 | }
395 | },
396 | "dashdash": {
397 | "version": "1.14.1",
398 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
399 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
400 | "dev": true,
401 | "requires": {
402 | "assert-plus": "^1.0.0"
403 | }
404 | },
405 | "date-fns": {
406 | "version": "1.30.1",
407 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
408 | "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
409 | "dev": true
410 | },
411 | "debug": {
412 | "version": "4.1.1",
413 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
414 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
415 | "dev": true,
416 | "requires": {
417 | "ms": "^2.1.1"
418 | }
419 | },
420 | "delayed-stream": {
421 | "version": "1.0.0",
422 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
423 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
424 | "dev": true
425 | },
426 | "ecc-jsbn": {
427 | "version": "0.1.2",
428 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
429 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
430 | "dev": true,
431 | "requires": {
432 | "jsbn": "~0.1.0",
433 | "safer-buffer": "^2.1.0"
434 | }
435 | },
436 | "elegant-spinner": {
437 | "version": "1.0.1",
438 | "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
439 | "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
440 | "dev": true
441 | },
442 | "end-of-stream": {
443 | "version": "1.4.4",
444 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
445 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
446 | "dev": true,
447 | "requires": {
448 | "once": "^1.4.0"
449 | }
450 | },
451 | "escape-string-regexp": {
452 | "version": "1.0.5",
453 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
454 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
455 | "dev": true
456 | },
457 | "eventemitter2": {
458 | "version": "4.1.2",
459 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz",
460 | "integrity": "sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=",
461 | "dev": true
462 | },
463 | "execa": {
464 | "version": "1.0.0",
465 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
466 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
467 | "dev": true,
468 | "requires": {
469 | "cross-spawn": "^6.0.0",
470 | "get-stream": "^4.0.0",
471 | "is-stream": "^1.1.0",
472 | "npm-run-path": "^2.0.0",
473 | "p-finally": "^1.0.0",
474 | "signal-exit": "^3.0.0",
475 | "strip-eof": "^1.0.0"
476 | }
477 | },
478 | "executable": {
479 | "version": "4.1.1",
480 | "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
481 | "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
482 | "dev": true,
483 | "requires": {
484 | "pify": "^2.2.0"
485 | }
486 | },
487 | "exit-hook": {
488 | "version": "1.1.1",
489 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
490 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
491 | "dev": true
492 | },
493 | "extend": {
494 | "version": "3.0.2",
495 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
496 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
497 | "dev": true
498 | },
499 | "extract-zip": {
500 | "version": "1.6.7",
501 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
502 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
503 | "dev": true,
504 | "requires": {
505 | "concat-stream": "1.6.2",
506 | "debug": "2.6.9",
507 | "mkdirp": "0.5.1",
508 | "yauzl": "2.4.1"
509 | },
510 | "dependencies": {
511 | "debug": {
512 | "version": "2.6.9",
513 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
514 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
515 | "dev": true,
516 | "requires": {
517 | "ms": "2.0.0"
518 | }
519 | },
520 | "ms": {
521 | "version": "2.0.0",
522 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
523 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
524 | "dev": true
525 | },
526 | "yauzl": {
527 | "version": "2.4.1",
528 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
529 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
530 | "dev": true,
531 | "requires": {
532 | "fd-slicer": "~1.0.1"
533 | }
534 | }
535 | }
536 | },
537 | "extsprintf": {
538 | "version": "1.3.0",
539 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
540 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
541 | "dev": true
542 | },
543 | "fast-deep-equal": {
544 | "version": "3.1.1",
545 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
546 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
547 | "dev": true
548 | },
549 | "fast-json-stable-stringify": {
550 | "version": "2.1.0",
551 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
552 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
553 | "dev": true
554 | },
555 | "fd-slicer": {
556 | "version": "1.0.1",
557 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
558 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
559 | "dev": true,
560 | "requires": {
561 | "pend": "~1.2.0"
562 | }
563 | },
564 | "figures": {
565 | "version": "1.7.0",
566 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
567 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
568 | "dev": true,
569 | "requires": {
570 | "escape-string-regexp": "^1.0.5",
571 | "object-assign": "^4.1.0"
572 | }
573 | },
574 | "forever-agent": {
575 | "version": "0.6.1",
576 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
577 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
578 | "dev": true
579 | },
580 | "form-data": {
581 | "version": "2.3.3",
582 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
583 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
584 | "dev": true,
585 | "requires": {
586 | "asynckit": "^0.4.0",
587 | "combined-stream": "^1.0.6",
588 | "mime-types": "^2.1.12"
589 | }
590 | },
591 | "fs-extra": {
592 | "version": "8.1.0",
593 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
594 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
595 | "dev": true,
596 | "requires": {
597 | "graceful-fs": "^4.2.0",
598 | "jsonfile": "^4.0.0",
599 | "universalify": "^0.1.0"
600 | }
601 | },
602 | "fs.realpath": {
603 | "version": "1.0.0",
604 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
605 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
606 | "dev": true
607 | },
608 | "get-stream": {
609 | "version": "4.1.0",
610 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
611 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
612 | "dev": true,
613 | "requires": {
614 | "pump": "^3.0.0"
615 | }
616 | },
617 | "getos": {
618 | "version": "3.1.4",
619 | "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.4.tgz",
620 | "integrity": "sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw==",
621 | "dev": true,
622 | "requires": {
623 | "async": "^3.1.0"
624 | }
625 | },
626 | "getpass": {
627 | "version": "0.1.7",
628 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
629 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
630 | "dev": true,
631 | "requires": {
632 | "assert-plus": "^1.0.0"
633 | }
634 | },
635 | "glob": {
636 | "version": "7.1.6",
637 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
638 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
639 | "dev": true,
640 | "requires": {
641 | "fs.realpath": "^1.0.0",
642 | "inflight": "^1.0.4",
643 | "inherits": "2",
644 | "minimatch": "^3.0.4",
645 | "once": "^1.3.0",
646 | "path-is-absolute": "^1.0.0"
647 | }
648 | },
649 | "global-dirs": {
650 | "version": "0.1.1",
651 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
652 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
653 | "dev": true,
654 | "requires": {
655 | "ini": "^1.3.4"
656 | }
657 | },
658 | "graceful-fs": {
659 | "version": "4.2.3",
660 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
661 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
662 | "dev": true
663 | },
664 | "har-schema": {
665 | "version": "2.0.0",
666 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
667 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
668 | "dev": true
669 | },
670 | "har-validator": {
671 | "version": "5.1.3",
672 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
673 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
674 | "dev": true,
675 | "requires": {
676 | "ajv": "^6.5.5",
677 | "har-schema": "^2.0.0"
678 | }
679 | },
680 | "has-ansi": {
681 | "version": "2.0.0",
682 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
683 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
684 | "dev": true,
685 | "requires": {
686 | "ansi-regex": "^2.0.0"
687 | }
688 | },
689 | "has-flag": {
690 | "version": "3.0.0",
691 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
692 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
693 | "dev": true
694 | },
695 | "http-signature": {
696 | "version": "1.2.0",
697 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
698 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
699 | "dev": true,
700 | "requires": {
701 | "assert-plus": "^1.0.0",
702 | "jsprim": "^1.2.2",
703 | "sshpk": "^1.7.0"
704 | }
705 | },
706 | "indent-string": {
707 | "version": "3.2.0",
708 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
709 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
710 | "dev": true
711 | },
712 | "inflight": {
713 | "version": "1.0.6",
714 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
715 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
716 | "dev": true,
717 | "requires": {
718 | "once": "^1.3.0",
719 | "wrappy": "1"
720 | }
721 | },
722 | "inherits": {
723 | "version": "2.0.4",
724 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
725 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
726 | "dev": true
727 | },
728 | "ini": {
729 | "version": "1.3.5",
730 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
731 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
732 | "dev": true
733 | },
734 | "is-ci": {
735 | "version": "2.0.0",
736 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
737 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
738 | "dev": true,
739 | "requires": {
740 | "ci-info": "^2.0.0"
741 | }
742 | },
743 | "is-fullwidth-code-point": {
744 | "version": "1.0.0",
745 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
746 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
747 | "dev": true,
748 | "requires": {
749 | "number-is-nan": "^1.0.0"
750 | }
751 | },
752 | "is-installed-globally": {
753 | "version": "0.1.0",
754 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
755 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
756 | "dev": true,
757 | "requires": {
758 | "global-dirs": "^0.1.0",
759 | "is-path-inside": "^1.0.0"
760 | }
761 | },
762 | "is-observable": {
763 | "version": "1.1.0",
764 | "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz",
765 | "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==",
766 | "dev": true,
767 | "requires": {
768 | "symbol-observable": "^1.1.0"
769 | }
770 | },
771 | "is-path-inside": {
772 | "version": "1.0.1",
773 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
774 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
775 | "dev": true,
776 | "requires": {
777 | "path-is-inside": "^1.0.1"
778 | }
779 | },
780 | "is-promise": {
781 | "version": "2.1.0",
782 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
783 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
784 | "dev": true
785 | },
786 | "is-stream": {
787 | "version": "1.1.0",
788 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
789 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
790 | "dev": true
791 | },
792 | "is-typedarray": {
793 | "version": "1.0.0",
794 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
795 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
796 | "dev": true
797 | },
798 | "isarray": {
799 | "version": "1.0.0",
800 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
801 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
802 | "dev": true
803 | },
804 | "isexe": {
805 | "version": "2.0.0",
806 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
807 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
808 | "dev": true
809 | },
810 | "isstream": {
811 | "version": "0.1.2",
812 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
813 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
814 | "dev": true
815 | },
816 | "jsbn": {
817 | "version": "0.1.1",
818 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
819 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
820 | "dev": true
821 | },
822 | "json-schema": {
823 | "version": "0.2.3",
824 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
825 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
826 | "dev": true
827 | },
828 | "json-schema-traverse": {
829 | "version": "0.4.1",
830 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
831 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
832 | "dev": true
833 | },
834 | "json-stringify-safe": {
835 | "version": "5.0.1",
836 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
837 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
838 | "dev": true
839 | },
840 | "jsonfile": {
841 | "version": "4.0.0",
842 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
843 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
844 | "dev": true,
845 | "requires": {
846 | "graceful-fs": "^4.1.6"
847 | }
848 | },
849 | "jsprim": {
850 | "version": "1.4.1",
851 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
852 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
853 | "dev": true,
854 | "requires": {
855 | "assert-plus": "1.0.0",
856 | "extsprintf": "1.3.0",
857 | "json-schema": "0.2.3",
858 | "verror": "1.10.0"
859 | }
860 | },
861 | "lazy-ass": {
862 | "version": "1.6.0",
863 | "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
864 | "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=",
865 | "dev": true
866 | },
867 | "listr": {
868 | "version": "0.14.3",
869 | "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
870 | "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
871 | "dev": true,
872 | "requires": {
873 | "@samverschueren/stream-to-observable": "^0.3.0",
874 | "is-observable": "^1.1.0",
875 | "is-promise": "^2.1.0",
876 | "is-stream": "^1.1.0",
877 | "listr-silent-renderer": "^1.1.1",
878 | "listr-update-renderer": "^0.5.0",
879 | "listr-verbose-renderer": "^0.5.0",
880 | "p-map": "^2.0.0",
881 | "rxjs": "^6.3.3"
882 | }
883 | },
884 | "listr-silent-renderer": {
885 | "version": "1.1.1",
886 | "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
887 | "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
888 | "dev": true
889 | },
890 | "listr-update-renderer": {
891 | "version": "0.5.0",
892 | "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
893 | "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
894 | "dev": true,
895 | "requires": {
896 | "chalk": "^1.1.3",
897 | "cli-truncate": "^0.2.1",
898 | "elegant-spinner": "^1.0.1",
899 | "figures": "^1.7.0",
900 | "indent-string": "^3.0.0",
901 | "log-symbols": "^1.0.2",
902 | "log-update": "^2.3.0",
903 | "strip-ansi": "^3.0.1"
904 | },
905 | "dependencies": {
906 | "chalk": {
907 | "version": "1.1.3",
908 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
909 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
910 | "dev": true,
911 | "requires": {
912 | "ansi-styles": "^2.2.1",
913 | "escape-string-regexp": "^1.0.2",
914 | "has-ansi": "^2.0.0",
915 | "strip-ansi": "^3.0.0",
916 | "supports-color": "^2.0.0"
917 | }
918 | },
919 | "log-symbols": {
920 | "version": "1.0.2",
921 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
922 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
923 | "dev": true,
924 | "requires": {
925 | "chalk": "^1.0.0"
926 | }
927 | },
928 | "supports-color": {
929 | "version": "2.0.0",
930 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
931 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
932 | "dev": true
933 | }
934 | }
935 | },
936 | "listr-verbose-renderer": {
937 | "version": "0.5.0",
938 | "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
939 | "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
940 | "dev": true,
941 | "requires": {
942 | "chalk": "^2.4.1",
943 | "cli-cursor": "^2.1.0",
944 | "date-fns": "^1.27.2",
945 | "figures": "^2.0.0"
946 | },
947 | "dependencies": {
948 | "cli-cursor": {
949 | "version": "2.1.0",
950 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
951 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
952 | "dev": true,
953 | "requires": {
954 | "restore-cursor": "^2.0.0"
955 | }
956 | },
957 | "figures": {
958 | "version": "2.0.0",
959 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
960 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
961 | "dev": true,
962 | "requires": {
963 | "escape-string-regexp": "^1.0.5"
964 | }
965 | },
966 | "onetime": {
967 | "version": "2.0.1",
968 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
969 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
970 | "dev": true,
971 | "requires": {
972 | "mimic-fn": "^1.0.0"
973 | }
974 | },
975 | "restore-cursor": {
976 | "version": "2.0.0",
977 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
978 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
979 | "dev": true,
980 | "requires": {
981 | "onetime": "^2.0.0",
982 | "signal-exit": "^3.0.2"
983 | }
984 | }
985 | }
986 | },
987 | "lodash": {
988 | "version": "4.17.15",
989 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
990 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
991 | "dev": true
992 | },
993 | "lodash.once": {
994 | "version": "4.1.1",
995 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
996 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
997 | "dev": true
998 | },
999 | "log-symbols": {
1000 | "version": "3.0.0",
1001 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
1002 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
1003 | "dev": true,
1004 | "requires": {
1005 | "chalk": "^2.4.2"
1006 | }
1007 | },
1008 | "log-update": {
1009 | "version": "2.3.0",
1010 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
1011 | "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
1012 | "dev": true,
1013 | "requires": {
1014 | "ansi-escapes": "^3.0.0",
1015 | "cli-cursor": "^2.0.0",
1016 | "wrap-ansi": "^3.0.1"
1017 | },
1018 | "dependencies": {
1019 | "cli-cursor": {
1020 | "version": "2.1.0",
1021 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
1022 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
1023 | "dev": true,
1024 | "requires": {
1025 | "restore-cursor": "^2.0.0"
1026 | }
1027 | },
1028 | "onetime": {
1029 | "version": "2.0.1",
1030 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1031 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1032 | "dev": true,
1033 | "requires": {
1034 | "mimic-fn": "^1.0.0"
1035 | }
1036 | },
1037 | "restore-cursor": {
1038 | "version": "2.0.0",
1039 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1040 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1041 | "dev": true,
1042 | "requires": {
1043 | "onetime": "^2.0.0",
1044 | "signal-exit": "^3.0.2"
1045 | }
1046 | }
1047 | }
1048 | },
1049 | "mime-db": {
1050 | "version": "1.43.0",
1051 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
1052 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
1053 | "dev": true
1054 | },
1055 | "mime-types": {
1056 | "version": "2.1.26",
1057 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
1058 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
1059 | "dev": true,
1060 | "requires": {
1061 | "mime-db": "1.43.0"
1062 | }
1063 | },
1064 | "mimic-fn": {
1065 | "version": "1.2.0",
1066 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1067 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1068 | "dev": true
1069 | },
1070 | "minimatch": {
1071 | "version": "3.0.4",
1072 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1073 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1074 | "dev": true,
1075 | "requires": {
1076 | "brace-expansion": "^1.1.7"
1077 | }
1078 | },
1079 | "minimist": {
1080 | "version": "1.2.0",
1081 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1082 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1083 | "dev": true
1084 | },
1085 | "mkdirp": {
1086 | "version": "0.5.1",
1087 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1088 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1089 | "dev": true,
1090 | "requires": {
1091 | "minimist": "0.0.8"
1092 | },
1093 | "dependencies": {
1094 | "minimist": {
1095 | "version": "0.0.8",
1096 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1097 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1098 | "dev": true
1099 | }
1100 | }
1101 | },
1102 | "moment": {
1103 | "version": "2.24.0",
1104 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
1105 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
1106 | "dev": true
1107 | },
1108 | "ms": {
1109 | "version": "2.1.2",
1110 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1111 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1112 | "dev": true
1113 | },
1114 | "nice-try": {
1115 | "version": "1.0.5",
1116 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
1117 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1118 | "dev": true
1119 | },
1120 | "npm-run-path": {
1121 | "version": "2.0.2",
1122 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1123 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1124 | "dev": true,
1125 | "requires": {
1126 | "path-key": "^2.0.0"
1127 | }
1128 | },
1129 | "number-is-nan": {
1130 | "version": "1.0.1",
1131 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1132 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1133 | "dev": true
1134 | },
1135 | "oauth-sign": {
1136 | "version": "0.9.0",
1137 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1138 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1139 | "dev": true
1140 | },
1141 | "object-assign": {
1142 | "version": "4.1.1",
1143 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1144 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1145 | "dev": true
1146 | },
1147 | "once": {
1148 | "version": "1.4.0",
1149 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1150 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1151 | "dev": true,
1152 | "requires": {
1153 | "wrappy": "1"
1154 | }
1155 | },
1156 | "onetime": {
1157 | "version": "1.1.0",
1158 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
1159 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
1160 | "dev": true
1161 | },
1162 | "ospath": {
1163 | "version": "1.2.2",
1164 | "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
1165 | "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=",
1166 | "dev": true
1167 | },
1168 | "p-finally": {
1169 | "version": "1.0.0",
1170 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1171 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1172 | "dev": true
1173 | },
1174 | "p-map": {
1175 | "version": "2.1.0",
1176 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
1177 | "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
1178 | "dev": true
1179 | },
1180 | "path-is-absolute": {
1181 | "version": "1.0.1",
1182 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1183 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1184 | "dev": true
1185 | },
1186 | "path-is-inside": {
1187 | "version": "1.0.2",
1188 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1189 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1190 | "dev": true
1191 | },
1192 | "path-key": {
1193 | "version": "2.0.1",
1194 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1195 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1196 | "dev": true
1197 | },
1198 | "pend": {
1199 | "version": "1.2.0",
1200 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1201 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
1202 | "dev": true
1203 | },
1204 | "performance-now": {
1205 | "version": "2.1.0",
1206 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1207 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1208 | "dev": true
1209 | },
1210 | "pify": {
1211 | "version": "2.3.0",
1212 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1213 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1214 | "dev": true
1215 | },
1216 | "pretty-bytes": {
1217 | "version": "5.3.0",
1218 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
1219 | "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==",
1220 | "dev": true
1221 | },
1222 | "process-nextick-args": {
1223 | "version": "2.0.1",
1224 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1225 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1226 | "dev": true
1227 | },
1228 | "psl": {
1229 | "version": "1.8.0",
1230 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1231 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
1232 | "dev": true
1233 | },
1234 | "pump": {
1235 | "version": "3.0.0",
1236 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1237 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1238 | "dev": true,
1239 | "requires": {
1240 | "end-of-stream": "^1.1.0",
1241 | "once": "^1.3.1"
1242 | }
1243 | },
1244 | "punycode": {
1245 | "version": "2.1.1",
1246 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1247 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1248 | "dev": true
1249 | },
1250 | "qs": {
1251 | "version": "6.5.2",
1252 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1253 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
1254 | "dev": true
1255 | },
1256 | "querystring": {
1257 | "version": "0.2.0",
1258 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
1259 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
1260 | "dev": true
1261 | },
1262 | "ramda": {
1263 | "version": "0.26.1",
1264 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz",
1265 | "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==",
1266 | "dev": true
1267 | },
1268 | "readable-stream": {
1269 | "version": "2.3.7",
1270 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1271 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1272 | "dev": true,
1273 | "requires": {
1274 | "core-util-is": "~1.0.0",
1275 | "inherits": "~2.0.3",
1276 | "isarray": "~1.0.0",
1277 | "process-nextick-args": "~2.0.0",
1278 | "safe-buffer": "~5.1.1",
1279 | "string_decoder": "~1.1.1",
1280 | "util-deprecate": "~1.0.1"
1281 | }
1282 | },
1283 | "request": {
1284 | "version": "2.88.0",
1285 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1286 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1287 | "dev": true,
1288 | "requires": {
1289 | "aws-sign2": "~0.7.0",
1290 | "aws4": "^1.8.0",
1291 | "caseless": "~0.12.0",
1292 | "combined-stream": "~1.0.6",
1293 | "extend": "~3.0.2",
1294 | "forever-agent": "~0.6.1",
1295 | "form-data": "~2.3.2",
1296 | "har-validator": "~5.1.0",
1297 | "http-signature": "~1.2.0",
1298 | "is-typedarray": "~1.0.0",
1299 | "isstream": "~0.1.2",
1300 | "json-stringify-safe": "~5.0.1",
1301 | "mime-types": "~2.1.19",
1302 | "oauth-sign": "~0.9.0",
1303 | "performance-now": "^2.1.0",
1304 | "qs": "~6.5.2",
1305 | "safe-buffer": "^5.1.2",
1306 | "tough-cookie": "~2.4.3",
1307 | "tunnel-agent": "^0.6.0",
1308 | "uuid": "^3.3.2"
1309 | }
1310 | },
1311 | "request-progress": {
1312 | "version": "3.0.0",
1313 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
1314 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=",
1315 | "dev": true,
1316 | "requires": {
1317 | "throttleit": "^1.0.0"
1318 | }
1319 | },
1320 | "restore-cursor": {
1321 | "version": "1.0.1",
1322 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
1323 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
1324 | "dev": true,
1325 | "requires": {
1326 | "exit-hook": "^1.0.0",
1327 | "onetime": "^1.0.0"
1328 | }
1329 | },
1330 | "rimraf": {
1331 | "version": "2.7.1",
1332 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1333 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1334 | "dev": true,
1335 | "requires": {
1336 | "glob": "^7.1.3"
1337 | }
1338 | },
1339 | "rxjs": {
1340 | "version": "6.5.5",
1341 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
1342 | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
1343 | "dev": true,
1344 | "requires": {
1345 | "tslib": "^1.9.0"
1346 | }
1347 | },
1348 | "safe-buffer": {
1349 | "version": "5.1.2",
1350 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1351 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1352 | "dev": true
1353 | },
1354 | "safer-buffer": {
1355 | "version": "2.1.2",
1356 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1357 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1358 | "dev": true
1359 | },
1360 | "semver": {
1361 | "version": "5.7.1",
1362 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1363 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1364 | "dev": true
1365 | },
1366 | "shebang-command": {
1367 | "version": "1.2.0",
1368 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1369 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1370 | "dev": true,
1371 | "requires": {
1372 | "shebang-regex": "^1.0.0"
1373 | }
1374 | },
1375 | "shebang-regex": {
1376 | "version": "1.0.0",
1377 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1378 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1379 | "dev": true
1380 | },
1381 | "signal-exit": {
1382 | "version": "3.0.3",
1383 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1384 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1385 | "dev": true
1386 | },
1387 | "slice-ansi": {
1388 | "version": "0.0.4",
1389 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
1390 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=",
1391 | "dev": true
1392 | },
1393 | "sshpk": {
1394 | "version": "1.16.1",
1395 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1396 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1397 | "dev": true,
1398 | "requires": {
1399 | "asn1": "~0.2.3",
1400 | "assert-plus": "^1.0.0",
1401 | "bcrypt-pbkdf": "^1.0.0",
1402 | "dashdash": "^1.12.0",
1403 | "ecc-jsbn": "~0.1.1",
1404 | "getpass": "^0.1.1",
1405 | "jsbn": "~0.1.0",
1406 | "safer-buffer": "^2.0.2",
1407 | "tweetnacl": "~0.14.0"
1408 | }
1409 | },
1410 | "string-width": {
1411 | "version": "1.0.2",
1412 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1413 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1414 | "dev": true,
1415 | "requires": {
1416 | "code-point-at": "^1.0.0",
1417 | "is-fullwidth-code-point": "^1.0.0",
1418 | "strip-ansi": "^3.0.0"
1419 | }
1420 | },
1421 | "string_decoder": {
1422 | "version": "1.1.1",
1423 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1424 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1425 | "dev": true,
1426 | "requires": {
1427 | "safe-buffer": "~5.1.0"
1428 | }
1429 | },
1430 | "strip-ansi": {
1431 | "version": "3.0.1",
1432 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1433 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1434 | "dev": true,
1435 | "requires": {
1436 | "ansi-regex": "^2.0.0"
1437 | }
1438 | },
1439 | "strip-eof": {
1440 | "version": "1.0.0",
1441 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
1442 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
1443 | "dev": true
1444 | },
1445 | "supports-color": {
1446 | "version": "7.1.0",
1447 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1448 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1449 | "dev": true,
1450 | "requires": {
1451 | "has-flag": "^4.0.0"
1452 | },
1453 | "dependencies": {
1454 | "has-flag": {
1455 | "version": "4.0.0",
1456 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1457 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1458 | "dev": true
1459 | }
1460 | }
1461 | },
1462 | "symbol-observable": {
1463 | "version": "1.2.0",
1464 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
1465 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
1466 | "dev": true
1467 | },
1468 | "throttleit": {
1469 | "version": "1.0.0",
1470 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
1471 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
1472 | "dev": true
1473 | },
1474 | "tmp": {
1475 | "version": "0.1.0",
1476 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz",
1477 | "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==",
1478 | "dev": true,
1479 | "requires": {
1480 | "rimraf": "^2.6.3"
1481 | }
1482 | },
1483 | "tough-cookie": {
1484 | "version": "2.4.3",
1485 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1486 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1487 | "dev": true,
1488 | "requires": {
1489 | "psl": "^1.1.24",
1490 | "punycode": "^1.4.1"
1491 | },
1492 | "dependencies": {
1493 | "punycode": {
1494 | "version": "1.4.1",
1495 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1496 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1497 | "dev": true
1498 | }
1499 | }
1500 | },
1501 | "tslib": {
1502 | "version": "1.11.1",
1503 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
1504 | "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
1505 | "dev": true
1506 | },
1507 | "tunnel-agent": {
1508 | "version": "0.6.0",
1509 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1510 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1511 | "dev": true,
1512 | "requires": {
1513 | "safe-buffer": "^5.0.1"
1514 | }
1515 | },
1516 | "tweetnacl": {
1517 | "version": "0.14.5",
1518 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1519 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1520 | "dev": true
1521 | },
1522 | "typedarray": {
1523 | "version": "0.0.6",
1524 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1525 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1526 | "dev": true
1527 | },
1528 | "universalify": {
1529 | "version": "0.1.2",
1530 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1531 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1532 | "dev": true
1533 | },
1534 | "untildify": {
1535 | "version": "4.0.0",
1536 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
1537 | "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
1538 | "dev": true
1539 | },
1540 | "uri-js": {
1541 | "version": "4.2.2",
1542 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1543 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1544 | "dev": true,
1545 | "requires": {
1546 | "punycode": "^2.1.0"
1547 | }
1548 | },
1549 | "url": {
1550 | "version": "0.11.0",
1551 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
1552 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
1553 | "dev": true,
1554 | "requires": {
1555 | "punycode": "1.3.2",
1556 | "querystring": "0.2.0"
1557 | },
1558 | "dependencies": {
1559 | "punycode": {
1560 | "version": "1.3.2",
1561 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
1562 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
1563 | "dev": true
1564 | }
1565 | }
1566 | },
1567 | "util-deprecate": {
1568 | "version": "1.0.2",
1569 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1570 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1571 | "dev": true
1572 | },
1573 | "uuid": {
1574 | "version": "3.4.0",
1575 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1576 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1577 | "dev": true
1578 | },
1579 | "verror": {
1580 | "version": "1.10.0",
1581 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1582 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1583 | "dev": true,
1584 | "requires": {
1585 | "assert-plus": "^1.0.0",
1586 | "core-util-is": "1.0.2",
1587 | "extsprintf": "^1.2.0"
1588 | }
1589 | },
1590 | "which": {
1591 | "version": "1.3.1",
1592 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1593 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1594 | "dev": true,
1595 | "requires": {
1596 | "isexe": "^2.0.0"
1597 | }
1598 | },
1599 | "wrap-ansi": {
1600 | "version": "3.0.1",
1601 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
1602 | "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
1603 | "dev": true,
1604 | "requires": {
1605 | "string-width": "^2.1.1",
1606 | "strip-ansi": "^4.0.0"
1607 | },
1608 | "dependencies": {
1609 | "ansi-regex": {
1610 | "version": "3.0.0",
1611 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1612 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1613 | "dev": true
1614 | },
1615 | "is-fullwidth-code-point": {
1616 | "version": "2.0.0",
1617 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1618 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1619 | "dev": true
1620 | },
1621 | "string-width": {
1622 | "version": "2.1.1",
1623 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1624 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1625 | "dev": true,
1626 | "requires": {
1627 | "is-fullwidth-code-point": "^2.0.0",
1628 | "strip-ansi": "^4.0.0"
1629 | }
1630 | },
1631 | "strip-ansi": {
1632 | "version": "4.0.0",
1633 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1634 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1635 | "dev": true,
1636 | "requires": {
1637 | "ansi-regex": "^3.0.0"
1638 | }
1639 | }
1640 | }
1641 | },
1642 | "wrappy": {
1643 | "version": "1.0.2",
1644 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1645 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1646 | "dev": true
1647 | },
1648 | "yauzl": {
1649 | "version": "2.10.0",
1650 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
1651 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
1652 | "dev": true,
1653 | "requires": {
1654 | "buffer-crc32": "~0.2.3",
1655 | "fd-slicer": "~1.1.0"
1656 | },
1657 | "dependencies": {
1658 | "fd-slicer": {
1659 | "version": "1.1.0",
1660 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
1661 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
1662 | "dev": true,
1663 | "requires": {
1664 | "pend": "~1.2.0"
1665 | }
1666 | }
1667 | }
1668 | }
1669 | }
1670 | }
1671 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "youtube-cypress",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "devDependencies": {
13 | "cypress": "^4.1.0"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/youtube-cypress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samlucax/youtube-cypress/12ae5601592c4c60797b328387c6fe161f298059/youtube-cypress.png
--------------------------------------------------------------------------------