[SIEM] Bootstrap Cypress Tests (#39588)

# Cypress Tests

The `siem/cypress` directory contains end to end tests (specific to the `SIEM` app) that execute via [Cypress](https://www.cypress.io/).

At present, these tests are only executed in a local development environment; they are **not** integrated in the Kibana CI infrastructure, and therefore do **not** run automatically when you submit a PR.

See the `Server and Authentication Requirements` section below for additional details.

## Organizing Tests and (Mock) Data

- Code and CSS selectors that may be re-used across tests should be added to `siem/cypress/integration/lib`, as described below
- Smoke Tests are located in `siem/cypress/integration/smoke_tests`
- Mocked responses from the server are located in `siem/cypress/fixtures`

### `cypress/integration/lib`

The `cypress/integration/lib` folder contains code intended to be re-used across many different tests.

- Files named `helpers.ts` (e.g. `siem/cypress/integration/lib/login/helpers.ts`) contain functions (e.g. `login`) that may be imported and invoked from multiple tests.

- Files named `selectors.ts` export CSS selectors for re-use. For example, `siem/cypress/integration/lib/login/selectors.ts` exports the following selector that matches the Username text area in the Kibana login page:

```
export const USERNAME = '[data-test-subj="loginUsername"]';
```

## Server and Authentication Requirements

The current version of the Smoke Tests require running a local Kibana server that connects to an instance of `elasticsearch`. A file named `config/kibana.dev.yml` like the example below is required to run the tests:

```yaml
elasticsearch:
  username: 'elastic'
  password: '<password>'
  hosts: ['https://<server>:9200']
```

The `username` and `password` from `config/kibana.dev.yml` will be read by the `login` test helper function when tests authenticate with Kibana.

See the `Running Tests Interactively` section for details.

## Running Tests Interactively

To run tests in interactively via the Cypress test runner:

1. Create and configure a `config/kibana.dev.yml`, as described in the `Server and Authentication Requirements` section above.

2. Start a local instance of the Kibana development server:

```
yarn start --no-base-path
```

3. Launch the Cypress interactive test runner:

```sh
cd x-pack/legacy/plugins/siem
yarn cypress:open
```

4. Click the `Run all specs` button in the Cypress test runner

![cypress](https://user-images.githubusercontent.com/4459398/60113545-39c54f00-972f-11e9-9c0c-5d28aecdf212.gif)

https://github.com/elastic/ingest-dev/issues/515
This commit is contained in:
Andrew Goldstein 2019-06-27 17:28:33 -06:00 committed by GitHub
parent 90c89382c2
commit 95fc980203
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 3344 additions and 1871 deletions

File diff suppressed because one or more lines are too long

View file

@ -116,6 +116,7 @@ export default class ClusterManager {
resolve(path, 'target'),
resolve(path, 'scripts'),
resolve(path, 'docs'),
resolve(path, 'legacy/plugins/siem/cypress'),
resolve(path, 'x-pack/legacy/plugins/canvas/canvas_plugin_src') // prevents server from restarting twice for Canvas plugin changes
),
[]

View file

@ -28,6 +28,10 @@ export const PROJECTS = [
new Project(resolve(REPO_ROOT, 'test/tsconfig.json'), 'kibana/test'),
new Project(resolve(REPO_ROOT, 'x-pack/tsconfig.json')),
new Project(resolve(REPO_ROOT, 'x-pack/test/tsconfig.json'), 'x-pack/test'),
new Project(
resolve(REPO_ROOT, 'x-pack/legacy/plugins/siem/cypress/tsconfig.json'),
'siem/cypress'
),
// NOTE: using glob.sync rather than glob-all or globby
// because it takes less than 10 ms, while the other modules

View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,2 @@
videos
screenshots

View file

@ -0,0 +1,61 @@
# Cypress Tests
The `siem/cypress` directory contains end to end tests (specific to the `SIEM` app) that execute via [Cypress](https://www.cypress.io/).
At present, these tests are only executed in a local development environment; they are **not** integrated in the Kibana CI infrastructure, and therefore do **not** run automatically when you submit a PR.
See the `Server and Authentication Requirements` section below for additional details.
## Organizing Tests and (Mock) Data
- Code and CSS selectors that may be re-used across tests should be added to `siem/cypress/integration/lib`, as described below
- Smoke Tests are located in `siem/cypress/integration/smoke_tests`
- Mocked responses from the server are located in `siem/cypress/fixtures`
### `cypress/integration/lib`
The `cypress/integration/lib` folder contains code intended to be re-used across many different tests.
- Files named `helpers.ts` (e.g. `siem/cypress/integration/lib/login/helpers.ts`) contain functions (e.g. `login`) that may be imported and invoked from multiple tests.
- Files named `selectors.ts` export CSS selectors for re-use. For example, `siem/cypress/integration/lib/login/selectors.ts` exports the following selector that matches the Username text area in the Kibana login page:
```
export const USERNAME = '[data-test-subj="loginUsername"]';
```
## Server and Authentication Requirements
The current version of the Smoke Tests require running a local Kibana server that connects to an instance of `elasticsearch`. A file named `config/kibana.dev.yml` like the example below is required to run the tests:
```yaml
elasticsearch:
username: 'elastic'
password: '<password>'
hosts: ['https://<server>:9200']
```
The `username` and `password` from `config/kibana.dev.yml` will be read by the `login` test helper function when tests authenticate with Kibana.
See the `Running Tests Interactively` section for details.
## Running Tests Interactively
To run tests in interactively via the Cypress test runner:
1. Create and configure a `config/kibana.dev.yml`, as described in the `Server and Authentication Requirements` section above.
2. Start a local instance of the Kibana development server:
```
yarn start --no-base-path
```
3. Launch the Cypress interactive test runner:
```sh
cd x-pack/legacy/plugins/siem
yarn cypress:open
```
4. Click the `Run all specs` button in the Cypress test runner

View file

@ -0,0 +1,31 @@
{
"data": {
"source": {
"id": "default",
"OverviewNetwork": {
"auditbeatSocket": 578502,
"filebeatCisco": 999,
"filebeatNetflow": 2544,
"filebeatPanw": 678,
"filebeatSuricata": 303699,
"filebeatZeek": 71129,
"packetbeatDNS": 1090,
"packetbeatFlow": 722153,
"packetbeatTLS": 340,
"__typename": "OverviewNetworkData"
},
"OverviewHost": {
"auditbeatAuditd": 123,
"auditbeatFIM": 345,
"auditbeatLogin": 456,
"auditbeatPackage": 567,
"auditbeatProcess": 678,
"auditbeatUser": 789,
"filebeatSystemModule": 890,
"winlogbeat": 100,
"__typename": "OverviewHostData"
},
"__typename": "Source"
}
}
}

View file

@ -0,0 +1,39 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
const primaryButton = 0;
/**
* To overcome the React Beautiful DND sloppy click detection threshold:
* https://github.com/atlassian/react-beautiful-dnd/blob/67b96c8d04f64af6b63ae1315f74fc02b5db032b/docs/sensors/mouse.md#sloppy-clicks-and-click-prevention-
*/
const dndSloppyClickDetectionThreshold = 5;
/** Starts dragging the subject */
export const drag = (subject: JQuery<HTMLElement>) => {
const subjectLocation = subject[0].getBoundingClientRect();
cy.wrap(subject)
.trigger('mousedown', {
button: primaryButton,
clientX: subjectLocation.left,
clientY: subjectLocation.top,
force: true,
})
.trigger('mousemove', {
button: primaryButton,
clientX: subjectLocation.left + dndSloppyClickDetectionThreshold,
clientY: subjectLocation.top,
force: true,
});
};
/** "Drops" the subject being dragged on the specified drop target */
export const drop = (dropTarget: JQuery<HTMLElement>) => {
cy.wrap(dropTarget)
.trigger('mousemove', { button: primaryButton })
.trigger('mouseup');
};

View file

@ -0,0 +1,19 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// Cypress workaround to hijack XHR
// https://github.com/cypress-io/cypress/issues/687
export const clearFetch = () =>
cy.on('window:before:load', win => {
// @ts-ignore no null, this is a temp hack see issue above
win.fetch = null;
});
export const stubApi = (dataFileName: string) => {
cy.server();
cy.fixture(dataFileName).as(`${dataFileName}JSON`);
cy.route('POST', 'api/siem/graphql', `@${dataFileName}JSON`);
};

View file

@ -0,0 +1,13 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { ALL_HOSTS_WIDGET } from './selectors';
/** Wait this long for the for the `All Hosts` widget on the `Hosts` page to load */
const ALL_HOSTS_TIMEOUT = 10 * 1000;
/** Wait for the for the `All Hosts` widget on the `Hosts` page to load */
export const waitForAllHostsWidget = () => cy.get(ALL_HOSTS_WIDGET, { timeout: ALL_HOSTS_TIMEOUT });

View file

@ -0,0 +1,14 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** The `All Hosts` widget on the `Hosts` page */
export const ALL_HOSTS_WIDGET = '[data-test-subj="all-hosts"]';
/** A single draggable host in the `All Hosts` widget on the `Hosts` page */
export const ALL_HOSTS_WIDGET_HOST = '[data-react-beautiful-dnd-drag-handle]';
/** All the draggable hosts in the `All Hosts` widget on the `Hosts` page */
export const ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS = `${ALL_HOSTS_WIDGET} ${ALL_HOSTS_WIDGET_HOST}`;

View file

@ -0,0 +1,78 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import * as yaml from 'js-yaml';
import { LOGIN_PAGE } from '../urls';
import { DEFAULT_SPACE_BUTTON, PASSWORD, USERNAME } from './selectors';
/**
* The `username` and `password` values in the `elasticsearch` section of this
* file will be used to login to Kibana
*/
const KIBANA_DEV_YML_PATH = '../../../../config/kibana.dev.yml';
/** Wait this long for the login page wait (ms) */
const USERNAME_TIMEOUT = 10 * 1000;
/**
* Authenticates with Kibana by POSTing the username and password directly to
* Kibana's `security/v1/login` endpoint, bypassing the login page (for speed).
*
* To speed the execution of tests, prefer this function over authenticating
* via an interactive login.
*/
export const login = () => {
cy.log(
`NON-interactively logging into Kibana with the \`username\` and \`password\` from the \`elasticsearch\` section of \`${KIBANA_DEV_YML_PATH}\``
);
// read the login details
cy.readFile(KIBANA_DEV_YML_PATH).then(kibanaDevYml => {
const config = yaml.safeLoad(kibanaDevYml);
// programmatically log us in without needing the UI
cy.request({
body: {
username: config.elasticsearch.username,
password: config.elasticsearch.password,
},
followRedirect: false,
headers: { 'kbn-xsrf': 'cypress' },
method: 'POST',
url: 'http://localhost:5601/api/security/v1/login',
});
});
};
/**
* This (slower) login function authenticates with Kibana via the login page.
* To speed the execution of tests, is generally preferable to use the
* NON-interactive `login` function (in this file) instead, because in
* addition to having to wait for the interactive Kibana login page to load,
* this function also waits for the "spaces" page to load after
* authenticating so it can click on the default space.
*/
export const interactiveLogin = () => {
cy.log(
`Interactively logging into Kibana with the \`username\` and \`password\` from the \`elasticsearch\` section of \`${KIBANA_DEV_YML_PATH}\``
);
// read the login details
cy.readFile(KIBANA_DEV_YML_PATH).then(kibanaDevYml => {
const config = yaml.safeLoad(kibanaDevYml);
cy.visit(LOGIN_PAGE);
cy.get(USERNAME, { timeout: USERNAME_TIMEOUT }).type(config.elasticsearch.username);
cy.get(PASSWORD).type(`${config.elasticsearch.password}{enter}`, {
log: false,
});
cy.get(DEFAULT_SPACE_BUTTON).click(); // click the `Default` space in the `Select Your Space` page
});
};

View file

@ -0,0 +1,14 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** The Username field in the Kibana login page */
export const USERNAME = '[data-test-subj="loginUsername"]';
/** The Password field in the Kibana login page */
export const PASSWORD = '[data-test-subj="loginPassword"]';
/** The `Default` space button on the `Select your space` page */
export const DEFAULT_SPACE_BUTTON = '[data-test-subj="space-card-default"]';

View file

@ -0,0 +1,13 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { LOGOUT_LINK, USER_MENU } from './selectors';
export const logout = () => {
cy.get(USER_MENU).click();
cy.get(LOGOUT_LINK).click();
};

View file

@ -0,0 +1,11 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** The avatar / button that represents the logged-in Kibana user */
export const USER_MENU = '[data-test-subj="userMenuButton"]';
/** Clicking this link logs out the currently logged-in Kibana user */
export const LOGOUT_LINK = '[data-test-subj="logoutLink"]';

View file

@ -0,0 +1,17 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** Top-level (global) navigation link to the `Hosts` page */
export const NAVIGATION_HOSTS = '[data-test-subj="navigation-hosts"]';
/** Top-level (global) navigation link to the `Network` page */
export const NAVIGATION_NETWORK = '[data-test-subj="navigation-network"]';
/** Top-level (global) navigation link to the `Overview` page */
export const NAVIGATION_OVERVIEW = '[data-test-subj="navigation-overview"]';
/** Top-level (global) navigation link to the `Timelines` page */
export const NAVIGATION_TIMELINES = '[data-test-subj="navigation-timelines"]';

View file

@ -0,0 +1,100 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// Host Stats
export const STAT_AUDITD = {
value: '123',
domId: '[data-test-subj="host-stat-auditbeatAuditd"]',
};
export const STAT_FILEBEAT = {
value: '890',
domId: '[data-test-subj="host-stat-filebeatSystemModule"]',
};
export const STAT_FIM = {
value: '345',
domId: '[data-test-subj="host-stat-auditbeatFIM"]',
};
export const STAT_LOGIN = {
value: '456',
domId: '[data-test-subj="host-stat-auditbeatLogin"]',
};
export const STAT_PACKAGE = {
value: '567',
domId: '[data-test-subj="host-stat-auditbeatPackage"]',
};
export const STAT_PROCESS = {
value: '678',
domId: '[data-test-subj="host-stat-auditbeatProcess"]',
};
export const STAT_USER = {
value: '789',
domId: '[data-test-subj="host-stat-auditbeatUser"]',
};
export const STAT_WINLOGBEAT = {
value: '100',
domId: '[data-test-subj="host-stat-winlogbeat"]',
};
export const HOST_STATS = [
STAT_AUDITD,
STAT_FILEBEAT,
STAT_FIM,
STAT_LOGIN,
STAT_PACKAGE,
STAT_PROCESS,
STAT_USER,
STAT_WINLOGBEAT,
];
// Network Stats
export const STAT_SOCKET = {
value: '578,502',
domId: '[data-test-subj="network-stat-auditbeatSocket"]',
};
export const STAT_CISCO = {
value: '999',
domId: '[data-test-subj="network-stat-filebeatCisco"]',
};
export const STAT_NETFLOW = {
value: '2,544',
domId: '[data-test-subj="network-stat-filebeatNetflow"]',
};
export const STAT_PANW = {
value: '678',
domId: '[data-test-subj="network-stat-filebeatPanw"]',
};
export const STAT_SURICATA = {
value: '303,699',
domId: '[data-test-subj="network-stat-filebeatSuricata"]',
};
export const STAT_ZEEK = {
value: '71,129',
domId: '[data-test-subj="network-stat-filebeatZeek"]',
};
export const STAT_DNS = {
value: '1,090',
domId: '[data-test-subj="network-stat-packetbeatDNS"]',
};
export const STAT_FLOW = {
value: '722,153',
domId: '[data-test-subj="network-stat-packetbeatFlow"]',
};
export const STAT_TLS = {
value: '340',
domId: '[data-test-subj="network-stat-packetbeatTLS"]',
};
export const NETWORK_STATS = [
STAT_SOCKET,
STAT_CISCO,
STAT_NETFLOW,
STAT_PANW,
STAT_SURICATA,
STAT_ZEEK,
STAT_DNS,
STAT_FLOW,
STAT_TLS,
];

View file

@ -0,0 +1,31 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { drag, drop } from '../drag_n_drop/helpers';
import { ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS } from '../hosts/selectors';
import { TIMELINE_DATA_PROVIDERS, TIMELINE_TOGGLE_BUTTON } from './selectors';
/** Wait up to this many ms for the timeline to render data providers that were dropped in the timeline */
export const TIMELINE_RENDER_DATA_PROVIDERS_TIMEOUT = 10 * 1000;
/** Toggles the timeline's open / closed state by clicking the `T I M E L I N E` button */
export const toggleTimelineVisibility = () =>
cy
.get(TIMELINE_TOGGLE_BUTTON)
.first()
.click();
/** Drags and drops a host from the `All Hosts` widget on the `Hosts` page to the timeline */
export const dragFromAllHostsToTimeline = () => {
cy.get(ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS)
.first()
.then(host => drag(host));
cy.get(TIMELINE_DATA_PROVIDERS)
.first()
.then(dataProvidersDropArea => drop(dataProvidersDropArea));
};

View file

@ -0,0 +1,17 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** A data provider rendered in the timeline's data providers drop area */
export const DATA_PROVIDER = '[data-test-subj="providerContainer"]';
/** Data providers are dropped and rendered in this area of the timeline */
export const TIMELINE_DATA_PROVIDERS = '[data-test-subj="dataProviders"]';
/** Data providers that were dropped on a timeline */
export const TIMELINE_DROPPED_DATA_PROVIDERS = `${TIMELINE_DATA_PROVIDERS} ${DATA_PROVIDER}`;
/** The `T I M E L I N E` button that toggles visibility of the Timeline */
export const TIMELINE_TOGGLE_BUTTON = '[data-test-subj="flyoutOverlay"]';

View file

@ -0,0 +1,20 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
/** The SIEM app's Hosts page */
export const HOSTS_PAGE = 'http://localhost:5601/app/siem#/hosts';
/** Kibana's login page */
export const LOGIN_PAGE = 'http://localhost:5601/login';
/** The SIEM app's Network page */
export const NETWORK_PAGE = 'http://localhost:5601/app/siem#/network';
/** The SIEM app's Overview page */
export const OVERVIEW_PAGE = 'http://localhost:5601/app/siem#/overview';
/** The SIEM app's Timelines page */
export const TIMELINES_PAGE = 'http://localhost:5601/app/siem#/timelines';

View file

@ -0,0 +1,23 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { login } from '../login/helpers';
const KIBANA_LOGO_TIMEOUT = 10 * 1000;
/**
* Authenticates with Kibana, visits the specified `url`, and waits for the
* Kibana logo to be displayed before continuing
*/
export const loginAndWaitForPage = (url: string) => {
login();
cy.visit(url);
cy.viewport('macbook-15');
cy.contains('a', 'SIEM', { timeout: KIBANA_LOGO_TIMEOUT });
};

View file

@ -0,0 +1,53 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { logout } from '../../lib/logout';
import { HOSTS_PAGE, NETWORK_PAGE, OVERVIEW_PAGE, TIMELINES_PAGE } from '../../lib/urls';
import {
NAVIGATION_HOSTS,
NAVIGATION_NETWORK,
NAVIGATION_OVERVIEW,
NAVIGATION_TIMELINES,
} from '../../lib/navigation/selectors';
import { loginAndWaitForPage } from '../../lib/util/helpers';
describe('top-level navigation common to all pages in the SIEM app', () => {
afterEach(() => {
logout();
});
it('navigates to the Overview page', () => {
loginAndWaitForPage(TIMELINES_PAGE);
cy.get(NAVIGATION_OVERVIEW).click({ force: true });
cy.url().should('include', '/siem#/overview');
});
it('navigates to the Hosts page', () => {
loginAndWaitForPage(NETWORK_PAGE);
cy.get(NAVIGATION_HOSTS).click({ force: true });
cy.url().should('include', '/siem#/hosts');
});
it('navigates to the Network page', () => {
loginAndWaitForPage(HOSTS_PAGE);
cy.get(NAVIGATION_NETWORK).click({ force: true });
cy.url().should('include', '/siem#/network');
});
it('navigates to the Timelines page', () => {
loginAndWaitForPage(OVERVIEW_PAGE);
cy.get(NAVIGATION_TIMELINES).click({ force: true });
cy.url().should('include', '/siem#/timelines');
});
});

View file

@ -0,0 +1,43 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { logout } from '../../lib/logout';
import { OVERVIEW_PAGE } from '../../lib/urls';
import { clearFetch, stubApi } from '../../lib/fixtures/helpers';
import { HOST_STATS, NETWORK_STATS, STAT_AUDITD } from '../../lib/overview/selectors';
import { loginAndWaitForPage } from '../../lib/util/helpers';
describe('Overview Page', () => {
beforeEach(() => {
clearFetch();
stubApi('overview');
loginAndWaitForPage(OVERVIEW_PAGE);
});
afterEach(() => {
logout();
});
it('Host and Network stats render with correct values', () => {
cy.get(STAT_AUDITD.domId);
HOST_STATS.forEach(stat => {
cy.get(stat.domId)
.invoke('text')
.should(statValue => {
expect(statValue).to.eq(stat.value);
});
});
NETWORK_STATS.forEach(stat => {
cy.get(stat.domId)
.invoke('text')
.should(statValue => {
expect(statValue).to.eq(stat.value);
});
});
});
});

View file

@ -0,0 +1,51 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { logout } from '../../lib/logout';
import { TIMELINE_DROPPED_DATA_PROVIDERS } from '../../lib/timeline/selectors';
import {
dragFromAllHostsToTimeline,
TIMELINE_RENDER_DATA_PROVIDERS_TIMEOUT,
toggleTimelineVisibility,
} from '../../lib/timeline/helpers';
import { ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS } from '../../lib/hosts/selectors';
import { HOSTS_PAGE } from '../../lib/urls';
import { waitForAllHostsWidget } from '../../lib/hosts/helpers';
import { loginAndWaitForPage } from '../../lib/util/helpers';
describe('timeline data providers', () => {
beforeEach(() => {
loginAndWaitForPage(HOSTS_PAGE);
});
afterEach(() => {
logout();
});
// eslint-disable-next-line ban/ban
it('renders the data provider of a host dragged from the All Hosts widget on the hosts page', () => {
waitForAllHostsWidget();
toggleTimelineVisibility();
dragFromAllHostsToTimeline();
cy.get(TIMELINE_DROPPED_DATA_PROVIDERS, {
timeout: TIMELINE_RENDER_DATA_PROVIDERS_TIMEOUT,
})
.first()
.invoke('text')
.then(dataProviderText => {
// verify the data provider displays the same `host.name` as the host dragged from the `All Hosts` widget
cy.get(ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS)
.first()
.invoke('text')
.should(hostname => {
expect(dataProviderText).to.eq(`host.name: "${hostname}"`);
});
});
});
});

View file

@ -0,0 +1,40 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
// eslint-disable-next-line import/no-extraneous-dependencies
const wp = require('@cypress/webpack-preprocessor');
module.exports = on => {
const options = {
webpackOptions: {
resolve: {
extensions: ['.ts', '.tsx', '.js'],
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
options: { transpileOnly: true },
},
],
},
},
};
on('file:preprocessor', wp(options));
};

View file

@ -0,0 +1,31 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This is will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })

View file

@ -0,0 +1,26 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands';
// Alternatively you can use CommonJS syntax:
// require('./commands')

View file

@ -0,0 +1,13 @@
{
"extends": "../../../../tsconfig.json",
"exclude": [],
"include": [
"./**/*"
],
"compilerOptions": {
"types": [
"cypress",
"node"
]
}
}

View file

@ -5,11 +5,17 @@
"private": true,
"license": "Elastic-License",
"scripts": {
"build-graphql-types": "node scripts/generate_types_from_graphql.js"
"build-graphql-types": "node scripts/generate_types_from_graphql.js",
"cypress:open": "cypress open"
},
"devDependencies": {
"@cypress/webpack-preprocessor": "^4.1.0",
"@types/js-yaml": "^3.12.1",
"@types/lodash": "^4.14.110",
"@types/react-beautiful-dnd": "^10.0.1"
"@types/react-beautiful-dnd": "^10.0.1",
"cypress": "^3.3.1",
"js-yaml": "^3.13.1",
"ts-loader": "^6.0.4"
},
"dependencies": {
"lodash": "^4.17.10",

View file

@ -25,6 +25,8 @@ import { LoadingPanel } from '../loading';
import * as i18n from './translations';
const DEFAULT_DATA_TEST_SUBJ = 'load-more-table';
export interface ItemsPerRow {
text: string;
numberOfRow: number;
@ -73,6 +75,7 @@ interface BasicTableProps<T, U = T, V = T, W = T, X = T, Y = T, Z = T, AA = T, A
Columns<AB>
];
hasNextPage: boolean;
dataTestSubj?: string;
headerCount: number;
headerSupplement?: React.ReactElement;
headerTitle: string | React.ReactElement;
@ -133,6 +136,7 @@ export class LoadMoreTable<T, U, V, W, X, Y, Z, AA, AB> extends React.PureCompon
public render() {
const {
columns,
dataTestSubj = DEFAULT_DATA_TEST_SUBJ,
hasNextPage,
headerCount,
headerSupplement,
@ -190,7 +194,7 @@ export class LoadMoreTable<T, U, V, W, X, Y, Z, AA, AB> extends React.PureCompon
</EuiContextMenuItem>
));
return (
<EuiPanel>
<EuiPanel data-test-subj={dataTestSubj}>
<BasicTableContainer>
{loading && (
<>

View file

@ -116,6 +116,7 @@ class HostsTableComponent extends React.PureComponent<HostsTableProps> {
return (
<LoadMoreTable
columns={this.memoizedColumns(type, indexPattern)}
dataTestSubj="all-hosts"
hasNextPage={hasNextPage}
headerCount={totalCount}
headerTitle={i18n.HOSTS}

View file

@ -23,16 +23,16 @@ describe('Overview Host Stat Data', () => {
const wrapper = shallow(<OverviewHostStats data={mockData.OverviewHost} loading={false} />);
const loadingWrapper = wrapper
.dive()
.find('[data-test-subj="stat-loader-description"]')
.find('[data-test-subj="host-stat-auditbeatAuditd"]')
.first()
.childAt(0);
expect(loadingWrapper.prop('isLoading')).toBe(false);
});
test('it does show loading indicator when not loading', () => {
test('it does show loading indicator when loading', () => {
const wrapper = shallow(<OverviewHostStats data={mockData.OverviewHost} loading={true} />);
const loadingWrapper = wrapper
.dive()
.find('[data-test-subj="stat-loader-description"]')
.find('[data-test-subj="host-stat-auditbeatAuditd"]')
.first()
.childAt(0);
expect(loadingWrapper.prop('isLoading')).toBe(true);

View file

@ -37,6 +37,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat Audit"
/>
),
id: 'auditbeatAuditd',
},
{
description:
@ -49,6 +50,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat File Integrity Module"
/>
),
id: 'auditbeatFIM',
},
{
description:
@ -61,6 +63,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat Login"
/>
),
id: 'auditbeatLogin',
},
{
description:
@ -73,6 +76,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat Package"
/>
),
id: 'auditbeatPackage',
},
{
description:
@ -85,6 +89,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat Process"
/>
),
id: 'auditbeatProcess',
},
{
description:
@ -97,6 +102,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Auditbeat User"
/>
),
id: 'auditbeatUser',
},
{
description:
@ -109,6 +115,7 @@ const overviewHostStats = (data: OverviewHostData) => [
defaultMessage="Filebeat System Module"
/>
),
id: 'filebeatSystemModule',
},
{
description:
@ -118,6 +125,7 @@ const overviewHostStats = (data: OverviewHostData) => [
title: (
<FormattedMessage id="xpack.siem.overview.winlogbeatTitle" defaultMessage="Winlogbeat" />
),
id: 'winlogbeat',
},
];
@ -136,7 +144,7 @@ export const OverviewHostStats = pure<OverviewHostProps>(({ data, loading }) =>
{overviewHostStats(data).map((item, index) => (
<React.Fragment key={index}>
<EuiDescriptionListTitle>{item.title}</EuiDescriptionListTitle>
<DescriptionListDescription data-test-subj="stat-loader-description">
<DescriptionListDescription data-test-subj={`host-stat-${item.id}`}>
<StatValue isLoading={loading} value={item.description} />
</DescriptionListDescription>
</React.Fragment>

View file

@ -25,9 +25,10 @@ describe('Overview Network Stat Data', () => {
const wrapper = shallow(
<OverviewNetworkStats data={mockData.OverviewNetwork} loading={false} />
);
const loadingWrapper = wrapper
.dive()
.find('[data-test-subj="stat-loader-description"]')
.find('[data-test-subj="network-stat-auditbeatSocket"]')
.first()
.childAt(0);
expect(loadingWrapper.prop('isLoading')).toBe(false);
@ -38,7 +39,7 @@ describe('Overview Network Stat Data', () => {
);
const loadingWrapper = wrapper
.dive()
.find('[data-test-subj="stat-loader-description"]')
.find('[data-test-subj="network-stat-auditbeatSocket"]')
.first()
.childAt(0);
expect(loadingWrapper.prop('isLoading')).toBe(true);

View file

@ -37,6 +37,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Auditbeat Socket"
/>
),
id: 'auditbeatSocket',
},
{
description:
@ -49,6 +50,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Filebeat Cisco"
/>
),
id: 'filebeatCisco',
},
{
description:
@ -61,6 +63,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Filebeat Netflow"
/>
),
id: 'filebeatNetflow',
},
{
description:
@ -73,6 +76,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Filebeat Palo Alto Network"
/>
),
id: 'filebeatPanw',
},
{
description:
@ -85,6 +89,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Filebeat Suricata"
/>
),
id: 'filebeatSuricata',
},
{
description:
@ -94,6 +99,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
title: (
<FormattedMessage id="xpack.siem.overview.fileBeatZeekTitle" defaultMessage="Filebeat Zeek" />
),
id: 'filebeatZeek',
},
{
description:
@ -106,6 +112,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Packetbeat DNS"
/>
),
id: 'packetbeatDNS',
},
{
description:
@ -118,6 +125,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Packetbeat Flow"
/>
),
id: 'packetbeatFlow',
},
{
description:
@ -130,6 +138,7 @@ const overviewNetworkStats = (data: OverviewNetworkData) => [
defaultMessage="Packetbeat TLS"
/>
),
id: 'packetbeatTLS',
},
];
@ -148,7 +157,7 @@ export const OverviewNetworkStats = pure<OverviewNetworkProps>(({ data, loading
{overviewNetworkStats(data).map((item, index) => (
<React.Fragment key={index}>
<EuiDescriptionListTitle>{item.title}</EuiDescriptionListTitle>
<DescriptionListDescription data-test-subj="stat-loader-description">
<DescriptionListDescription data-test-subj={`network-stat-${item.id}`}>
<StatValue isLoading={loading} value={item.description} />
</DescriptionListDescription>
</React.Fragment>

View file

@ -10,6 +10,7 @@
],
"exclude": [
"test/**/*",
"legacy/plugins/siem/cypress/**/*",
"**/typespec_tests.ts"
],
"compilerOptions": {

314
yarn.lock
View file

@ -55,7 +55,7 @@
semver "^5.4.1"
source-map "^0.5.0"
"@babel/core@7.4.5", "@babel/core@^7.4.3":
"@babel/core@7.4.5", "@babel/core@^7.0.1", "@babel/core@^7.4.3":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a"
integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==
@ -1271,7 +1271,7 @@
js-levenshtein "^1.1.3"
semver "^5.3.0"
"@babel/preset-env@7.4.5", "@babel/preset-env@^7.4.3":
"@babel/preset-env@7.4.5", "@babel/preset-env@^7.0.0", "@babel/preset-env@^7.4.3":
version "7.4.5"
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58"
integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==
@ -1546,6 +1546,36 @@
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@cypress/listr-verbose-renderer@0.4.1":
version "0.4.1"
resolved "https://registry.yarnpkg.com/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#a77492f4b11dcc7c446a34b3e28721afd33c642a"
integrity sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=
dependencies:
chalk "^1.1.3"
cli-cursor "^1.0.2"
date-fns "^1.27.2"
figures "^1.7.0"
"@cypress/webpack-preprocessor@^4.1.0":
version "4.1.0"
resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.0.tgz#8c4debc0b1abf045b62524d1996dd9aeaf7e86a8"
integrity sha512-LbxsdYVpHGoC2fMOdW0aQvuvVRD7aZx8p8DrP53HISpl7bD1PqLGWKzhHn7cGG24UHycBJrbaEeKEosW29W1dg==
dependencies:
bluebird "3.5.0"
debug "3.1.0"
optionalDependencies:
"@babel/core" "^7.0.1"
"@babel/preset-env" "^7.0.0"
babel-loader "^8.0.2"
"@cypress/xvfb@1.2.4":
version "1.2.4"
resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a"
integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==
dependencies:
debug "^3.1.0"
lodash.once "^4.1.1"
"@elastic/charts@^7.0.1":
version "7.0.1"
resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-7.0.1.tgz#0ddc6d5444def8ed5d45c4113359c311e1e15fb7"
@ -3714,7 +3744,7 @@
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.11.2.tgz#699ad86054cc20043c30d66a6fcde30bbf5d3d5e"
integrity sha512-JRDtMPEqXrzfuYAdqbxLot1GvAr/QvicIZAnOAigZaj8xVMhuSJTg/xsv9E1TvyL+wujYhRLx9ZsQ0oFOSmwyA==
"@types/js-yaml@^3.11.2":
"@types/js-yaml@^3.11.2", "@types/js-yaml@^3.12.1":
version "3.12.1"
resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656"
integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==
@ -5330,6 +5360,11 @@ aproba@^1.0.3, aproba@^1.1.1:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
arch@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e"
integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==
archiver-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.0.0.tgz#5639818a8b5d89d0ffc51b72c39283cf4fea14a1"
@ -5780,6 +5815,13 @@ async@2.4.0:
dependencies:
lodash "^4.14.0"
async@2.6.1, async@^2.5.0, async@^2.6.0, async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
dependencies:
lodash "^4.17.10"
async@^2.0.0, async@^2.1.4:
version "2.6.0"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
@ -5787,13 +5829,6 @@ async@^2.0.0, async@^2.1.4:
dependencies:
lodash "^4.14.0"
async@^2.5.0, async@^2.6.0, async@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
dependencies:
lodash "^4.17.10"
async@~0.2.9:
version "0.2.10"
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
@ -6015,7 +6050,7 @@ babel-loader@8.0.5:
mkdirp "^0.5.1"
util.promisify "^1.0.0"
babel-loader@8.0.6:
babel-loader@8.0.6, babel-loader@^8.0.2:
version "8.0.6"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==
@ -6633,6 +6668,11 @@ bluebird@3.4.6:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f"
integrity sha1-AdqNgh2HgT0ViWfnQ9X+bGLPjA8=
bluebird@3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
integrity sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=
bluebird@3.5.5, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.3:
version "3.5.5"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
@ -6857,7 +6897,7 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2:
split-string "^3.0.2"
to-regex "^3.0.1"
braces@^3.0.2:
braces@^3.0.1, braces@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@ -7249,6 +7289,13 @@ cacheable-request@^2.1.1:
normalize-url "2.0.1"
responselike "1.0.2"
cachedir@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.3.0.tgz#5e01928bf2d95b5edd94b0942188246740e0dbc4"
integrity sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==
dependencies:
os-homedir "^1.0.1"
call-me-maybe@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
@ -7632,6 +7679,11 @@ check-error@^1.0.2:
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
check-more-types@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=
checksum@0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/checksum/-/checksum-0.1.1.tgz#dc6527d4c90be8560dbd1ed4cecf3297d528e9e9"
@ -7769,6 +7821,11 @@ ci-info@^1.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4"
integrity sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==
ci-info@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@ -8267,6 +8324,11 @@ commander@2, commander@2.19.0, commander@^2.11.0, commander@^2.12.2, commander@^
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
commander@2.15.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
commander@2.17.x, commander@~2.17.1:
version "2.17.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
@ -9209,6 +9271,43 @@ cyclist@~0.2.2:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=
cypress@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.3.1.tgz#8a127b1d9fa74bff21f111705abfef58d595fdef"
integrity sha512-JIo47ZD9P3jAw7oaK7YKUoODzszJbNw41JmBrlMMiupHOlhmXvZz75htuo7mfRFPC9/1MDQktO4lX/V2+a6lGQ==
dependencies:
"@cypress/listr-verbose-renderer" "0.4.1"
"@cypress/xvfb" "1.2.4"
arch "2.1.1"
bluebird "3.5.0"
cachedir "1.3.0"
chalk "2.4.2"
check-more-types "2.24.0"
commander "2.15.1"
common-tags "1.8.0"
debug "3.2.6"
execa "0.10.0"
executable "4.1.1"
extract-zip "1.6.7"
fs-extra "4.0.1"
getos "3.1.1"
glob "7.1.3"
is-ci "1.2.1"
is-installed-globally "0.1.0"
lazy-ass "1.6.0"
listr "0.12.0"
lodash "4.17.11"
log-symbols "2.2.0"
minimist "1.2.0"
moment "2.24.0"
ramda "0.24.1"
request "2.88.0"
request-progress "0.4.0"
supports-color "5.5.0"
tmp "0.1.0"
url "0.11.0"
yauzl "2.10.0"
d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0, d3-array@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f"
@ -9562,7 +9661,7 @@ debug@3.1.0, debug@=3.1.0, debug@~3.1.0:
dependencies:
ms "2.0.0"
debug@3.X, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
debug@3.2.6, debug@3.X, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@ -10661,7 +10760,7 @@ engine.io@~3.2.0:
engine.io-parser "~2.1.0"
ws "~3.3.1"
enhanced-resolve@^4.1.0:
enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==
@ -11473,16 +11572,7 @@ exec-sh@^0.2.0:
dependencies:
merge "^1.1.3"
execa@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.1.1.tgz#b09c2a9309bc0ef0501479472db3180f8d4c3edd"
integrity sha1-sJwqkwm8DvBQFHlHLbMYD41MPt0=
dependencies:
cross-spawn-async "^2.1.1"
object-assign "^4.0.1"
strip-eof "^1.0.0"
execa@^0.10.0:
execa@0.10.0, execa@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
@ -11495,6 +11585,15 @@ execa@^0.10.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.1.1.tgz#b09c2a9309bc0ef0501479472db3180f8d4c3edd"
integrity sha1-sJwqkwm8DvBQFHlHLbMYD41MPt0=
dependencies:
cross-spawn-async "^2.1.1"
object-assign "^4.0.1"
strip-eof "^1.0.0"
execa@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3"
@ -11553,6 +11652,13 @@ execall@^1.0.0:
dependencies:
clone-regexp "^1.0.0"
executable@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
dependencies:
pify "^2.2.0"
exenv@^1.2.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
@ -12671,6 +12777,15 @@ fs-exists-sync@^0.1.0:
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
fs-extra@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880"
integrity sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=
dependencies:
graceful-fs "^4.1.2"
jsonfile "^3.0.0"
universalify "^0.1.0"
fs-extra@^0.30.0:
version "0.30.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
@ -13013,6 +13128,13 @@ getopts@^2.2.4:
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.4.tgz#3137fe8a5fddf304904059a851bdc1c22f0f54fb"
integrity sha512-Rz7DGyomZjrenu9Jx4qmzdlvJgvrEFHXHvjK0FcZtcTC1U5FmES7OdZHUwMuSnEE6QvBvwse1JODKj7TgbSEjQ==
getos@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.1.tgz#967a813cceafee0156b0483f7cffa5b3eff029c5"
integrity sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==
dependencies:
async "2.6.1"
getos@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567"
@ -15450,6 +15572,13 @@ is-callable@^1.1.3, is-callable@^1.1.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
is-ci@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
dependencies:
ci-info "^1.5.0"
is-ci@^1.0.10:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5"
@ -15625,7 +15754,7 @@ is-hexadecimal@^1.0.0:
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69"
integrity sha1-bghLvJIGH7sJcexYts5tQE4k2mk=
is-installed-globally@^0.1.0:
is-installed-globally@0.1.0, is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
@ -17304,6 +17433,11 @@ latest-version@^3.0.0, latest-version@^3.1.0:
dependencies:
package-json "^4.0.0"
lazy-ass@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513"
integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM=
lazy-cache@^0.2.3:
version "0.2.7"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
@ -17486,6 +17620,20 @@ listr-silent-renderer@^1.1.1:
resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=
listr-update-renderer@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9"
integrity sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=
dependencies:
chalk "^1.1.3"
cli-truncate "^0.2.1"
elegant-spinner "^1.0.1"
figures "^1.7.0"
indent-string "^3.0.0"
log-symbols "^1.0.2"
log-update "^1.0.2"
strip-ansi "^3.0.1"
listr-update-renderer@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
@ -17510,6 +17658,28 @@ listr-verbose-renderer@^0.4.0:
date-fns "^1.27.2"
figures "^1.7.0"
listr@0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a"
integrity sha1-a84sD1YD+klYDqF81qAMwOX6RRo=
dependencies:
chalk "^1.1.3"
cli-truncate "^0.2.1"
figures "^1.7.0"
indent-string "^2.1.0"
is-promise "^2.1.0"
is-stream "^1.1.0"
listr-silent-renderer "^1.1.1"
listr-update-renderer "^0.2.0"
listr-verbose-renderer "^0.4.0"
log-symbols "^1.0.2"
log-update "^1.0.2"
ora "^0.2.3"
p-map "^1.1.1"
rxjs "^5.0.0-beta.11"
stream-to-observable "^0.1.0"
strip-ansi "^3.0.1"
listr@^0.14.1:
version "0.14.1"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
@ -17947,7 +18117,7 @@ lodash.omitby@^4.6.0:
resolved "https://registry.yarnpkg.com/lodash.omitby/-/lodash.omitby-4.6.0.tgz#5c15ff4754ad555016b53c041311e8f079204791"
integrity sha1-XBX/R1StVVAWtTwEExHo8HkgR5E=
lodash.once@^4.0.0:
lodash.once@^4.0.0, lodash.once@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
@ -18105,7 +18275,7 @@ lodash.uniqby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=
lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.5:
lodash@4.17.11, lodash@>4.17.4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.5:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@ -18138,6 +18308,13 @@ log-ok@^0.1.1:
ansi-green "^0.1.1"
success-symbol "^0.1.0"
log-symbols@2.2.0, log-symbols@^2.1.0, log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
dependencies:
chalk "^2.0.1"
log-symbols@^1.0.1, log-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
@ -18145,13 +18322,6 @@ log-symbols@^1.0.1, log-symbols@^1.0.2:
dependencies:
chalk "^1.0.0"
log-symbols@^2.1.0, log-symbols@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
dependencies:
chalk "^2.0.1"
log-update@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
@ -18758,6 +18928,14 @@ micromatch@^2.3.11:
parse-glob "^3.0.4"
regex-cache "^0.4.2"
micromatch@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
dependencies:
braces "^3.0.1"
picomatch "^2.0.5"
miller-rabin@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@ -19117,6 +19295,11 @@ moment@2.22.2, moment@>=2.14.0:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=
moment@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
"moment@>= 2.9.0", moment@^2.13.0, moment@^2.20.1:
version "2.20.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
@ -19468,6 +19651,11 @@ node-ensure@^0.0.0:
resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=
node-eta@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/node-eta/-/node-eta-0.1.1.tgz#4066109b39371c761c72b7ebda9a9ea0a5de121f"
integrity sha1-QGYQmzk3HHYccrfr2pqeoKXeEh8=
node-fetch@1.7.3, node-fetch@^1.0.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
@ -20284,7 +20472,7 @@ os-browserify@^0.3.0:
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
os-homedir@^1.0.0:
os-homedir@^1.0.0, os-homedir@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
@ -21036,7 +21224,7 @@ phin@^2.9.1:
resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
picomatch@^2.0.4:
picomatch@^2.0.4, picomatch@^2.0.5:
version "2.0.7"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
@ -21046,7 +21234,7 @@ pify@4.0.1, pify@^4.0.0, pify@^4.0.1:
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
pify@^2.0.0, pify@^2.3.0:
pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
@ -22025,6 +22213,11 @@ railroad-diagrams@^1.0.0:
resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
integrity sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=
ramda@0.24.1:
version "0.24.1"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857"
integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc=
ramda@^0.21.0:
version "0.21.0"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35"
@ -23689,6 +23882,14 @@ replace-ext@1.0.0, replace-ext@^1.0.0:
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
request-progress@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-0.4.0.tgz#c1954e39086aa85269c5660bcee0142a6a70d7e7"
integrity sha1-wZVOOQhqqFJpxWYLzuAUKmpw1+c=
dependencies:
node-eta "^0.1.1"
throttleit "^0.0.2"
request-promise-core@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
@ -24248,7 +24449,7 @@ rx@^4.1.0:
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=
rxjs@^5.5.0, rxjs@^5.5.2:
rxjs@^5.0.0-beta.11, rxjs@^5.5.0, rxjs@^5.5.2:
version "5.5.12"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
@ -25511,6 +25712,11 @@ stream-stream@^1.2.6:
resolved "https://registry.yarnpkg.com/stream-stream/-/stream-stream-1.2.6.tgz#a9ae071c64c11b8584f52973f7715e37e5144c43"
integrity sha1-qa4HHGTBG4WE9Slz93FeN+UUTEM=
stream-to-observable@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe"
integrity sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=
streamroller@0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b"
@ -25929,6 +26135,13 @@ supports-color@3.1.2:
dependencies:
has-flag "^1.0.0"
supports-color@5.5.0, supports-color@^5.0.0, supports-color@^5.4.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a"
@ -25946,13 +26159,6 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3:
dependencies:
has-flag "^1.0.0"
supports-color@^5.0.0, supports-color@^5.4.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^5.2.0, supports-color@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
@ -26368,6 +26574,11 @@ throat@^4.0.0:
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
throttleit@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
integrity sha1-z+34jmDADdlpe2H90qg0OptoDq8=
through2-filter@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
@ -26829,6 +27040,17 @@ ts-invariant@^0.4.0:
dependencies:
tslib "^1.9.3"
ts-loader@^6.0.4:
version "6.0.4"
resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63"
integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g==
dependencies:
chalk "^2.3.0"
enhanced-resolve "^4.0.0"
loader-utils "^1.0.2"
micromatch "^4.0.0"
semver "^6.0.0"
ts-log@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.1.3.tgz#9e30aca1baffe7693a2e4142b8f07ecb01cb8340"
@ -27857,7 +28079,7 @@ url-to-options@^1.0.1:
resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=
url@^0.11.0:
url@0.11.0, url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=